Linux中硬链接与软链接的区别与联系

来源:互联网 发布:水资源优化配置 编辑:程序博客网 时间:2024/06/08 08:45

  链接为 Linux 系统解决了文件的共享使用问题,还带来了隐藏文件路径、增加权限安全及节省存储等好处。链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link),也即软链接(Soft Link)。本文,我们将详细讲解关于这两种链接的区别与联系。


1.理解inode

  要理解“硬链接”与“软链接”,首先要从inode讲起。
  inode是指在许多“类Unix文件系统”中的一种数据结构。每个inode保存了文件系统中的一个文件系统对象(包括文件、目录、设备文件、socket、管道,等等)的元信息数据,但不包括数据内容或者文件名。
  文件系统创建(格式化)时,就把存储区域分为两大连续的存储区域。一个用来保存文件系统对象的元信息数据,这是由inode组成的表(inode table),每个inode默认是256字节或者128字节。另一个用来保存“文件系统对象”的内容数据,划分为512字节的扇区(sector),以及由8个扇区组成的4K字节的块。块是读写时的基本单位。一个文件系统的inode的总数是固定的。这限制了该文件系统所能存储的文件系统对象的总数目。典型的实现下,所有inode占用了文件系统1%左右的存储容量。文件系统中每个“文件系统对象”对应一个“inode”数据,并用一个整数值来辨识。这个整数常被称为inode号码(“i-number”或“inode number”)。由于文件系统的inode表的存储位置、总条目数量都是固定的,因此可以用inode号码去索引查找inode表。inode存储了文件系统对象的一些元信息,知道了1个文件的inode号码,就可以在inode元数据中查出文件内容数据的存储地址,从而获取文件内容数据。
  Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号;其次,索引查找inode表,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。程序通过文件名获取文件内容的过程如下:


这里写图片描述

  inode所包含的元信息数据,具体来说有以下内容:

  • 文件的字节数
  • 类型(是文件还是目录)
  • 文件所有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime指inode自身被修改的时间,mtime指文件内容被修改的时间,atime指文件上一次被访问的时间
  • 链接数,即有多少文件名指向这个inode
  • 文件数据block的位置

可以用stat(Linux命令行——stat命令详解)命令,来查看某个文件的inode信息:


这里写图片描述

总之,除了文件名以外的所有文件信息,都存在inode之中。

  inode的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i:


这里写图片描述

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

  使用ls -i命令,可以看到文件名对应的inode号码:


这里写图片描述

这里值得说明的是,移动或者重命名文件,均不会改变文件所对应的inode号。

  关于inode,还有以下几点说明:

  • Unix的文件系统的目录也是一种文件。打开目录,实际上就是读取“目录文件”。目录文件的结构是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件或目录的名字,以及该文件或目录名对应的inode号码。
  • inode本身并不记录文件名,文件名记录在目录文件的block当中,所以新增、删除、更改文件名与目录的w权限有关。因此当我们要读某个文件时,就务必经过其目录的inode和block,然后才能够找到待读取文件的inode号,最终才会读到正确的文件block内的数据。大致过程可表示为:目录inode(满足权限?) => 目录block => 文件inode(满足权限?) => 文件block。
  • 文件系统中的一个文件是指存放在其所属目录的“目录文件”中的一个目录项,其所对应的inode的类别为“文件”;文件系统中的一个目录是指存放在其“父目录文件”中的一个目录项,其所对应的inode的类别为“目录”。可见,多个“文件”可以对应同一个inode;多个“目录”可以对应同一个inode。
  • 创建一个目录时,实际做了3件事:在其“父目录文件”中增加一个条目;分配一个inode;再分配一个存储块,用来保存当前被创建目录包含的文件与子目录。被创建的“目录文件”中自动生成两个子目录的条目,名称分别是:“.”和“..”。前者与该目录具有相同的inode号码,因此是该目录的一个“硬链接”。后者的inode号码就是该目录的父目录的inode号码。所以,任何一个目录的”硬链接”总数,总是等于它的子目录总数(含隐藏目录)加2。即每个“子目录文件”中的“..”条目,加上它自身的“目录文件”中的“.”条目,再加上“父目录文件”中的对应该目录的条目。

2.硬链接

  若一个inode号码对应多个文件名,则称这些文件名为硬链接。换言之,硬链接就是同一个文件使用了多个别名。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。硬链接可由命令ln(或link)创建。如下是对文件 oldfile 创建硬链接:

ln oldfile newfile

运行上面这条命令以后,源文件oldfile与目标文件newfile的inode号相同,都指向同一个inode。inode信息中有一项为”Links”,记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode中的”Links”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号,以及其所对应block区域(只是把inode标记为可用,文件在block中的内容是没有被清除的,只有在有新的文件需要占用block的时候,才会被覆盖)。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。也因此,用户可以建立硬链接到重要文件,以防止“误删”的功能。

  硬链接存在以下几个特性:

  • 文件有相同的 inode 及 data block;
  • 只能对已存在的文件进行创建;
  • 不能交叉文件系统进行硬链接的创建(inode 号仅在各文件系统下是唯一的,当 Linux 挂载多个文件系统后将出现 inode 号重复的现象,因此硬链接创建时不可跨文件系统);
  • 不能对目录进行创建,只可对文件创建(防止产生目录环);
  • 删除一个硬链接文件并不影响其他有相同 inode 号的文件。

3.软链接

  软链接类似于Windows中的快捷方式。与硬链接不同,软链接文件用户数据块中存放的内容是另一文件的路径名的指向。因此,软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。软链接的创建方式如下:

ln -s oldfile(olddir) newfile(newdir)

  硬链接和软链接访问文件的方式如下:


这里写图片描述

  软链接存在以下几个特性:

  • 软链接有自己的文件属性及权限等;
  • 可对不存在的文件或目录创建软链接;
  • 软链接可交叉文件系统;
  • 软链接可对文件或目录创建;
  • 创建软链接时,链接计数“Links”不会增加;
  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接);
  • 软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的;
  • 软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接,因为链接数据块中记录的亦是相对路径指向。

4.其它

a).二者的联系与区别

  1. 修改软连接或者硬链接都会导致源文件改变,可以达到同步的目的;
  2. 删除软链接或者硬链接文件都不会删掉原始文件;
  3. 删除源文件会导致软连接失效 ,而硬链接文件还是完整的;
  4. 在文件属性上软链接明确写出了是链接文件(用“l”表示),而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系。

b).inode的特殊作用

  有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。


这里写图片描述

如上图所示,我们首先获取文件的inode号,然后据此获得文件名,最后再删除即可。


参考文献

[1] http://blog.csdn.net/haiross/article/details/39157885
[2] http://www.cnblogs.com/zengkefu/p/5603187.html
[3] http://www.th7.cn/system/lin/201611/189197.shtml
[4] https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/
[5] http://www.jb51.net/LINUXjishu/151939.html
[6] http://blog.csdn.net/wy7980/article/details/46423767
[7] http://www.cnblogs.com/crazylqy/p/5821105.html
[8] https://zh.wikipedia.org/wiki/Inode
[9] http://cn.linux.vbird.org/linux_basic/0230filesystem.php
以上为本文的全部参考文献,对原作者表示感谢。

原创粉丝点击