硬链接和符号链接
=============
总体说来,有点操作系统的底子再来看Linux的一些概念确实会舒服不少,作为初学的要求,速度也可以很快了。
以前是不知道有这么两种概念的,文件嘛,用的时候打开它,彻底不要了就删除,了不得建立一个快捷方式。这个就是在了解这个概念之前的我的观点。在了解了这两个概念之后,确实觉得这里面还是大有文章可做的。于是就初步的先记录下自己的一些想法。
首先说说符号链接(软链接),首先我们可以想到快捷方式,这个很像软链接,我们拥有一个文件,但是不是说一定要在它所在的目录下才能访问它。通过创建一个快捷方式,就可以在其它的地方访问到这个文件。只不过快捷方式归根到底还是一个lnk文件,它可以设置一些参数使得和原始的文件具有一定的不同。
软链接的性质于此类似,但是从操作的角度而言要强于快捷方式。如果我们为一个文件A创建了一个软链接B,那么我们可以直接用命令到B上从而实现对A的访问,无论A是文件还是文件夹。这一点是快捷方式做不到的。同时,对于程序而言,软链接与文件本身是同等对待的,所以一旦你删除了一个文件,那么它的软链接也失效了,但是删除一个软链接,文件依然保留着。
实验:
# mkdir test 创建一个实验目录
# cd test 进入这个目录
# vi test.t 打开vi之后随便写点什么,保存之
# ln -s test.t stest 创建test.t的一个软链接,名叫stest。
# ls 会显示一个青色的stest,与目录的蓝色和文件的白色很好区分。
# ls -al 会显示所有文件的详细信息,其中有一行: lrwxrwxrwx. 1 root root 6 3 2 21:07 stest -> test.t 表示stest链接到test.t
# vi stest 让程序打开软链接,果然直接进入了test.t的内容中。
# rm test.t 删除文件test.t,此时注意提示是普通文件(这就是为什么不加参数 -f)此时# ls一下的话,看到stest会变成红色。表示已经不可用。
# vi stest 打开软链接,结果是一个新文件。随便输入一些东西,保存
# ls -al 保存后发现test.t又回来了,表示软链接这个会按照自己的链接重建指向的文件。
# rm test.t 删除这个自动产生的文件
# vi test.t 手动重建一个文件,重新输入一些东西。此后软链接依然可用,说明符号链接就是一个符号而已。
# rm stest 删除符号链接,注意提示是符号链接,# ls 一下,对原来的文件没有任何影响
# rm -r -f ../test 删除整个test文件夹,回复原现场 有意思的是此时命令提示符所在的位置依然是test文件夹。不过# ls -al只会显示用量0
注意:软链接(符号链接)只是创建了一个符号,指向文件的真实路径(指向文件自身的名字而不是地址),对其删除并不涉及真正的文件操作;软链接可以跨分区和文件系统建立。
硬链接:与软链接不同,硬链接就是相当与重新建立了一个新的文件,但是这种建立最美好的是它并不是重新占用了一块等大的空间。只是又建立了一个指向文件首区块的链接,这样一来,硬链接和文件本身是等价的(或者说就是本身)。幸好本科操作系统的课程设计之一就是做一个基本功能的虚拟磁盘和管理系统,对此还有些熟悉。
硬链接最大的特点就是当你删除一个硬链接或者文件的时候,文件并不会被删除,只有当所有的链接都被删除的时候,文件所占用的空间才会释放,也就是说文件才真的删除了。最简单的实现方案就是在文件的首区块有一个链接计数器,创建的时候为1,每一次被硬链接就+1,当出现删除的时候-1,并查看结果,当结果为0 的时候才删除文件。(或者先查看数值,那就是为1的时候真正的释放空间)
硬链接的指令和软链接都是 # ln 所不同的是硬链接的参数是 -d
实验:
# mkdir test2
# cd test2 创建另外一个名字吧
# vi test.t 建立文件,随便输入一些字符,最好多一些。
# ln -d test.t dtest 创建硬链接
# ls -al 发现结果是多了一个文件类型的文件(真别扭),就是文件名是白色的 注意一下当前占用空间数量
# vi dtest 测试链接,发现进入了原来的文件
# ln -d test.t dtest2 再创建一个硬链接
# ls -al 发现又多了一个文件,但是增加的空间占用小于单个文件的。(我的机器上是增加了4字节,CentOS6.2 x86_64)
# rm test.t 删除原文件
# vi dtest 硬链接依然有效
# rm dtest 删除硬链接 (此时依然会告诉你是否删除普通文件,说明了二者的等价性)
# 收拾现场就不再说了。
硬链接相对与软链接来说,是对文件地址的指向,但是正因为如此,受限于不同文件系统的规范,硬链接不能跨越分区,更不用说文件系统。
个人感觉对硬链接的应用会比较广泛,尤其在应对重名文件的情况,现在就有一个不错的想法:要知道,WIN7已经支持硬链接了(vista开始支持的,仅支持NTFS),我们就可以通过系统调用,编程实现磁盘的压缩----就是对文件进行查重,然后MD5和CRC双重校验(相同性和有效性),保留一个文件,并将其它文件改成硬链接,这样就在完全不影响使用的情况下大大压缩了磁盘空间,(更进一步的,可以在选择保留哪个文件的时候保留碎片化程度最低的,优化磁盘的利用)。大约各种网盘就是利用这样的技术来保存文件的吧。 这个win7的新特性倒是很有一些利用空间。