你真的对 Linux 中的 Inode 了解吗

引言

inode 是一个 Linux 非常重要的知识点,了解它有利于我们对 Linux 系统的进一步了解。

今天无意中看到了阮一峰老师对 inode 做的一个博客笔记,我这里简单的记录下学到的东西。

概念

存储单位:

  1. 扇区 (Sector),存世 512 字节(相当于 0.5kb)

  2. 块(block),8 个 Sector 组成一个 block

文件存储分为两个部分:

  1. 数据存储

  2. 文件元信息

文件元信息就是 inode

inode 内容

inode 文件元信息包含以下内容:

  1. 文件的字节数

  2. 文件拥有者的 User ID

  3. 文件的 Group ID

  4. 文件的读、写、执行权限

  5. 文件的时间戳,共有三个:ctime 指 inode 上一次变动的时间,mtime 指文件内容上一次变动的时间,atime 指文件上一次打开的时间。

  6. 链接数,即有多少文件名指向这个 inode

  7. 文件数据 block 的位置

查看 inode 信息

1
stat 1.txt

查看硬盘的 inode 总数和已经使用数量

1
df -i

inode 号码

每个文件都会有 inode 号码,相当于 mysql 数据库里的表 id,用来查找数据的。每个文件名都会对应一个 inode 号码,我们打开一个文件的时候实际经历了以下步骤:

  1. 通过文件名去找对应的 inode 号码

  2. 通过 inode 号码获取 inode 信息

  3. 通过 inode 信息查找数据所在的 block,读取数据

查看文件/目录的 inode 号码

1
ls -i 1.txt

特殊作用

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

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

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

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

第 3 点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过 inode 号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的 inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。

篇尾

坚持每天学一点,知识是需要日积月累的,加油~ 分享给大家~

参考

个人博客

原文