inode、软链接、硬链接

一、前置知识

每次从磁盘中读取数据的时候,并不是只读取自己要的那个数据。为了提高性能,每次读取数据的时候是读取磁盘中该数据连带周围的一”快”都要读取,由于局部性原理,这样的方法是卓有成效的,读取的这一块数据叫做block

二、inode

inode号码

磁盘中这个block存储着文件的数据,那么还要有一个结构存放文件的信息(比如文件名、创建人,时间戳,权限....),这个存放文件信息的结构就叫做inode,每个inode结构对应一个inode号码,系统通过inode号码找到对应的文件的inode结构。
 

Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
 
在Linux中,可以使用stat命令查看一个文件的inode信息。

stat pipe.c

image-20231116194645040
 

系统通过文件名打开文件的过程其实就是:

  • 1、通过文件名找到对应的inode号。
  • 2、通过inode号找到对应的inode信。
  • 3、通过inode信息找到对应的文件数据。

 
具体流程如下图:

inode (1)

注意:inode号和inode信息的对应是唯一的,但是一个inode号可以有多个文件名,这个叫硬链接,我会在后面解释。(其实就是一个inode号码有多个别名)

目录文件

目录(文件夹)就是一种特殊的文件。
 
它存储着当前目录下所有文件的文件名和inode号码,然后还有当前目录的inode号,和父目录的inode号。

三、硬链接

硬链接就是将两个文件名指向一个相同的inode号码,也就是有两个别名可以访问这个inode号码对应的信息。两个文件共用一个文件数据,如果修改一个文件另一个文件也会同步修改,如果删除掉一个文件不影响文件数据。

download (1)

这里还要讲到inode信息中的链接数,某个inode的链接数就是指向这个inode的文件名的个数,链接数的初始值为1(一位最少也有一个文件名指向它),当inode的链接数为0时,系统就会自动回收这个inode信息、号码,和对应的block。
 
可以用ln命令硬链接两个文件:

ln  源文件名     目标文件名

image-20231116202239914

可以看到一开始只有test1.cpp文件,我们将test2.cpp硬链接到test1.cpp文件,系统会创建一个test2.cpp文件,并且test2.cpp的inode号和test1.cpp的一样。如果我们查看两个文件的内容会发现两个文件内容一样,修改一个会影响另一个,删除一个文件夹不会影响另一个文件夹。

四、软链接

软链接和硬链接不一样,软链接并不是指向同一个inode信息,而是一个文件名指向另一个文件名。

具体关系如下图:

ruanlianjie

这里如果我们删除了文件1,那么访问文件2的时候就会报错。这里inode的链接数并不会增加,因为是文件2的文件名指向的文件1的文件名。
 
我们可以用ln -s来进行软链接:

ln   -s   源文件名    目标文件名

image-20231116203301360

可以看到两个文件的inode号并不一样,这里就是相当于给test1.cpp起了个别名。

image-20231116203512594

当我们删除了文件1后,访问文件2就会报错,因为它找不到文件1了。(这里的vim test2.cpp是我输错了....)

inode的特殊作用

下面这段引用自阮一峰。

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

参考链接:阮一峰--理解inode

THE END