Linux ❀ 系统索引节点inode详解
Posted 国家级干饭型选手°
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux ❀ 系统索引节点inode详解相关的知识,希望对你有一定的参考价值。
1、什么是inode
文件存储在硬盘上,硬盘的最小存储单元叫做 扇区 Sector,每个扇区存储512字节;
操作系统读取硬盘的时候,不会一个一个扇区读取,而是一次性连续读取多个扇区,即一次性读取一个 块 Block;这种由多个扇区组成的块,是文件存储的最小单位,块的大小最常见的是4KB,即连续的八个扇区组成一个块。
文件数据都存储在块中,那么很显然,必须还需要找到一个地方存储文件元信息,如创建者、创建日期、文件大小等,这种存储文件元信息的区域就叫做 索引节点 inode。
2、inode的内容
inode包含文件的元信息,主要有以下内容(即Linux命令 ls -l 展示的文件/目录详细信息):
- 文件的字节数
- 文件拥有者UID
- 文件所属组GID
- 文件权限rwx
- 文件时间戳,ctime-inode上一次变动时间、mtime-内容上一次变动时间、atime-文件上一次打开时间
链接数,多少文件名称指向这个inode - 文件block所处位置
可以使用stat命令查看某个文件的inode信息
[root@Redhat8 tmp]# stat test.txt
File: test.txt
Size: 2854 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 2763112 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2021-08-25 18:58:46.124599377 +0800
Modify: 2021-08-23 21:01:26.548445470 +0800
Change: 2021-08-25 18:57:12.931602687 +0800
Birth: -
3、inode的大小
inode也会消耗硬盘空间,在硬盘格式化的时候,操作系统会自动将硬盘分为两个区域,一个是数据区域,用于存放文件数据;一个是inode区域,存放inode所包含的信息。
每个inode的大小一般是128字节或256字节,inode节点的总数,在格式化时就给定,一般是每1KB或2KB就设定一个inode,假定在一块1GB的硬盘中,每个inode节点的大小为128字节,那么每1KB就设置一个inode,那么inode区域的大小就会达到128MB,占12.8%。
查看每个硬盘分区inode总数和已经使用的数量,可以使用如下命令:
[root@Redhat8 tmp]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 476127 411 475716 1% /dev
tmpfs 483482 1 483481 1% /dev/shm
tmpfs 483482 1021 482461 1% /run
tmpfs 483482 17 483465 1% /sys/fs/cgroup
/dev/mapper/rhel-root 3162112 189794 2972318 7% /
/dev/sda2 524288 18 524270 1% /boot
/dev/sda1 0 0 0 - /boot/efi
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存储满额的情况,此时将无法在硬盘上创建新文件。
4、inode的号码
每个inode都有一个号码,操作系统使用inode号码来识别不同的文件;
Unix/Linux系统不使用文件名来识别文件,对于系统来说,文件名只是inode号码便于识别的别称;系统打开文件过程有以下三步:
- 系统找到此文件对应的inode号码;
- 通过inode号码获取inode信息;
- 根据inode信息找到对应的block位置,读取数据;
5、目录文件
Unix/Linux系统中,目录也是一种文件;目录文件结构非常简单,每个目录项由两部分组成,所包含的文件的文件名与所包含的文件inode信息;
[root@Redhat8 tmp]# cd /tmp/shell/
[root@Redhat8 shell]#
[root@Redhat8 shell]# ls -il ./
total 68
2761834 -rwxr-xr-x. 1 root root 244 Aug 24 00:51 a1.sh
~
目录权限的r和w,都是针对目录文件本身,由于目录文件内只有文件名和inode号码,因此r权限只能获取文件名称、无法获取其他信息,因为其他信息都存储在inode节点中,而读取inode节点内的信息需要目录文件的执行权限x;
6、硬链接与软链接
(1)硬链接
默认情况下,文件名与inode号码是一一对应的关系,每个inode号码对应一个文件名称,但是Unix/Linux系统允许多个文件名指向同一个inode号码,可以用不同的文件名访问同样的内容,对玩家内容进行修改,会影响到所有文件名;但是删除一个文件名,不会影响另一个文件名的访问,这种情况称为 硬链接;
[root@Redhat8 shell]# ln 源文件 目标文件
案例如下:
[root@Redhat8 shell]# ln test.txt test_1.txt
[root@Redhat8 shell]# ls -il | grep test
2763114 -rw-r--r--. 2 root root 0 Aug 25 21:44 test_1.txt
2763114 -rw-r--r--. 2 root root 0 Aug 25 21:44 test.txt
[root@Redhat8 shell]# rm -rf test.txt
[root@Redhat8 shell]# ls -il | grep test
2763114 -rw-r--r--. 1 root root 0 Aug 25 21:44 test_1.txt
创建硬链接会让源文件与目标文件的inode号码相同,inode信息中有一项为 链接数 ,记录指向该inode的文件名总数,此处为2,当删除其中一项时,该数值为1;
目录文件默认inode数值为2,原因是当创建目录时会伴随着隐藏文件的产生,可以用ls -a查看所有文件(包含隐藏文件),会发现有 .
和 ..
两个文件,.
代表当前目录,..
代表该目录的上一级目录,因此新创建的目录文件的inode数值为2。
[root@Redhat8 shell]# ll -ai test
total 8
2763115 drwxr-xr-x. 2 root root 4096 Aug 25 21:47 .
2761818 drwxr-xr-x. 3 root root 4096 Aug 25 21:47 ..
(2)软链接
文件A和文件B的inode号码不同,但是文件A的内容是文件B的路径,读取文件A时,系统会自动访问导向文件B,因此无论打开哪一个文件,最终都是读取文件B,这时文件A就称为文件B的 软链接,Windows下称此方式为 快捷方式;
文件A依赖于文本B存在,如果删除了文件B,那么打开文件A就会产生报错;
软链接与硬链接最大的区别:
- 硬链接中文件A指向文件B的inode号码;
- 软链接中文件A指向文件B的文件名称,软链接不会导致 链接数 增加;
[root@Redhat8 shell]# ln -s 源文件 目标文件
案例如下 :
[root@Redhat8 shell]# ln -s test.txt test_2.txt
[root@Redhat8 shell]# ls -il
total 0
2761826 lrwxrwxrwx. 1 root root 8 Aug 25 21:56 test_2.txt -> test.txt
2761825 -rw-r--r--. 1 root root 0 Aug 25 21:56 test.txt
[root@Redhat8 shell]# rm -rf test.txt
[root@Redhat8 shell]# ls -il
total 0
2761826 lrwxrwxrwx. 1 root root 8 Aug 25 21:56 test_2.txt -> test.txt
[root@Redhat8 shell]# cat test_2.txt
cat: test_2.txt: No such file or directory
7、特殊作用
inode号码与文件分离,会产生以下特殊现象:
- 文件包含特殊字符,删除inode号码即可删除文件;
- 移动文件或者重命名只会修改文件名称,不影响inode号码;
- 系统以inode号码识别文件,不再考虑文件名称;
以上是关于Linux ❀ 系统索引节点inode详解的主要内容,如果未能解决你的问题,请参考以下文章