什么是inode

inode 是 Unix/Linux 文件系统下的重要概念。我理解它应该是 index node (索引节点)的简写。

文件存储在磁盘上,最小存储单元是 Sector“扇区”,每个扇区大小为512字节,即0.5KB。但操作系统读写磁盘,不会一个扇区一个扇区操作。而是一次操作由连续多个扇区组成的“块”(block),以提高效率。所以磁盘常常被称为“块存储设备”。最常见的“块”由8个扇区组成,也就是4KB。

所以我们常常看到磁盘性能测试中有一项“4K随机存储速率”。

文件存储在“块”中,我们还需要系统能快速找到它们,所以文件系统会为文件所在的块建立索引,和一些元信息,包括文件的创建者、创建日期、大小等。这些储存元信息的区域就叫 inode。

inode的内容

我们在Linux下可以直接执行 stat 命令来查看文件的 inode 信息

  1. # stat web.yaml
  2. File: web.yaml
  3. Size: 588 Blocks: 8 IO Block: 4096 regular file
  4. Device: fd01h/64769d Inode: 131087 Links: 1
  5. Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
  6. Access: 2022-03-30 23:50:30.054945544 +0800
  7. Modify: 2022-03-30 23:50:27.879934597 +0800
  8. Change: 2022-03-30 23:50:27.880934602 +0800

我们可以看到它输出了文件的:

  • 大小,以字节为单位,Blocks: 8 这里的block我理解应该是扇区的概念,588字节也会占用整个块,8个扇区,4906字节的磁盘空间。
  • Inode 号,和链接文件数
  • 访问权限,所有者和所属组
  • 文件的时间戳,包括 Access(atime)文件上次访问的时间,Modify(mtime)文件上一次修改的时间,Change (ctime)inode上一次变动的时间

    inode的大小

    inode也会消耗硬盘空间,在分区时,文件系统会将磁盘分为两个区域:
  1. 数据区,存放文件数据;
  2. inode区,存放inode所包含的信息

每个inode的大小,一般是128字节或256字节。inode的节点总数,在格式化时就已确定。查看磁盘分区的inode总量和已使用数量,可以用df命令:

  1. df -i
  2. Filesystem Inodes IUsed IFree IUse% Mounted on
  3. devtmpfs 980150 308 979842 1% /dev
  4. tmpfs 982791 2 982789 1% /dev/shm
  5. tmpfs 982791 381 982410 1% /run
  6. tmpfs 982791 16 982775 1% /sys/fs/cgroup
  7. /dev/vda1 2621440 66173 2555267 3% /

查看每个inode节点的大小,可以用 dumpe2fs

  1. # dumpe2fs -h /dev/vda1 | grep "Inode size"
  2. dumpe2fs 1.42.9 (28-Dec-2013)
  3. Inode size: 256

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

inode号码

每个inode都有一个inode号码,操作系统用inode号来识别不同的文件。
即:文件名是给人看的,Linux系统内定位文件用inode,而不是文件名

用户通过文件名打开文件的过程:

  1. 系统找到这个文件名对应的inode号
  2. 通过inode号码,获取inode信息
  3. 根据inode信息,找到文件数据所在的block,读取数据

通过ls命令可以看到文件名对应的inode号:

  1. # ls -i web.yaml
  2. 131087 web.yaml

inode的特殊作用

因inode号与文件名分离,这种机制导致Unix/Linux系统特有的现象。

  • 有时候文件因包含特殊字符无法正常删除,此时直接删除inode节点,就能删除文件。
  • 移动文件或者重命名,只是改变了文件名,不影响inode号码
  • 打开文件以后,系统用inode来识别文件,不考虑文件名,而且系统无法从inode号码得知文件名

参考:
http://www.ruanyifeng.com/blog/2011/12/inode.html