文件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 Reply