【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,步骤如下:

  1. 先通过一层一层的目录获取到目录A的inode节点
  2. 然后从目录A的inode节点得到目录A的块记录,从块记录中提取出保存的文件关联性数据
  3. 根据目录A的文件关联性数据,得到文件test.txt对应的inode节点。
  4. 根据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。

 

posted @ 2013-05-04 12:54  数据世界  阅读(378)  评论(0)    收藏  举报