磁盘扇区、IO块、inode、文件、目录、硬链接与软链接到底是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了磁盘扇区、IO块、inode、文件、目录、硬链接与软链接到底是啥?相关的知识,希望对你有一定的参考价值。

参考技术A 磁盘扇区、IO块、inode、文件、目录、硬链接与软链接到底是什么?
自己理解了一下,记录一下备忘。

1、扇区
扇区是磁盘盘片上的一个物理划分,是真真实实存在看得见摸得着的东西。
我们先来看看如何查看一个磁盘的一些信息,可以使用fdisk -l命令查看。我这里有多块盘,但我只截图了一个在这里展示,如图所示,我截取的这块盘为/dev/sda。

看红框所示,Unit是单元的意思,sector是扇区的意思。即磁盘的存储单元是扇区。
从图中第一行还可以看到这块盘的大小为599.6G,总共有1171062784个扇区。
从第二行可以看到每个扇区的大小为512bytes。
从第三行可以看到扇区的逻辑大小为512bytes,物理大小为512bytes。

从上图的帮助文档来看,扇区的逻辑大小可以修改,最小为512bytes,最大为4096bytes。(不同的系统,扇区的大小不一样)

除了扇区,磁盘还有哪些物理部件?

2、IO块(磁盘块)
我们平时常说磁盘块,可能会以为它是磁盘的一个物理分区,其实不是的。
扇区是磁盘存储的最小单元。往大了说,还有磁道、盘片等。
那既然磁盘块不是磁盘的物理分区,那么它是啥呀?
我们或许都有这样一个常识认知,就是磁盘的IO速率是非常慢的,如果在读取数据的时候,先读取了一个扇区的数据,发送给上层应用后,又返回来读下一个扇区,再发送给上层应用,如此循环反复,上层应用需要与磁盘进行多次交互,这就很浪费时间了;
所以就引入了磁盘块这么一个概念,它在逻辑层面将多个连续的扇区当作一个整体,然后在读取数据的时候以逻辑层面上的磁盘块为单位,将磁盘块所包含的扇区的数据都一次性读出来发给上层应用。
所以我们要区分开扇区、磁盘块这些概念所对应的对象是不同的:
扇区对应的是硬件层面,它是磁盘面的区域划分,是一个真真实实存在的物理部件;
而磁盘块对应的是软件层面,它在逻辑层面将多个连续的扇区当作一个整体。

比如磁盘扇区大小一般为512字节,而块大小一般为4096字节,那么每一个块就记录着连续的8个扇区;数据不是存在块里的,而是存储在扇区,而块记录哪些扇区是属于自己的。

如何查看一个IO块的大小:
1)在root用户下,执行tune2fs -l /dev/sda | grep "Block Size"

3、inode
每个文件都有数据以及元数据,数据就是文件内容了,它存储在磁盘的数据区;
而文件元数据包括下图这些项:
文件大小、文件块信息、一个块的大小、文件类型(普通文件、目录还是符号链接)、设备号、索引节点编号、硬链接数、文件的访问时间、文件内容的修改时间、文件属性的修改时间

每个文件都会对应一个inode,而每个inode都有唯一一个编号,如何查看文件的inode编号呢?
1)可以使用stat filename来查看
2)或者切换到文件所在目录后,使用ll -i命令来查看,得到的结果中第一列即为文件的inode编号。

我们刚才说到每个索引节点(inode)都有一个唯一的编号,这个编号在每个磁盘上都是有限的,当inode编号分配完了之后,就不能再创建新文件了;
因为文件都需要对应一个唯一的inode,而每个inode又需要对应唯一的编号,而编号又是有限的,所以当分配完了之后,就没法创建inode了,也就没法创建文件了。

有时候可能会发现这样的现象:就是我们想要创建一个新文件,但是发现创建不了了。
于是我们需要排查问题,怎么排查呢?
首先我们先看下是不是磁盘写满了,使用df -hl查看磁盘的使用率,如果达到了100%,那说明盘写满了,我们需要删除些东西以释放存储空间;
但是如果我们查看了磁盘使用率之后,发现不是磁盘满了,磁盘还有很多空闲的空间,那该怎么办?
可以联想到我们上面说过的,看下inode编号是不是用完了,即看下inode编号的使用率?
可以使用df -i来看下磁盘inode编号的使用率,如果发现是inode编号的使用率达到了100%了,那还是得删除些文件以释放占用的inode编号。

会不会有人有疑问?为什么磁盘空间还有这么多,inode编号就用完了?
这大概率是创建的小文件太多了,你想啊,每个文件都要对应一个inode编号,inode编号是有限的,虽然磁盘空间也有限,但是如果文件系统中是以小文件居多,每个文件就占那么点空间,inode编号的消耗速率大于磁盘空间的消耗速率,这就极有可能出现上述inode编号用完了,但是磁盘空间还剩余很多的情况。

4、文件与目录
在linux系统中,一切皆文件。
在linux中怎么判断是文件还是目录呢?
1)通过ll命令判断:
如果开头是d,那就是目录(d即directory的缩写),如果开头是-,那就是普通文件。

2)通过stat命令判断:

5、硬链接与软链接
当我们创建一个文件时,该文件的文件名其实就是一个硬链接,一个文件至少有一个硬链接,但是一个硬链接不可以指向多个文件。
硬链接有什么作用:文件系统通过硬链接可以找到inode编号,进而找到inode,通过获取inode里存储的文件元数据可以读取到磁盘中存储的文件数据。
怎么查看文件的硬链接数呢?
1)通过ll查看:
第二列即为硬链接数

