4

什么是inode

 1 year ago
source link: https://www.myfreax.com/what-is-inode/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

文件储存在硬盘上,硬盘的最小存储单位叫做扇区Sector。每个扇区储存512字节相当于0.5KB。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。

这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个扇区组成一个块。

文件数据都储存在块中,那么很显然,我们还必须找到一个地方储存文件的元信息。

比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为索引节点。

inode 信息

inode包含文件的元信息,具体来说有这些内容。Size文件的字节数。Uid文件拥有者的用户ID。Gid文件的Group ID。

Access: (0664/-rw-rw-r--)文件的读、写、执行权限。Links链接数,即有多少文件指向这个inode。

Blocks文件所使用的总块数。IO Block文件数据block的大小,此数据是在分区的时候指定,单位是字节。

文件的时间戳,共有三个。Change: 2022-12-19 21:15:11.119221489 +0800也就是ctime指inode上一次改变的时间。

Modify: 2022-12-19 21:15:11.119221489 +0800也就是mtime指文件内容上一次修改的时间。

Access: 2022-12-19 21:15:11.119221489 +0800也就是atime指文件上一次打开的时间。

我们可以运行stat命令查看某个文件的inode信息,例如命令stat example.txt查看example.txt文件的元信息。

stat example.txt
  File: example.txt
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 814h/2068d	Inode: 855322      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ myfreax)   Gid: ( 1000/ myfreax)
Access: 2022-12-19 21:15:11.119221489 +0800
Modify: 2022-12-19 21:15:11.119221489 +0800
Change: 2022-12-19 21:15:11.119221489 +0800
 Birth: -

总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,是因为文件名存储在目录中。

目录是一个特殊的文件,它存储文件名与inode的一一对应关系。目录包含的信息包括inode号码,文件名,文件名称的长度。

inode 大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。

一个是数据区,存放文件数据。另一个是inode区,通常称为inode table,存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就指定,一般是每1KB或每2KB就设置一个inode。

假设在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

要查看每个硬盘分区的inode总数和已经使用的数量,可以运行df命令df -i

df -i
Filesystem        Inodes  IUsed     IFree IUse% Mounted on
udev             2029095    655   2028440    1% /dev
tmpfs            2039243   1272   2037971    1% /run
/dev/sdb4        3383296 836357   2546939   25% /
tmpfs            2039243   1249   2037994    1% /dev/shm
tmpfs            2039243      8   2039235    1% /run/lock
tmpfs            2039243     19   2039224    1% /sys/fs/cgroup

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

inode 号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名打开文件。实际上,系统内部将这个过程分成三步。首先,系统找到这个文件名对应的inode号码。

其次通过inode号码,获取inode信息,最后,根据inode信息,找到文件数据所在的block,读出数据。

如果你需要知道文件对应的inode编码,可以运行命令ls -i命令。

ls -i example.txt

一般情况下,文件和inode号码是一一对应关系,每个inode号码对应一个文件。但是,Unix/Linux系统允许多个文件名指向同一个inode号码。

这意味着,可以以不同的文件名访问文件。对文件内容进行修改,会影响到原始文件。

但是删除一个文件,不影响另一个文件的访问。这种情况就被称为硬链接hard link。要创建文件的硬链接,可以运行ln命令ln example.txt example1.txt

ls -i example1.txt example.txt
828860 example1.txt  828860 example.txt

当对文件创建硬链接后,源文件与目标文件的inode号码相同,都指向同一个inode。这一点决定了硬链接不能跨分区创建。

每个分区都有自己的inode表,如果硬链接可以跨分区创建的话,可能就是出现目标分区没有相同inode号码或者覆盖已经存在文件等等。

在inode保护的信息中有一项叫做链接数,记录指向inode的文件名总数,当为文件创建硬链接时就会加1。

反过来,删除链接文件,就会使得inode节点中的链接数减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode 号码以及其所对应block区域。

软链接并不像硬链接那样,拥有相同的inode号码,软链接文件有自己的独立的inode号码。

当你为你文件创建软链接时,原始文件inode信息的链接数也不会增加,删除文件的软链接原始文件inode也不会减少。

inode 特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

移动文件或重命名文件,只是改变文件名,不影响inode号码。

打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。

更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。

等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK