硬链接(Hard Link)和软链接也称为符号链接(Symbolic Link)的目的是为了解决文件的共享使用问题。要阐明其原理,必须先理解Linux的文件存储方式。
索引结点
Linux是一个UNIX类操作系统,所有类型的UNIX文件都是由操作系统通过索引节点来管理的。
索引节点是一个控制结构,包含操作系统所需的关于某个文件的关键信息。多个文件名能与一个索引节点相关联,但一个活跃的索引节点只能与一个文件相关联,且每个文件只能由一个索引节点来控制。文件的属性、访问权限和其他控制信息都保存在索引节点中。此处以Linux中ext2的索引结点示例。
Ext2文件系统的每一个文件和目录都对应一个索引结点,每一个数据块组中的索引结点都保存在索引结点表中。
ext2的索引结点的一些主要字段:
Mode:包含次索引结点描述的是什么(比如描述文件、目录、符号链接、块设备、字符设备以及FIFO结构等)以及用户拥有的权限
Owner information:文件或目录所有者的用户和组标识符,这使得文件系统可以正确地授权某种存取操作
Size:文件大小
Timestamps:建立时间和最后修改时间
Datablocks:指向存储此索引结点描述的文件数据块的指针。直接指针指向存储数据的物理数据块,间接指针、两级指针和三级指针指向不同级别的指针块或数据。
具体的索引节点结构会因为UNIX实现的不同而发生变化,再举一个FreeBSD的索引节点结构:
当访问一个文件时,通过文件名在目录表中查找到其索引节点号,通过索引节点号查索引节点表得到其索引节点,通过索引节点得到文件数据所在的位置。
索引结点也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据(data block);另一个是索引结点区(inode table),存放索引结点所包含的信息。
每个索引结点的大小,一般是128字节或256字节。索引结点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个索引结点。
Linux中的相关命令:
查看每个硬盘分区的索引结点总数和已经使用的数量,可使用df命令:df -
查看每个索引结点节点的大小,可以用如下命令:sudo dumpe2fs -h /dev/hda | grep “Inode size”
使用ls –l命令会显示出在大部分信息. ls –i option显示文件的索引号.
而stat命令则可以列出索引节点中的几乎所有信息.
文件系统第一次被创建时, 会为每一个文件系统创建若干数量的索引节点。该数目是文件系统所能容纳的最大文件数。只要不重新初始化文件系统, 就不能改变这个数目, 否则会损坏该文件系统上所有的数据。当文件系统中有很多很多小文件时文件系统会可能将索引节点全部用光。
一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。操作系统用索引结点号码来识别不同的文件。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的索引结点号码;其次,通过索引结点号码,获取索引结点信息;最后,根据索引结点信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码:ls -i example.txt
由于索引结点与文件名分离,这种机制导致了一些Unix/Linux系统特有的操作
1. 若出现文件名包含特殊字符,无法正常删除的情况。这时,可以通过直接删除索引结点来删除文件。
2. 移动文件或重命名文件,只是改变文件名,不影响索引结点号码。
3. 打开一个文件以后,系统就以索引结点号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从索引结点号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。更新的时候,新版文件以同样的文件名,生成一个新的索引结点,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的索引结点则被回收。
硬链接和软连接
基于索引结点共享:硬链接(hard link)
文件索引节点中设有一个链接计数字段inode link count,用来表示连接到本索引结点上的用户目录项的数目
用户A创建一个新文件时,inode link count;
用户B要共享该文件,B的目录中增加一个目录项,并填上新的文件名和指向该共享文件的索引结点的指针,inode link count;
缺点:文件主无法删除被他人共享的文件。
•在系统中占用的空间与源文件相同,但在系统中引用的是相同的对象(不是拷贝)
•在操作系统层解析
•图标和创建快捷方式的图标不同
•移除源文件不会影响硬链接
•移除硬链接不会影响源文件
•如果源文件被删除,它的内容依然通过硬链接存在
•硬链接文件的任何更改都会影响到源文件
$ln a b # b是a所指文件的硬链接
硬链接实际上是为原文件建立一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看。两个文件的inode号是同一个,说明它们是同一个文件。它只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨文件系统的。硬链接删除的时候,系统调用会检查inode link count的数值,如果它大于等于1,那么inode不会被回收,因此文件的内容不会被删除。目录不能进行硬连接。目录硬连接引用计数,如果形成环,删除的时候会产生dangling dir。
基于文件路径共享:符号链接(symbolic link)&软连接(junction link or soft link)
为了能使B共享A的一个文件,系统为B建立一个类型为link的新文件,将该文件放在B的目录下,在新文件中只包含了目标文件的路径名,当B读该link类型的文件时,将被OS截获,并根据新文件中的路径名去读目标文件。这种实现文件共享的方式成为符号链接。
在这种方式下,文件主删除被他人共享的文件后,其他用户再去访问该共享文件,会因找不到文件而失败,再将该符号链删除不会造成任何影响
缺点:其他用户访问共享我共享文件时,必须根据路径中的分量名逐级检索目录,加大了访问文件的开销;尽管Link类型文件很简单,但任需为它配置一个索引结点,并分配一个盘块来存放目标文件的路径名,这样也增加了系统的开销。
•创建链接后的图标和快捷方式很像
•在系统中不占用空间
•在文件系统中不是一个单独的文件
•在操作系统层解析
•如果源文件被删除了,链接就没用了
•移除源文件不会影响符号链接
•移除链接文件也不会影响源文件
$ ln –s a b #为a创建一个符号链接b
rm b:a不受影响
rm a:a不存在,b能被控制但无法访问
软链接实质是新建立一个inode,产生一个新的文件,但这个文件的作用就是专门指向某个文件的,删除这个软链接文件,原来的实体原文件还是存在的,保持不变。但要是删除原来的文件,则相应的软链接不可用(cat那个软链接文件,则提示“没有该文件或目录”)。符号链接可以跨文件系统,可以跨磁盘分区,符号链接的文件类型位是l。
比较
硬链接
1.只允许文件链接,不允许目录链接;
2.只能在同一个文件系统范围内进行,不允许跨文件系统。
3.删除文件时,如果还有其他链接链至该文件,则该文件不能被删除。
软链接
1.访问速度相对较慢,但适用范围和灵活性更大。
2.允许目录链接,允许在不同的文件系统间进行链接,这两个文件系统可以在同一个计算机上,也可以在不同的计算机上。
3.被链接文件的删除和符号链接的删除是完全独立的
资料出处
1. 操作系统第八版
2. 操作系统原理、设计及应用。高等教育出版社
3. 电子科技大学计算机学院蒲晓蓉老师操作系统课件
4. 电子科技大学计算机学院薛瑞尼老师操作系统课件