在Linux中,我们可以通过ln命令来创建链接文件,具体地,其包含Hard Link硬链接、Sort Link软链接(或称为Symbolic Link符号链接)两种链接文件。本文就Linux的文件存储机制及如何建立链接文件进行介绍
Linux的文件存储机制
对于一个文件来说,其有两部分组成——文件的meta data元数据和文件的内容数据,其中元数据包括大小、用户、权限等文件的相关属性信息。所以Linux将文件的元数据和内容数据分开存储,前者作为inode(索引节点)存储到inode table中,而后者则是存储到磁盘的数据块中。而文件名则和inode num(索引节点号)一起存储在目录项中
当我们访问指定文件名的文件时,系统先通过目录项来获取该文件的inode num,然后通过inode num在inode table中找到指定的inode,由于inode中包含了该文件存放内容数据的data block信息,故可找到该文件的实际内容数据。现在我们知道了,在Linux中文件是通过inode num来标识的,文件名实际上相当于inode num的别名,故文件名是不存放在inode中的
可利用stat命令查看文件的相关信息,如下图所示。除文件名、inode num外,其余信息均来自于该文件的inode
Hard Link 硬链接
介绍完了Linux的文件存储机制,现在我们再来介绍什么是硬链接。硬链接,实际上就是为已存在的文件再增加一个文件名以供我们访问。可通过ln命令建立硬链接
1 | # 为源文件建立硬链接 |
我们通过一个实际案例来具体解释硬链接的含义,先建立一个file1.txt文件。通过ls命令的 -i 选项,我们可以查看该文件的inode num,即蓝框中的790431。而后面红框中的1即是上文的文件元数据meta data的链接数。因为目前只有一个文件名file1.txt指向该inode故其为1
现在我们来建立该文件的硬链接,根据下图我们可以发现,硬链接file1.txt.hardlink的inode num与file1.txt的inode num完全一致,且链接数也变为了2
实际上,我们现在无论是通过file1.txt源文件还是通过file1.txt.hardlink硬链接文件来访问,其效果都是一样,故硬链接文件在建立后其和源文件在本质上没有任何区别,一般不作区分。虽然从文件名看好像是两个不同的文件,但是其对于Linux来说是同一个文件。因为两个文件名所对应的inode num是完全一样的,即指向的是同一个inode,所以该inode的链接数为2
当我们尝试分别对源文件、硬链接的内容进行修改时,所有指向该inode的文件名的文件内容均会同步修改。原因大家想必也清楚了,因为这两个不同文件名的文件在Linux中实际是一个文件,这也是为什么我们在前文说硬链接相当于给文件增加一个新的文件名以方便我们访问
在Linux中,只有当inode的链接数为0时,文件才会被真正地删除。故我们即使删除了file1.txt后,我们依然可以通过file1.txt.hardlink进行访问到文件数据
Note:
- 减少磁盘空间占用:相比较于复制文件制作副本的方式,硬链接可以大大减少磁盘的空间占用
- 更加安全:对于有些重要文件未防止被用户意外删除或出于该目录的权限考虑,可以为该文件在其他目录中建立硬链接以供用户访问
- 不可对目录文件建立硬链接
- 硬链接不可跨越文件系统
- 硬链接移动后依然有效,只要保证其移动后仍在同一文件系统内
Sort Link 软链接
说完了硬链接,我们再来介绍下软链接。其实它和我们在Windows下的快捷方式很类似。软链接文件,是通过在其inode所指向的data block中所记录源文件的路径地址来实现对源文件进行访问的。可通过在ln命令中添加 -s 选项建立软链接
1 | # 为源文件建立软链接 |
下面我们通过一个实际案例来具体解释软链接的含义,先建立一个file1.txt文件
然后建立file1.txt文件的软链接file1.txt.sortlink文件。通过软链接文件我们同样可以对源文件进行访问。ls命令的结果让我们可以进一步确认软链接文件与源文件不是指向同一个inode的,黄框的l标识其是一个符号链接文件
由于软链接是通过路径来访问源文件的,所以当我们删去源文件后,即会导致该软链接文件失效;当再次重建该同名源文件后,软链接即会重新恢复
由于软链接与源文件的映射关系是单向的,故删去软链接对于源文件没有任何影响
欲修改已有软链接,可通过-snf选项实现
Note:
- 建立软链接时,源文件路径推荐使用绝对路径而非相对路径,以避免软链接文件移动后,因路径错误而无法正确指向源文件
- 可对目录文件建立软链接
- 软链接可跨越文件系统