inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础
1. what is inode?#
linux文件相关 | size | 属性 |
---|---|---|
扇区(Sector) | 512bytes(0.5KB) | 硬盘的最小存储单位 |
块(block) | 通常4KB | 文件存取的最小单位(操作系统读取硬盘,一次性读取一个块,提高效率) |
inode | 一般是128字节或256字节 | 储存文件的元信息(如创建者、创建日期、大小等) |
inode, 中文译名为"索引节点",包含了与该 文件有关的一些信息。
2. the content of inode#
use stat to check the content of inode:
1
2
3
4
5
6
7
8
9$ stat mssh_ip.sh
File: ‘mssh_ip.sh’
Size: 183 Blocks: 8 IO Block: 4096 regular file
Device: fe21h/65057d Inode: 7120498 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 7857/liuwen03) Gid: ( 7857/liuwen03)
Access: 2021-01-28 14:13:04.213991000 +0800
Modify: 2021-01-28 14:13:04.213991000 +0800
Change: 2021-02-04 11:37:19.457991000 +0800
由此可以看出, inode包含文件的元信息,具体来说有以下内容:
1
2
3
4
5
6
7 * 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
3. what is inode number?#
inode是inode table中的一个item。Linux扩展文件系统 (如ext2/ext3) 维护了一个inode的数组:inode table。inode table包含该文件系统中所有文件的列表。inode table中的各个inode项具有 唯一的编号 (该文件系统唯一),即inode number。
使用ls -i命令,可以看到文件名对应的inode number:
1
2$ ls -li mssh_ip.sh
7120498 -rw-r--r-- 1 liuwen03 liuwen03 183 Jan 28 14:13 mssh_ip.sh
df -i显示文件系统inode的使用信息
1
2
3
4
5
6
7
8
9
10$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/dm-0 8134656 127239 8007417 2% /
udev 2056585 353 2056232 1% /dev
tmpfs 2058885 487 2058398 1% /run
tmpfs 2058885 4 2058881 1% /dev/shm
tmpfs 2058885 4 2058881 1% /run/lock
tmpfs 2058885 13 2058872 1% /sys/fs/cgroup
/dev/vdc1 209713152 344897 209368255 1% /home
/dev/vda1 62248 328 61920 1% /boot
5. 目录的inode结构#
Linux中的 目录 也被视为文件。目录是将文件名映射到其inode number的特殊文件 (此映射称为dentry)。因此,当我们说某个目录包含文件和其他目录时,我们的意思是该目录将这些文件和目录映射到它们的inode number。这就是目录无法容纳两个具有相同名称的文件的原因,因为它无法使用两个不同的inode number映射一个名称。
每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
理解了上面这些知识,就能理解目录的权限。目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以 如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而 读取inode节点内的信息需要目录文件的执行权限(x)。
6、inode的特殊作用#
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
移动文件或重命名文件,只是改变文件名,不影响inode号码。
打开一个文件以后,系统就 以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
reference#
1.理解inode 2.详解Linux Inode