在linux的学习过程中,链接文件的学习让不少人头疼,很多同学往往分不清什么是硬链接,什么是软链接,对于两者的概念和区别常常容易混淆、搞不清楚。今天我们就从原理、从根本上为大家辨析一些两者之间的区别,相信大家在看完这篇文章之后对链接文件会有一个清晰正确的认识。
1、在实现原理上不同
硬链接,涉及到文件的底层模式,因此被称为硬链接文件。硬链接文件只是一个指针指向,确切的说并不是一个真正的文件,它只有一个文件名和指向原文件inode的指针,并没有分配自身的inode和datablock。
软链接,并不涉及文件系统底层,完全是靠软件方式实现的,因此被成为软链接。软链接文件是一个独立的文件,他的创建是需要单独分配相应的inode和datablock。软链接文件的inode是一个全新的inode,而datablock里面的内容所记录的是,指向原文件的一个路径和文件名。
2、跨分区链接
由于硬链接的创建需要从底层硬件上去指向特定的inode,而每个分区在格式化时都有自己单独的一套inode和datablock分配机制,因此为了保证inode指向的唯一性,硬链接通常只能在同分区内创建。
而软链接只是存储了原文件的访问路径,不涉及到inode的跨分区问题,因此在跨分区链接的创建上更为方便。
3、资源分配上
从硬链接和软链接的实现原理上我们可以看出,软链接创建出了一个全新的文件,而硬链接只是做了一个指针的指向。可以看出硬链接是不分配inode和datablock的,因此通常不占用系统资源和空间。
而软链接则会消耗系统inode和datablock资源,会占用一定的硬盘空间。需要说明的是软链接所占用的空间,其实并不大,因为它是文件内容,存储的只是指向原文件的一个访问路径,文件的大小为路径所占空间。
4、文件属性信息
硬链接由于指向的是原文件的inode,实质上硬链接和原文件其实是一个文件,只是文件名不同,因此硬链接文件与原文件在inode编号、文件权限、属主属组关系、时间戳及大小等属性上是完全相同的。但由于有两个指针指向同一个inode编号,因此创建硬链接,硬链接文件和原文件的硬链接数会加1,当删除时硬链接数减1。
软链接由于是一个全新的独立的文件,因此由于自己单独的inode和创建时间、属主属组信息,但权限信息上全部是rwx。软链接的创建、删除不会影响到硬链接数。
5、当原文件被删除、新建时
当原文件被删除时,实质上操作系统所做的并不是马上删除文件的数据和所占用的系统资源。系统所做的操作,首先是删除原文件的文件名对inode的指针指向,并删除文件名记录,同时会检查原文件所对应inode的指向数量,即硬链接数。如果硬链接数减1后大于0,则只是将硬链接数减1;如果硬链接数减1后为0,则说明没有指针指向该数据,则会把对应的inode和datablock标记为删除或可用(只是做了一个标记)。
因此,我们可以看出当原文件被删除后,inode和datablock实际上并没有被删除,由于仍然有硬链接指向该inode,因此也不会被标记为删除,所以对于硬链接来说,删除原文件,硬链接文件仍然是可以正常访问的,并且访问结果仍然是原文件的内容。
而对于软链接来说,其做的只是标记了原文件的访问路径和文件名,当原文件被删除后,原文件对数据的inode指向及文件名都会被删除;对于链接文件来说,就相当于访问路径上的文件已经不存在了,因此也就无法再找到原文件的数据,软链接的访问失效。
在原文件被删除后,如果再新建一个与原文件同名的文件,我们暂时把它叫做新文件吧。这时候我们会发下软链接文件又可以用了。但是我们会发行软链接指向的是新文件,访问软链接得到的不是原文件的内容,而是新文件的内容。当我们访问硬链接是时候我们会发行访问的仍然是原文件的信息,用ls -il来进行查看会发现新文件和硬链接文件的inode编号完全不同,并且硬链接数也不会增加。
6、创建链接文件时使用相对路径
在创建链接文件的时候我们可以使用绝对路径,但在有的时候我们会觉得使用相对路径会更有必要。但在使用相对路径来创建链接文件的时候会有较大的差异。
在创建硬链接文件的时候,由于指向的是原文件的inode,因此只要在创建的时候使用的路径能够找到对应的原文件,获得原文件的inode信息即可创建硬链接文件,因此无论使用绝对路径还是相对路径都可以成功创建硬链接。
但在创建软链接的时候,我们会发现出了点问题。在使用绝对路径创建软链接的时候很顺利,在使用相对路径来指向原文件的时候也很正常,但当链接文件和原文件不在同一路径而使用相对路径来指向链接文件的时候却发现创建的链接文件是无效的。这是为什么呢???其实也很好理解,因为我们要通过链接文件找到原文件,而不是通过原文件找到链接文件,而链接文件存放的也是指向原文件的访问路径,所以在使用相对路径来创建软链接文件的时候就必须要使用链接文件指向原文件的相对路径。也就是说使用相对路径来创建软链接文件的时候,链接文件的相对路径必须是当前目录,原文件使用的相对路径要使用相对要创建的链接文件的相对路径。
关于这点,就有引申出来一个问题。当链接文件被复制、移动到其他目录,其自身的访问路径发生改变的时候,如果软链接使用的是相对链接,就会出现软链接无法访问的情况。但是硬链接文件和使用绝对链接的软链接则不会出现访问问题。
7、对目录创建链接
软链接是可以直接链接向目录的,这个很容易理解。但是在linux系统中原则上(当然如果非要创建目录的硬链接,在技术上也是可以实现的)是不能创建目录的硬链接的,即硬链接不能链接到目录。这个大致可以从以下方面来理解。
从文件系统方面来讲,我们知道linux的文件系统是典型的树型结构,在使用软链接的时候,软链接本质上还是一个文件,但硬链接则是在文件系统本质上的一个指向,这严重的破坏了系统的文件结构。因为软链接有单独的inode是一个新的文件,对于电脑来说只是一个普通的文件来对待的,但是系统无法分别硬链接的两个文件哪个是原文件、哪个是新创建的链接文件,而目录是一个树的非叶子节点。当然对于目录不能创建硬链接,还有很多其他方面的诸多因素,对于这些因素并没有绝对的说法,在这里我们就不再一一分析列举,感兴趣的同学可以自行查阅相关资料深入研究。
虽然说目录不能创建硬链接,但当我们使用ls -l命令来查看目录文件的时候会发现,目录文件的硬链接数并不是1,并且当我们在目录下创建新子目录的时候会发现,目录的硬链接数增加了。这究竟是怎么回事呢???其实当你使用ls -ali 来查看目录下的内容的时候就会发现,每个目录下有两个特殊的目录指向 “.”和“..”。因此当一个目录被创建的时候,除了自身的链接数1之外,还有目录下面的一个“.”是指向该目录本身的,而在目录下创建子目录的时候,子目录中的“..”指向其父目录,也是指向该目录的。并且你会发行这些特殊目录的inode编号与目录的inode编号是相同的,也就是说他们都是目录的一个硬链接。
8、如何看一个文件是硬链接还是软链接
以上我们已经为大家辨析了什么是硬链接、什么是软链接以及两者之间有什么异同,知道通过软链接和硬链接我们都可以很方便的直接访问到原文件,但我们如何知道一个链接文件是软链接还是硬链接呢?
A、使用ls -i,如果两个文件的inode编号相同,则可以知道这两个文件是硬链接文件。
B、使用ls -l,如果文件类型位置是”l”,则该文件是一个软链接文件,在文件名的位置我们同时能够看到链接文件指向的原文件位置。
原创文章,作者:M21-张国辉,如若转载,请注明出处:http://www.178linux.com/53142