Linux知识回顾:inode与软链接、硬链接

最近在看runc最新的CVE-2021-30465漏洞的时候经常看到符号链接(symbolic link)这个概念,脑海中对于这一概念似乎也有点印象,但是始终无法清晰浮现出来,与之相关的inode、硬链接、软连接(即符号链接)这些Linux系统的概念也记不清了。于是特意重新翻看了一下操作系统的书籍,查阅了一些资料,记录一下。

我们都知道,文件是存储在磁盘上的。在Linux系统中,磁盘被划分分区并格式化的时候,整个分区会被划分为两个部分,分别是inode区data block区。其中inode区存放的是文件的inode信息,data block区存放的是真正的文件数据内容。

inode是一种UNIX系统中用于存储文件相关信息的数据结构,包括inode号、文件的uidgid、各个组的rwx权限等。需要注意的是,inode并不含有文件名。所以我们可以这么理解,UNIX系统中的文件名是给用户使用的,实际上系统打开每个文件都是通过inode号去寻找对应的inode,然后进行判断当前用户的权限等操作,再打开该文件。

在使用ls命令时可以加上-i选项查看文件对应的inode号。

/2021-05-31-linux%E7%9F%A5%E8%AF%86%E5%9B%9E%E9%A1%BEinode%E4%B8%8E%E8%BD%AF%E9%93%BE%E6%8E%A5%E7%A1%AC%E9%93%BE%E6%8E%A5/image-20210601205746981.png
image-20210601205746981

这是一对容易记混的概念。首先来说硬链接(hard link)。一般来说,一个文件名会对应一个inode号码,但是Linux系统允许多个文件名对应同一个inode号码,即指向同一个inode对象,这些其他的文件名就叫做硬链接。inode中的链接数字段信息保存了该文件的链接数量,每个新创建的硬链接都会使其加1。

创建硬链接可以使用ln命令来完成

1
$ ln <file-path> <link-name>

软链接又叫符号链接(symbolic link),原理与硬链接完全不同。软链接可以看作是windows系统的快捷方式,每个软链接都是独立的文件,只不过文件中的内容是另一个文件的路径。与硬链接不同的是,软链接可以用于目录,也就是说,你可以对一个目录创建一个软链接,而硬链接是只能作用与文件的。

使用ln命令也可以创建软链接

1
$ ln -s <file-path> <link-name>