Unix / Linux系统中有一种特殊的文件,即链接文件。链接文件很像windows系统中的“快捷方式”,通过它实际上要访问的是源文件(source file)。
链接文件有两种类别,分别是硬连接(Hard Link)和符号链接(Symbolic Link)。这两种链接有很大的不同。
1) 硬链接
硬连接是其所在目录的block里的一条关联数据,通过它,能找到链接所指文件的inode index,通过 inode节点可以访问源文件的数据。
为了透彻地理解硬链接的概念,需要弄清楚目录是怎么回事。
1.1)目录的定义
在Unix / Linux系统中,目录也是文件,如下例:
drwx------ 18 flagonxia flagonxia 4096 1月 11 21:23 flagonxia
属性域的第一个字母为d,表示flagonxia这个文件的属性是个目录。
鸟哥是这样描述目录的。在 Linux 下的 ext2 档案系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目录下的相关连的文件(或其子目录)的关连性! 如果一个block不够用,系统会再分配一个block供目录使用。
1.2) 如何读取目录中的文件?
举个例子,读取文件/etc/crontab时的步骤。
step1:系统根据根目录( / )的相关资料可取得 /etc 这个目录所在的 inode ,并前往读取 /etc 这个目录的所有相关属性;
step2:根据 /etc 的 inode 的资料,可以取得 /etc 这个目录底下所有文件的关连数据是放置在哪一个 Block 当中,并前往该 block 读取档案的关连性内容;
step3:由上个步骤的 Block 当中,可以知道 crontab 这个文件的 inode 所在地,并前往该 inode ;
step 4:由上个步骤的 inode 当中,可以取得 crontab 这个文件的所有属性,并且可前往由 inode 所指向的 Block 区域,顺利的取得 crontab 的文件内容。
1.3)创建一个硬连接就是其所在目录block中的创建了一条关联数据,通过它可以找到源文件的inode,从而访问源文件的block area中的数据。
可见,创建一个硬链接,即不用占用空间,也不消耗inode。
1.4)如果文件file有一个硬连接file-hard,如果执行了命令rm file,文件file的block area不会被删除,它的inode index也不会被删除,因为还有硬链接file-hard存在,只有file-hard也被删除了,而文件file又没有其他的硬链接,file的inode和block area才会被系统删除。
如test1-hard为一个硬链接,我们观察一下它的属性ls -l test1-hard,得到如下结果。
-rw-rw-r-- 2 flagonxia flagonxia 11 1月 11 23:02 test1
-rw-rw-r-- 2 flagonxia flagonxia 11 1月 11 23:02 test1-hard
可见,test1-hard其实不是一个文件,它像源文件的一个映像,属性和文件一模一样。
1.5)硬链接的局限性:
1.5.1)不能跨越文件系统;
1.5.2)不能link目录。
2)软(符号)链接
软链接就是在一个独立的文件,它有自己的inode index和block area。软链接会让数据的读取指向源文件内容。由于只是利用文件来做为指向的动作,所以,当源文件被删除之后,软链接的文件会“开不了”,会一直说“无法开启某文件!”。
3)如何建立硬链接和软链接
源文件test
3.1)建立硬链接
ln test test-hard
3.2)建立软链接
ln -s test test-soft