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详解的主要内容,如果未能解决你的问题,请参考以下文章

索引节点inode详解

Linux中文件目录的inode 号有啥用?

Linux系统属性文件详解

Linux终端索引节点inode占满案例

Linux df排查inode已满及解决方法

Inode与block详解