linux系统文件的链接
一、 硬链接(实际链接)
(以linux系统为例)
1. 文件的索引节点inode
假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:This is my file。
(1) 这行文字存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是1、20、30)。
(2) 假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.”
(3) 所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。
2. 硬链接与inode的关系
通过上面的讨论,我们知道:
(1) 1个inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。
(2) 我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。
(3) 有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink)。
(4) 对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立
(5) 例如:
# ln /home/zyd/mytext hardlink_mytext,就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext
3. 链接计数count
文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。
目录的count同样表示共有多少个目录项指向此目录,具体是等于本目录包含的直接子目录数(包括目录”.”和”..”,不包括子目录以下的目录)
4. 删除操作对硬链接的影响
当我们删除其中一个文件时,系统首先将(count-1)->;count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。
5. 硬链接与复制的区别
(1) 复制
在当前目录复制一个文件,需要
a. 在当前目录中增加一个目录项,其文件名域填入新名字,并分配了一个新的inode号;
b. 将原文件的内容复制了一份到新的空闲物理块;
c. 填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。
所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。
(2) 硬链接
建立硬连接实际上只是增加了一个目录项,但并不复制文件数据区,原文件的数据区由两个文件共享。
6. 硬链接的限制
由于硬链接是在同一个分区上建立数据关联,所以有以下限制:
(1) 不能跨文件系统
(2) 不能链接目录
二、 软链接(符号链接)
软链接就是建立一个独立的文件,这个文件会让数据的读取指向它连接的文件内容,类似于windows系统的快捷方式。由于软链接是一个独立文件,因此会分配新的inode与块。
通过ln –s 源文件 符号链接文件 可以创建一个符号链接。
三、参考
1. 《shell十三问》
(完)