这几天看操作系统的文件系统,看到关于文件连接的问题.文件连接分为两种,软连接和硬连接,其中软连接就是我们通常说的符号连接.
- 硬连接
linux下,文件是通过索引节点(即我们通常说的i节点),硬连接就像是一个指针,指向我们连接的文件的i节点,也就是说对于硬连接,系统并不会为它分配i节点,但是硬连接会增加文件i节点中的连接计数.
linux下我们可以使用ln命令来建立硬连接.
ln [options] existingfile newfile
ln [options] existingfile-list directory
第一种写法是为existingfile创建一个硬连接,文件名为newfile.第二种写法是在directory目录下为existingfile-list中的所有文件创建一个同名的硬连接.对于options,常用的有-f(force) 意思是无论newfile是否存在,我们都强制创建连接.-n选项是指如果newfile已经存在的话,就不创建链接.
image.png可以看到在图上,在开始时hello.c文件显示的链接数目为1,创建连接之后hardlink.c后,两个文件的连接计数都变成了2.为了说明硬连接的一些性质,我们再对文件做如下操作:
image.png
可以看到,我们截断hardlink.c的文件size到50之后,hello.c文件的size也被截断到50.另外,如果我们删除掉hello.c,我们可以看到hardlink.c文件依然存在,不过连接计数已经由2变成了1.当连接计数减少到0的时候,操作系统就会把该文件彻底给删除掉.
总结:实际上硬连接并不能算是一个文件,它相当于一个指向原文件的i节点的指针,所以硬连接是很节省磁盘空间的.但是也有几个小缺点,首先是不能在不同文件系统的文件之间建立连接,其次只有拥有超级用户权限才能为目录建立硬连接.第一个缺点在当前计算机发展的背景下显得愈发严重起来了.下面介绍的软连接就没这个问题了.
- 软连接(符号连接)
软连接主要克服了硬连接的一个主要不足,软连接没有任何文件系统的限制,甚至软连接可以跨越不同机器,不同网络对文件进行连接,所以灵活性远远的强于硬连接.
使用方法:还是linux下的ln命令,不过我们需要加上-s选项来生成软连接文件.
ln -s sourcefile softlink
ln -s soucefile-list directory
如果softlink已经存在但不是目录的话,我们不做连接.同时,softlink也可以是任何一个文件名(可包含路径),也可以是一个目录.对于第二种用法,指令将会在该目录下建立一个或多个与目标同名的文件,此新建的文件就是指向原目标文件的符号连接(软连接).
image.png上图我们可以看到软连接还是很容易看出来的,ls的时候会标出来是个指向hello.c的符号连接,这个与硬连接区别很明显.另外,我们可以看到hello.c的文件计数仍然是1.值得一提的是,softlink的大小是7,实际上这个是hello.c的长度,7个字节.也就是说,软连接不会增加文件的i节点计数.我们再对softlink文件做一些小操作如下:
image.png
从图中可以看到,我们对softlink进行截断操作,但是实际上softlink的size并没有发生改变,改变的是hello.c的长度,变为了3,而softlink的长度仍然是7,也就是hello.c的长度.我们查看hello.c和softlink的内容,都是一样的,三个字节.最后我们删除hello.c(或者重命名也是一样的),我们可以看到softlink已经失去了意义,不再指向一个有效的文件了.我们再使用ls -il指令查看当前目录,可以看到softlink变成红色,指向的文件也变成红色的,说明指向文件已经消失,该符号连接也没有意义了.
image.png
为了更好的说明,我又做了几个测试,从上面的图中,我们可以很清楚的看到软连接实际上连接的文件的路径,如果源文件被移动或者重命名或者被删除,软连接都会失效,而硬连接则不会.
总结:与硬连接不同,软连接实际上一个新的文件,文件类型是链接文件,有自己的i节点.当我们访问链接文件时,系统会发现其是链接文件,系统会读取链接文件并找到真正要访问的文件.因为链接文件包含了源文件的路径信息,所以源文件和链接文件是否在一个文件系统是没有影响的,这个是它的优点同时也是缺点,因为这个特性也导致了源文件的移动将会使链接文件失效(缺点).另外,软连接也会稍微耗费空间,因为链接文件是一个新的文件,系统需要分配新的i节点,同时需要保存源文件的路径.
网友评论