什么是inode
inode 是 Unix/Linux 文件系统下的重要概念。我理解它应该是 index node (索引节点)的简写。
文件存储在磁盘上,最小存储单元是 Sector“扇区”,每个扇区大小为512字节,即0.5KB。但操作系统读写磁盘,不会一个扇区一个扇区操作。而是一次操作由连续多个扇区组成的“块”(block),以提高效率。所以磁盘常常被称为“块存储设备”。最常见的“块”由8个扇区组成,也就是4KB。
所以我们常常看到磁盘性能测试中有一项“4K随机存储速率”。
文件存储在“块”中,我们还需要系统能快速找到它们,所以文件系统会为文件所在的块建立索引,和一些元信息,包括文件的创建者、创建日期、大小等。这些储存元信息的区域就叫 inode。
inode的内容
我们在Linux下可以直接执行 stat 命令来查看文件的 inode 信息
# stat web.yaml
File: ‘web.yaml’
Size: 588 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 131087 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-03-30 23:50:30.054945544 +0800
Modify: 2022-03-30 23:50:27.879934597 +0800
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也会消耗硬盘空间,在分区时,文件系统会将磁盘分为两个区域:
- 数据区,存放文件数据;
- inode区,存放inode所包含的信息
每个inode的大小,一般是128字节或256字节。inode的节点总数,在格式化时就已确定。查看磁盘分区的inode总量和已使用数量,可以用df命令:
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 980150 308 979842 1% /dev
tmpfs 982791 2 982789 1% /dev/shm
tmpfs 982791 381 982410 1% /run
tmpfs 982791 16 982775 1% /sys/fs/cgroup
/dev/vda1 2621440 66173 2555267 3% /
查看每个inode节点的大小,可以用 dumpe2fs
# dumpe2fs -h /dev/vda1 | grep "Inode size"
dumpe2fs 1.42.9 (28-Dec-2013)
Inode size: 256
PS:由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
inode号码
每个inode都有一个inode号码,操作系统用inode号来识别不同的文件。
即:文件名是给人看的,Linux系统内定位文件用inode,而不是文件名
用户通过文件名打开文件的过程:
- 系统找到这个文件名对应的inode号
- 通过inode号码,获取inode信息
- 根据inode信息,找到文件数据所在的block,读取数据
通过ls命令可以看到文件名对应的inode号:
# ls -i web.yaml
131087 web.yaml
inode的特殊作用
因inode号与文件名分离,这种机制导致Unix/Linux系统特有的现象。
- 有时候文件因包含特殊字符无法正常删除,此时直接删除inode节点,就能删除文件。
- 移动文件或者重命名,只是改变了文件名,不影响inode号码
- 打开文件以后,系统用inode来识别文件,不考虑文件名,而且系统无法从inode号码得知文件名