在之前的文章中已经介绍了磁盘、文件系统与inode的关系,没看过的同学可以先看一下这篇文章。
从之前的文章中我们知道,一个inode是用来表示一个文件,用于描述文件的创建时间、权限、文件块与磁盘存储位置映射关系等等属性。唯独没有文件名,那么文件名存在哪里呢?
文件名其实是存储在所属目录的inode对应的数据块中,目录文件的数据块中存储了目录下的文件名称与文件inode的对应关系。
硬链接
理解了inode与文件数据之间的关系后,硬链接就比较好理解了。
硬链接就是在目录下新建了一个文件名,然后将文件名对应到链接文件的inode上。
具体操作如下所示。
ln test.go test.go_hardlink
可以看到,做了硬链接的两个文件的inode id是一样的,inode的link值也变成了2,表示当前inode被两个文件所使用。
通过硬链接和源文件均可以对文件进行修改,修改后两种方式查看文件,得到的均为修改后的数据。
两个文件做了硬链接,但是因为只有一个inode,所以文件内容只在磁盘上存储了一份。删除一个文件名,inode不会被删除,只有inode的link值变为0,inode才会被删除。
硬链接有两个限制:
-
不可以给目录创建硬链接
-
不可以跨文件系统创建硬链接,因为inode id只在当前文件系统有效
软链接
软链接则不受硬链接的两个限制,因为软链接新建了一个inode,这个inode对应的数据块中存储了链接到的文件路径。
所以操作系统访问软链接时,先通过软链接的inode找到目标文件的inode,再通过真正的inode对文件内容进行操作。
软链接具体操作如下
ln -s test.go test.go_softlink
可以看到,软链接生成的文件使用的inode为新的inode。原inode link值不变。
通过软链接和源文件均可以对文件进行修改,修改后两种方式查看文件,得到的均为修改后的数据。
如果将原文件删除,原inode link变为0后,原inode也会被删除。软链接会指向一个未知的文件,也无法再通过软链接对源文件进行修改。