初窥Linux 之 区分硬连接和软连接

时间:2023-12-13 12:12:56
一、Linux下的两种连接文件及创建方式
在Linux下面的连接文件有两种——软连接和硬连接,虽然都是连接文件,但两者却有很大的区别。一种是类似于Windows的快捷方式功能的文件(或目录),这种连接称为软连接;另一种则是通过文件系统的inode连接来产生新文件名,而不是产生新文件,这种称为硬连接。
创建连接文件的方法非常简单,就是使用ln命令,ln file1 file2,则创建硬连接,file2为file1的硬连接,ln -s file1 file2,则创建软连接,file2为file1的软连接。

二、详述硬连接
为了让大家更好地了解这两种连接的差别,这里先说说硬连接吧,因为它比软连接要难理解一些。

我们知道,在Linux下,每个文件都会占用一个inode,文件内容由inode的记录来指向,而想要读取文件,必须要经过目录记录的文件名来指向正确的inode号码才能读取,也就是说,其实文件名只与目录有关,但是文件的内容则与inode有关。

那什么硬连接呢?就是在某个目录下新建一条文件名连接到某inode号码的关联记录而已,简单来说,就是有多个文件名对应到同一个inode号码,注意,是多个文件名,不是多个文件。

看到这里可能你也是一头雾水,那么请看下面的例子吧
初窥Linux 之 区分硬连接和软连接

初窥Linux 之 区分硬连接和软连接

在这里我创建了一个硬连接,并查看了相关文件的inode,从结果可以看出,这两个文件的inode是完全相同的(394220),而文件连接数则不是1而是2,而且crontab的文件类型是“-”而不是“l”,即它不是一个连接文件,这是因因为有两个文件连接到了同一个文件/etc/crontab啊。为什么会如此神奇,就用下面的图来解释一下吧

初窥Linux 之 区分硬连接和软连接


初窥Linux 之 区分硬连接和软连接
从图中可以看到,你可以通过1或2的目录inode所指定的block找到两个不同的文件名,而不管使用哪个文件名均可以找到real这个inode,并通过这个inode去读取到最终的数据。

一般来说,使用硬连接(hard link)设置连接文件,磁盘的空间与inode的数目是不会变的,它只是在某个目录下的block多写入一个关联数据而已,既不会耗用inode也不会耗用block数量。

可能你会反驳说,不对,建立/root/crontab的那个文件不也需要一个inode和blocks吗?如图中的inode1不就是建立这个连接所要用的一个inode吗?其实不是这样理解的,因为/root这个目录早已在,而它里面的内容也早已记录在这个block中,即无论你添加还是不添加一个硬连接inode1和它所指向的那个目录的block都已经存在了,你建立的硬连接只是在这个inode1所指向的block中添加一条文件名的记录而已,在这个例子中,就是添加/root/crontab这条记录。所以没有增加inode和block的耗用。

三、详述软连接
相对于硬连接,软连接(symbolic link)就更好理解了,基本上软连接就是在创建一个独立的文件,而这个文件会让数据的读取指向指向它连接的那个文件的文件名。即只是利用文件来作为指向的操作,所以,当源文件被删除后,软连接会“打不开”,出现的情况就像大家熟悉的Windows中那样,提示“无法打开某个文件”。

请看下面的例子
初窥Linux 之 区分硬连接和软连接

初窥Linux 之 区分硬连接和软连接

我创建了一个软连接,从输出的结果中,我们可以看出它与硬连接的确是非常的不同。首先,这两个文件的inode号码并不相同,再者在文件类型方面,/etc/crontab为“-”,即普通的文件,而/root/crontab_sl则为“l”,即连接文件。

那软连接文件,即此例子中的crontab_sl文件里面的内容是什么呢?大家可以看到它的大小只12B,其实它的内容就是“/etc/crontab”这12个字符而已。

还不是很明白?那就用下面的图来说明吧
初窥Linux 之 区分硬连接和软连接

初窥Linux 之 区分硬连接和软连接

上图表示,由inode1读取到连接文件的内容仅有文件名,根据文件名连接到正确的目录去取得目标文件的inode,最终就能够读取到正确的数据了。

从上面的输出结果中,大家应该已经看到软连接是要耗用inode和block的(因为inode号与源文件的inode不相同),对应上图就是耗用了inode1和它所指向的block,它与硬连接的不同之处在于,inode1在创建这个软件文件之前是没有被使用的inode,它不指任何的block,也是说图中它所指向的block也不没有被利用的。当要创建软连接时,inode1和它所指向的block才被利用了。而且这个block不是用来记录文件名的,而是真真正正的一个文件,用来记录文件信息,例如这里它的信息是“/etc/crontab”这12个字,它是放在目录/root下的文件。

四、软连接与硬连接优缺点分析
1、硬连接
硬连接比较安全,因为即使某一个目录下的关联数据被删除了也没有关系,只要有任何一个目录下存在着关联数据,那么该文件就不会被删除,而且硬连接还不需要耗用inode和block,但是硬连接也有其限制,就是不能跨文件系统也不能连接到目录。

注:在硬连接中,删除文件时,只有当连接数为0时,才能文件真正删除,否则只会把文件的连接数减1。

2、软连接
软件连接比较灵活,可以连接到文件和目录,但是它会耗用inode和block,不过这对于系统来说其实不算什么,但是如果目标文件被删除了,从最后一幅图可以看出,整个环节就会无法继续下去,会发生无法通过连接文件读取的问题。其实软连接就你Windows中的快捷方式一样。

总之:本人觉得硬连接与软连接的一大区别就是硬连接不会创建一个新的文件,而软连接则会创建一个新的文件来,这个文件用来记录它所连接的文件的文件名。