实体连接与符号连接ln

来源:互联网 发布:如何寻找淘宝客 编辑:程序博客网 时间:2024/06/07 20:14

在linux下的链接档有两种,一种是类似于windows的快捷方式功能的档案,可以让你快速的连接到目标档案(或者目录);另一种则是透过文件系统的indoe连结来产生新的档名,而不是产生新档案。这种称为实体链接(hard link)。

Hard Link(实体链接,硬链接或者实链接)

在前民的内容中我们知道几个重要的信息,包括:

  1. 每个档案都有一个inode,档案内容有inode的记录来指向;
  2. 要读取该档案,必须要经过目录记录的文件名来指向到正确的inode号码才能够读取;

也就是说文件名只与目录有关,但是档案内容则与inode有关。那么想一想,有没有可能有多个档案名对饮到同一个inode号码呢?有的,那就是hard link的由来。所以简单的说:hard link只是某个目录下新增一笔档名链接到某个inode号码的关联记录而已。

举个例子来说,假设我系统有个/root/crontab他是/etc/crontab的实体链接,也就是说这两个档名链接到同一个inode,自然这两个文件名的所有信息都会一模一样(除了文件名之外)。实际情况如下所示:

这里写图片描述

你可以发现两个档名都连接到1912701这个inode号码,所以你瞧瞧,是否档案的权限/属性完全一样呢?因为这两个档名其实是一模一样的,而且你也会发现第二个字段由原本的1变成了2,这个字段称为连接,这个字段的意义为:有多少个档名链接到这个inode号码的意思。如果将读取到正确数据的方式画成示意图,就类似如下画面:

这里写图片描述

上图的意思是,你可以透过1或者2的目录之inode指定的block找到两个不同的档名,而不管使用哪个档名均可以指到real哪个inode去读取最终的数据。那这样有什么好处呢?最大的好处就是安全。如上图中,如果你将任何一个档名删除,其实inode与block都还是存在的。此时你可以透过另一个档名来读取到正确的档案数据。此外,无论已使用哪一个档名来编辑,最终的结果都会写入到相同的inode与block当中,因此均能够进行数据的修改。

一般来说,使用hard link设定链接文件时,磁盘的空间与inode的数目都不会改变。我们还是由上图来看你,hard link只是在某一个目录下的block多写入一个关连数据而已,既不会增加inode也不会耗着block数量。

tips

hard link的制作中,其实还是会可能改变系统的block的,那就是当你新增这笔数据却刚好将目录的block填满时,就可能会增加一个block来记录文件名的关联性,而导致磁盘的空间发生变化。不过一般的hard link所用掉的关联数据量小,所以通常不会改变inode与磁盘空间的大小奥。

由上图我们也能够知道,事实上hard link应该仅能在单一文件系统中进行的,应该不能够跨文件系统才对,因为在同一个filesytem中嘛。所以hard link是有限制的:

不能跨filesysytem
不能link目录

不能跨filesystem海还好理解,那不能hard link到目录有事怎么一回事呢?这是因为如果使用hard link链接到目录时候,链接的数据需要连同链接目录底下所有数据都建立链接,距离来说,如果你见/etc使用实体链接建立一个/etc_hd目录时,那么在/etc_hd底下的所有档名同时都与/etc底下的档名要建立hard link的,而不是仅链接/etc_hd与/etc而已。并且,未来如果需要在/etc_hd底下建立档案时,连带的,/etc底下的数据有的数据又要建立一次hard link,因此造成环境相当大的复杂度。所以啰,目前对于目录还是不支持的啊。

Symbolic Link(符号链接,亦即是快捷方式)

相对于hard link,Symbolic link可就好理解多了,基本上,symbolic link就是建立一个独立的档案,而这个档案会让数据的读取指向他link的那个档案的档名,由于只是利用档案来作为指向的动作,所以,当来源档被删除后,symbolic link的档案会开不了。

举例来说,我们先建立一个符号链接文件链接到/etc/crontab去看看:

这里写图片描述

由上表的结果我们可以知道两个档案指向不同的inode号码,当然就是两个独立的档案存在!而且链接档的重要内容就是他会写上目标的档案的文件名,你可以发现箭头右边的档名/etc/crontab总共有12个英文字母,每个英文字母占用1bytes,所以档案的大小就是12bytes了。

关于上述额说明,我们以如下图来解释:

这里写图片描述

由1号inode读取到链接档的内容仅有档名,根据档名链接到正确额目录取得目标档案的inode号码,最终就能够读取的到正确的档案数据了。你可以发现的是,如果目标档案(/etc/crontab)被删除了,那么整个环节就无法继续下去了,所以就会发生无法透过链接档读取的问题了。

这里还得要特别留意,这个symbolic Link与windows的快捷方式可以画上等号,由sysbolic link所建立的档案为一个独立的新档案,所以会占用inode与block。

由上面的说明来看,似乎hard link比较安全,即使某一个目录下的关联数据被删掉了,也没有关系,只要在任何一个目录下存在着关联的数据,那档案就不会不见。

关于目录的link数量

或许你已经发现了,那就是,当我们以hard link进行档案链接时,可以发现,在ls -l所显示的第二个字段会增加1才对,那么请教,如果建立目录时,他默认的link数量是多少。让我们来想一想,一个空目录里面至少有什么,呵呵,就是.与..这两个目录。那么,当我们建立一个新目录名称为/tmp/testing时,基本上会有三个东西,那就是:

/tmp/testing;
/tmp/testing/.
/tmp/testing/..

而其中/tmp/testing与/tmp/testing/.其实是一样的。都代表该目录~而/tmp/testing/..则代表/tmp这个目录。所以当我们 建立一个新目录时,新目录的link数为2,而上一层目录的link数目会增加1.

0 0
原创粉丝点击