什么是inode?
理解
inode
,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中
那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
inode的内容(inode是一个结构体)
我们可以通过stat
指令查看一个文件的inode
信息
inode
中的内容:
- 文件的字节数,块数
- 文件的
User ID
- 文件的
Group ID
- 文件的读、写、执行权限
- 文件的时间戳,共有三个:
ctime、mtime、atime
- 链接数,即有多少文件名指向这个
inode
- 文件数据
block
的位置 inode
编号(对应数组的下标)
block区和inode区的理解
硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区(block
区),存放文件数据;另一个是inode
区,存放inode
所包含的信息。inode
区是以数组的形式存储的,对应的数组下标就是inode
编码,每个元素就是一个结构体(结构体内容在上面已说),inode
结构体中会有一个指针,指向block
区也就是存放的文件内容。
我们可以通过指令df
查看每个硬盘分区的inode
总数和已经使用的数量.
inode编号
inode
编号是很重要的,当系统在找一个文件时,步骤如下:
- 通过文件名先找到文件的
inode
编号 - 通过
inode
编号找到文件inode
信息 - 通过
inode
信息中的block
指针找到文件内容
我们可以通过ls -i
查看文件的inode
编号
软链接与硬链接
在linux
系统中,硬链接 (hard link) 和软链接 (symbolic link) 是两个非常重要的概念
可以用ln
命令建立硬链接,加上-s
选项建立软链接
luzelin@DESKTOP-5VT4IIQ Link % touch source
luzelin@DESKTOP-5VT4IIQ Link % ln -s source S1
luzelin@DESKTOP-5VT4IIQ Link % ln source H1
luzelin@DESKTOP-5VT4IIQ Link % ln source H2
luzelin@DESKTOP-5VT4IIQ Link % ll -i
total 0
6755399441374992 -rw-r--r-- 3 luzelin luzelin 0 Jul 28 09:37 H1
6755399441374992 -rw-r--r-- 3 luzelin luzelin 0 Jul 28 09:37 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin 6 Jul 28 09:37 S1 -> source
6755399441374992 -rw-r--r-- 3 luzelin luzelin 0 Jul 28 09:37 source
我们仔细观察一下发现,source、H1、H2
拥有一样的i
结点(显示结果的第一列,即6755399441374992),甚至于连权限属性都一模一样。而S2
拥有另外一个独立的i结点
。我们在前面曾经说过,每一个i结点
对应一个实际的文件。所以,我们可以发现,建立的硬链接实际上跟我们的源文件是一样的。而软链接则是重新建立了一个独立的文件。
事实上,硬链接的本质就是一条文件名和i结点的关联记录而已(i节点的引用次数+1),作用是容许一个文件拥有多个有效路径名,这样用户就能够创建硬链接到重要文件,以防止“误删”的功能。。
另外,我们观察一下这几个文件的大小,由于我们的源文件是空文件,所以大小是0。那为什么两个硬链接也是0?而软链接却是6呢?
因为硬链接关联着我们的源文件,所以源文件的大小是多大,它们就是多大。至于软链接的大小为什么是6,这个就比较有趣了,大家观察一下软链接指向的源文件名(“source”)的长度,是不是6?对了,我们的软链接会写上链接文件的文件名。一个字母一个字节,所以是6个字节,所以软链接的大小是6。
可能有人对于上面的说法有怀疑,别慌,我们接着测试一下。我们往空的源文件里写入一些东西。
luzelin@DESKTOP-5VT4IIQ Link % vim source //添加内容
luzelin@DESKTOP-5VT4IIQ Link % ll -i
total 0
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:49 H1
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:49 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin 6 Jul 28 09:37 S1 -> source
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:49 source
luzelin@DESKTOP-5VT4IIQ Link % cat source
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee
luzelin@DESKTOP-5VT4IIQ Link % cat H1
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee
luzelin@DESKTOP-5VT4IIQ Link % cat H2
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee
luzelin@DESKTOP-5VT4IIQ Link % cat S1
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee
修改完源文件后,硬链接文件的大小和所有链接文件的内容也跟着修改了,印证了刚才的说法。
当我们删除了源文件之后,发现硬链接还能正常显示原本的内容,而软链接则提示文件不存在,这是怎么回事?
我们刚才说过,软链接是建立了另一个新的独立的文件,它指向源文件,因为源文件没了,所以它就不能正常指向了;而硬链接为什么依旧能显示原来的内容呢?回到我们一开始的解释,硬链接实际是一条文件名与i结点
的记录。所以,在删除源文件的时候,系统则将链接数减1
,当链接数为0
的时候,inode
就会被系统回收,文件的内容才会被删除。
luzelin@DESKTOP-5VT4IIQ Link % ll -i
total 0
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:50 H1
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:50 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin 6 Jul 28 09:37 S1 -> source
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:50 source
luzelin@DESKTOP-5VT4IIQ Link % rm source
luzelin@DESKTOP-5VT4IIQ Link % ll -i
total 0
6755399441374992 -rw-r--r-- 2 luzelin luzelin 122 Jul 28 09:50 H1
6755399441374992 -rw-r--r-- 2 luzelin luzelin 122 Jul 28 09:50 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin 6 Jul 28 09:37 S1 -> source //爆红错误
链接数看第3
列
总结:
- 硬链接记录的是目标的
inode
,软链接记录的是目标的路径(分绝对路径和相对路径)。 - 软链接就像是快捷方式,而硬链接就像是备份。
- 软链接可以做跨分区的链接,而硬链接由于
inode
的缘故,只能在本分区中做链接。所以,软链接的使用频率要高很多。
为什么目录不支持硬链接
那么为什么目录不支持硬链接呢?原因就是允许目录的硬链接可能会打破文件系统目录的有向无环图结构,这可能会导致一些遍历文件树的程序出错。出现子目录是父目录的情况,造成无限循环,比如ls -r, pwd
等
为什么软链接(符号链接)没有这样的限制呢?可以理解为符号链接是一个独立文件,有自己的inode,在遍历到符号链接时,得到的是它本身的信息,而不是链接的那个文件
当然如果一定要实现目录的链接,可以考虑软链接的方式或者挂载
参考: