1、硬连接

参考《鸟哥的Linux私房菜》,首先hard link只能在单一文件系统中进行(因为硬连接文件名关联的inode节点号是相对于文件系统的,不同文件系统|磁盘分区的inode号将会重复)。

图片示例:[[email protected] ~]# ln /etc/crontab ./

linux硬连接只能连接文件,不能连接目录;
实体链接(《鸟哥的Linux私房菜》第四版)

linux硬连接只能连接文件,不能连接目录;

文件的硬连接,是在LINK_NAME硬连接文件所在目录的block中新建“硬连接文件名”并将对应inode节点号指定为TARGET目标文件的inode节点,只是新增了目录block中【"硬连接文件名"-inode号】这样一条记录;

手册里看到有选项允许超级用户尝试硬连接目录,但也提示说可能由于系统限制而失败,即使是对超级用户。

linux硬连接只能连接文件,不能连接目录;

尝试:

linux硬连接只能连接文件,不能连接目录;

linux硬连接只能连接文件,不能连接目录;

如果要创建~/Files/temp1目录的硬连接~/Files/temp1_hd,我天真地猜测是在上层目录~/Files的文件名列表block中新建一个“硬连接目录”的记录,并将源目录的inode节点号赋给此“硬连接目录”,那样只要具有“硬连接目录”上层目录~/Files的rw权限,对“硬连接目录”的rwx与列表显示权限的操作就等同于对源目录的操作,即下图中红色式样。

linux硬连接只能连接文件,不能连接目录;
尝试创建目录的硬连接档的示意图

按照《鸟哥的Linux私房菜》的解读:“不能hard link到目录又是怎么回事呢?这是因为如果使用hard link链接到目录时,链接的数据需要联连同被链接目录底下的所有数据都建立链接,举例来说,如果你要将~/Files/temp1使用实体链接建立一个~/Files/temp1_hd的目录时,那么在~/Files/temp1_hd底下的所有档名同时都与~/Files/temp1底下的档名要建立hard link的而不是仅连结到~/Files/temp_hd与~/Files/temp1而已。并且,未来如果需要在~/Files/temp1_hd底下建立新文件时,连带的~/Files/temp1底下的数据又得要建立一次hard link,因此造成环境相当大的复杂度。所以,目前hard link对于目录暂时还是不支持的啊!”说明centos的xfs、ext4文件系统尝试建立目录的硬连接时,是采用图中蓝色式样,相当于创建了一个新的目录,有实体的目录文件名列表block,目录中的文件(名)均作为源目录中文件的硬连接,而子目录应该也会对应创建子目录,有实体的目录文件名列表block,子目录中的文件又要作为源目录子目录中对应文件的硬连接,相当于recursive递归地创建源目录层级内所有文件的硬连接,这确实很复杂,并且要做到目录内硬连接文件与源文件的关联增、删、改,确实复杂。

总之,记住“只能创建文件的硬连接而不能创建目录的硬连接”就对了!

2、符号连接(软连接)

linux硬连接只能连接文件,不能连接目录;

选项为-s

linux硬连接只能连接文件,不能连接目录;

图片示例:[[email protected] ~]# ln -s /etc/crontab crontab2

linux硬连接只能连接文件,不能连接目录;
符号链接(软链接)《鸟哥的Linux私房菜》

(符号链接)软链接虽然是新建了一个软链接文件,但软链接文件元数据块meta data block中只存储了其链接到的文件的文件名而已("/etc/crontab"共12个一字节字符),然后根据软链接文件属性"l"+存储的链接文件名,链接到被链接文件所在目录的inode——文件名列表block块,接下来查找被链接文件名——inode,从而读取到被链接文件的数据块data block。

 

需要留意的是,1、符号链接与Windows的快捷方式可以划上等号,由符号链接所建立的文件是一个独立的新文件,所以会占用inode与block;2、而文件硬链接则是在创建硬连接所在目录的文件名列表block中增加一条源文件名——源文件inode的记录,并不新建文件或消耗额外空间,只有当为了增加该条记录而给目录文件名列表block分配新的block时才会造成空间消费;3、可以为目录创建软链接,此时软链接文件将链接到源目录的上层目录的inode——文件名列表block;4、硬连接直接指向文件的inode——元数据data block,软连接指向源文件或源目录所在目录的inode——文件名列表block

linux硬连接只能连接文件,不能连接目录;

 

相关文章: