inode

来源:理解inode-阮一峰的网络日志

文件inode

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

➜  ~ stat /tmp/hui/x
  File: ‘/tmp/hui/x’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d    Inode: 395197      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-04-12 13:56:18.677116921 +0800
Modify: 2021-04-12 13:56:18.677116921 +0800
Change: 2021-04-12 13:56:18.677116921 +0800
 Birth: -

➜  ~ ls -i /tmp/hui/x
395197 /tmp/hui/x

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

➜  ~ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 41.2M  0 rom
vda    253:0    0   50G  0 disk
└─vda1 253:1    0   50G  0 part /
➜  ~ df -i /dev/vda1
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/vda1      3276800 197965 3078835    7% /

➜  ~ dumpe2fs -h /dev/vda1|grep "Inode size"
dumpe2fs 1.42.9 (28-Dec-2013)
Inode size:           256

硬连接

  • inode 相同
  • 源文件与目标文件的inode号码相同,都指向同一个inode
  • inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。
  • 反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。
  • 当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域
➜  ~ ln /tmp/hui/x /tmp/hui/x1
➜  ~ ls -li /tmp/hui
total 0
395197 -rw-r--r-- 2 root root 0 Apr 12 13:56 x
395197 -rw-r--r-- 2 root root 0 Apr 12 13:56 x1

➜  ~ stat /tmp/hui/x1
  File: ‘/tmp/hui/x1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d    Inode: 395197      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-04-12 13:56:18.677116921 +0800
Modify: 2021-04-12 13:56:18.677116921 +0800
Change: 2021-04-12 13:57:57.015423754 +0800
 Birth: -

软连接

软链接与硬链接最大的不同:指向文件名,而不是文件的inode.因此inode不同

➜  ~ ln -s /tmp/hui/x /tmp/hui/x2
➜  ~ ls -li /tmp/hui
total 0
395197 -rw-r--r-- 2 root root  0 Apr 12 13:56 x
395197 -rw-r--r-- 2 root root  0 Apr 12 13:56 x1
395212 lrwxrwxrwx 1 root root 10 Apr 12 13:58 x2 -> /tmp/hui/x

目录

任何一个目录的”硬链接”总数=2+子目录总数(含隐藏目录)

创建目录时,默认会生成两个目录项:”.”和”..”。
* 前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;
* 后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。

➜  ~ stat /tmp/hui
  File: ‘/tmp/hui’
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d    Inode: 394833      Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-04-12 13:58:36.718546254 +0800
Modify: 2021-04-12 13:58:31.312529621 +0800
Change: 2021-04-12 13:58:31.312529621 +0800
 Birth: -

➜  ~ mkdir /tmp/hui/huichild

➜  ~ stat /tmp/hui
  File: ‘/tmp/hui’
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d    Inode: 394833      Links: 3
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-04-12 13:58:36.718546254 +0800
Modify: 2021-04-12 14:02:40.264280838 +0800
Change: 2021-04-12 14:02:40.264280838 +0800
 Birth: -

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.