【Linux 读书笔记】Linux文件的硬连接和符号连接
连接文件是Linux 文件类型执行,分为硬连接和符号连接两种。
一 相关介绍
硬连接:目录项和文件inode节点之间的连接称之为硬连接。硬连接只是在某个目录下新增一个该文件的关联数据。
我们知道在Linux的EXT2文件系统中,会给目录分配一个inode和至少一个块。其中inode记录该目录的相关属性,并指向所分配的块;块记录在这个目录下的相关文件的关联性。而对于文件,EXT2同样是分配一个inode和至少一个块,文件的inode中记录的是文件的相关属性,块中存储文件的内容,inode中有指向文件内容放置块的“指针”。但是要注意,文件的inode节点中并不记录文件名,文件名则是记录在该文件所在目录的文件关联性中,该目录的文件关联性又存储在目录的块区域中。所以,一般来说使用硬连接设置连接文件时,磁盘空间和inode节点数据都不会改变,只是在该目录的块中多写入一个关联数据。
所以假如我们要为文件/A/h_link创建连接到/B/test.txt的一个硬连接,则只是在目录A的文件关联性中添加了一个文件test.txt和其inode节点的关联,test.txt文件的inode和块并没有改变。如果我们要通过目录A的硬连接h_link访问test.txt,步骤如下:
- 先通过一层一层的目录获取到目录A的inode节点
- 然后从目录A的inode节点得到目录A的块记录,从块记录中提取出保存的文件关联性数据
- 根据目录A的文件关联性数据,得到文件test.txt对应的inode节点。
- 根据test.txt的inode节点,就可以访问到test.txt的块数据了,也就是test.txt的文件内容。
硬连接的最大优势是安全性。如上提到的A/h_link和B/test.txt中,不管删除哪个文件,其实仅删除该目录下的文件关联数据,并没有改变原文件的inode和块数据。而且,不论哪个目录连接到正确的test.txt的inode和块,都可以正确的修改数据。
注意:
-
Linux文件系统并不允许普通用户创建到一个目录的硬连接,因为这样会导致文件系统的目录属性结构中出现回路。
-
硬连接只能在同一文件系统中存在,不能跨文件系统。
符号连接:符号连接就是建立一个独立的文件,这个文件会让数据的读取指向它连接的文件内容。
符号连接其实只是新建一个inode节点,此节点指向所要连接文件的块数据。这样当通过符号连接读写数据时,读写数据都是指向所要连接文件的块数据。Linux下面的符号连接和可以与windows下的快捷方式划等号。由于符号连接所建立的文件是一个独立的新文件,所以会占用掉inode和块。
二 shell实现
在shell中通过ln命令建立连接:
ln [-sf] 源文件 目标文件
参数: -s:如果ln不加任何参数进行连接,则是硬连接,-s是符号连接 -f: 如果目标文件存在,则将目标文件删除后再建立连接
1 在tmp目录中新建test.txt,并观察inode和块
结果如下:可以看到当前文件系统inode总数,已用inode和可用inode节点数。
2 在/tmp目录下创建硬连接文件test_h并查看此时的inode数
可以发现结果不变:
3 我们再创建符号连接文件test_s并查看系统的inode数
此时系统的已用inode数增加了一个,从之前的185111增加到185112,如下:
这说明了符号连接会新建一个inode节点。
4 再来看下这原始文件、硬连接文件以及符号连接文件
从上图中可以看到,test.txt和硬连接文件test_h的连接数都是2,这是因为他们共用一个inode,所以文件的属性都是一样的,而符号连接文件test_s新建了一个inode,所以它的连接数为1。而且,从上图中可以看到test_s的大小为8个字节,这是因为它连接的文件test.txt共有8个字符。这个连接文件的内容只是填写连接的目标文件文件名而已。所以,连接文件名有多长,符号连接文件就有多大。
我们可以再来验证下,新建一个文件testtest.txt,然后建立一个指向它的符号连接test_s1,然后再看test_s1的大小,如下:
可以看到此时test_s1的大小为12。