大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。
一、前置知识
每次从磁盘中读取数据的时候,并不是只读取自己要的那个数据。为了提高性能,每次读取数据的时候是读取磁盘中该数据连带周围的一”快”都要读取,由于局部性原理,这样的方法是卓有成效的,读取的这一块数据叫做block
。
二、inode
inode号码
磁盘中这个block存储着文件的数据,那么还要有一个结构存放文件的信息(比如文件名、创建人,时间戳,权限…),这个存放文件信息的结构就叫做inode
,每个inode结构对应一个inode号码,系统通过inode号码找到对应的文件的inode结构。
Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
在Linux中,可以使用stat命令查看一个文件的inode信息。
stat pipe.c
系统通过文件名打开文件的过程其实就是:
- 1、通过文件名找到对应的inode号。
- 2、通过inode号找到对应的inode信。
- 3、通过inode信息找到对应的文件数据。
具体流程如下图:
注意:inode号和inode信息的对应是唯一的,但是一个inode号可以有多个文件名,这个叫硬链接,我会在后面解释。(其实就是一个inode号码有多个别名)
目录文件
目录(文件夹)就是一种特殊的文件。
它存储着当前目录下所有文件的文件名和inode号码,然后还有当前目录的inode号,和父目录的inode号。
三、硬链接
硬链接就是将两个文件名指向一个相同的inode号码,也就是有两个别名可以访问这个inode号码对应的信息。两个文件共用一个文件数据,如果修改一个文件另一个文件也会同步修改,如果删除掉一个文件不影响文件数据。
这里还要讲到inode信息中的链接数,某个inode的链接数就是指向这个inode的文件名的个数,链接数的初始值为1(一位最少也有一个文件名指向它),当inode的链接数为0时,系统就会自动回收这个inode信息、号码,和对应的block。
可以用ln
命令硬链接两个文件:
ln 源文件名 目标文件名
可以看到一开始只有test1.cpp
文件,我们将test2.cpp
硬链接到test1.cpp
文件,系统会创建一个test2.cpp文件,并且test2.cpp的inode号和test1.cpp的一样。如果我们查看两个文件的内容会发现两个文件内容一样,修改一个会影响另一个,删除一个文件夹不会影响另一个文件夹。
四、软链接
软链接和硬链接不一样,软链接并不是指向同一个inode信息,而是一个文件名指向另一个文件名。
具体关系如下图:
这里如果我们删除了文件1,那么访问文件2的时候就会报错。这里inode的链接数并不会增加,因为是文件2的文件名指向的文件1的文件名。
我们可以用ln -s
来进行软链接:
ln -s 源文件名 目标文件名
可以看到两个文件的inode号并不一样,这里就是相当于给test1.cpp起了个别名。
当我们删除了文件1后,访问文件2就会报错,因为它找不到文件1了。(这里的vim test2.cpp
是我输错了…)
inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
移动文件或重命名文件,只是改变文件名,不影响inode号码。
打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
(来自阮一峰)
参考链接:阮一峰–理解inode