有没有注意到,普通文件的硬链接数与目录的硬链接数是不一样的,普通文件只有一个硬链接,而目录则有两个,这是为什么?
因为对于目录文件而言,除了可以通过目录名获取到文件的inode之外,还可以通过.(点号)获取,因为点号表示当前目录。
所以我们看到目录的硬链接数是2个。
2)还可以通过stat查看文件的硬链接数:

软链接是什么?软链接其实是一个独立的文件(分类为符号链接),它有自己的inode,它的inode里存储的是它所指向的文件的信息;由于软链接与它指向的文件是两个独立的文件,所以删除软链接并不会影响它指向的文件。
通过ln -s 123 softlink123建立一个软链接指向文件123

通过stat softlink123可以看到该文件是一个符号链接,即软链接,它有自己的inode,所以它是一个独立的文件,由于它的inode里存储的是它指向的文件的信息,所以通过软链接softlink123也可以读取到文件123的数据

可以看到通过硬链接和软链接读取到的文件内容是一样的

理解linux inode

理解linux inode

?


?

1. inode的由来和作用

2. inode表中包含什么内容

3. 文件系统如何通过inode读取文件

4. 一个特殊的存在类型:硬链接

5. 目录文件的结构

?


?
1、inode的由来和作用
?
?硬盘创建文件系统时,会把物理磁盘的扇区(512字节)创建为由多个扇区组成的“块”(目前常用的为4KB,即8个扇区)。当操作系统从磁盘读取数据时,磁头从“块”上读取数据。为了快速查找数据,必须在磁盘上专门划分出一个专门的区域存储数据的“索引”,以方便快速查找数据。这种数据区域的“索引”就称为inode(index node)。
技术分享图片
图片来自马哥教育马永亮讲课PPT,画的比较抽象,但是就是这个意思,反正我也画不出来好的。
?


?
2、inode表中包含什么内容?

?
?inode的内容包含文件的大小、权限、属主属组、时间戳、数据块指针。可通过linux系统中的stat命令,可以查看文件的inode信息。
?

[[email protected] ~]# stat abc
  File: ‘abc’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d  Inode: 50350850    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-01-14 13:52:33.155811474 +0800
Modify: 2018-01-14 13:52:14.461811925 +0800
Change: 2018-01-14 13:52:14.461811925 +0800
 Birth: -
[[email protected] ~]#

?

file:文件名
size:文件大小
blocks:文件内容占用块数量
IO Block:文件系统块大小
inode:inode号码
links:文件被硬链接的次数
Access: (0644/-rw-r--r--) :文件属主、属组、其它组的权限
Uid :文件属主的用户ID号
Gid :文件属组的ID号
Access: 2018-01-14 13:52:33.155811474 +0800 :文件访问时间
Modify: 2018-01-14 13:52:14.461811925 +0800 :文件修改时间
Change: 2018-01-14 13:52:14.461811925 +0800 :文件改变时间

?以上信息中,读取文件时,Access时间会更新。对文件进行修改操作时,Modify信息会更改。而修改文件时,势必要打开文件,所以Access信息也会更新。若用输出重定向的方式修改文件,则Access信息不会更新。
?而Change的时间,只要文件元数据发生改变,该时间就会更新。


?

3、文件系统如何通过inode读取文件
?
?
技术分享图片
?
?系统读取文件时,通过文件名查找到对应的inode编号,再通过该编号找到inode信息,最后根据inode信息中的数据指针找到对应的块并完成读取文件的操作。
?
?对于各种文件来说,数据指针位置存放的内容不同。
?

  • ?普通文件,数据指针直接指向数据块。
  • ?符号链接文件:存储数据指针的空间当中存储的是真实文件的访问路径。
  • ?设备文件:存储数据指针的空间当中存储的是设备号(major, minor)。


    4、一个特殊的存在类型:硬链接
    ?
    ?一般情况下,文件名和inode是一一对应关系,但硬链接允许不同文件名指向同一磁盘分区下的同一个inode号码。
    ?
    ?这意味着,可以通过不同的路径访问同一文件且不会多占用inode编号。且只要硬链接数不为0,文件会一直存在。删除任意一个文件名,不会对文件造成影响。



    5、目录文件的结构

     对于目录来说,按照linux的哲学思想,目录也是文件。进入目录就是打开目录(需要有x权限才可以进入)。如用ls查看目录

    [[email protected] tmp]# ll -id /tmp
    33574984 drwxrwxrwt. 10 root root 165 Jan 14 20:21 /tmp
    [[email protected] tmp]#

 目录由一系列目录项组成,每条目录项包含文件的文件名以及文件对应的inode号。

?目录创建之后就会在目录下创建两个目录.和..,分别代表当前目录和当前目录的父目录。前者的inode就是当前目录的inode号码,所以对于目录文件来说,硬链接数至少为2。

以上是关于磁盘扇区、IO块、inode、文件、目录、硬链接与软链接到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Linux - 操作系统查找文件的过程以及硬链接与软链接的区别

浅析Linux文件inode与block硬链接与软链接恢复误删文件

(转)Linux硬链接软链接及inode详解

理解Linux—inode

软硬链接&使用RAID与LVM磁盘阵列技术

Linux ❀系统索引节点inode详解