Linux中的硬链接和软链接

软链接类似Windows的快捷方式,将原文件删掉后,软链接会失效;

硬链接相当于将可执行文件copy了一份,删掉原来的,硬链接依然有效;


概述


Linux 文件系统是树状结构, 根目录下存在一系列子目录,目录里边有文件或者子目录

Linux 文件系统把硬盘分为三个部分:超级块、inode 列表、数据区

inode 指示该文件的数据存放在数据区的哪些块内。因为这个“映射”关系不能变更,因此,inode 相当于代表着文件本身。(值得注意的是,文件名与文件本身不是直接映射起来的,中间隔着 inode)

首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存,从而实现文件的快速访问。


而链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。

Linux中包括两种链接:

硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)



硬链接


本质是一个指针,指向文件索引节点,系统并不为它重新分配inode。

可以用 ln 命令来建立硬链接。

当为一个文件创建硬链接时,硬链接会使用和文件相同的inode号,此时会发现,原来文件的inode数由最初的1变为了2,实际上硬链接和文件使用了相同的inode,只不过是inode连接数增加了,删除文件不会影响硬链接,硬链接的inode数会从2变为1

只有将所有指向某文件的指针,也即链接数减为0时,内核才会真将文件内容从磁盘上删除。

另外,硬链接只能应用于文件,而不能应用于目录,且不能跨文件系统。


尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:

(1)不可以在不同文件系统的文件间建立链接

(2)只有超级用户才可以为目录创建硬链接。



软链接(符号链接)


软链接(符号链接)是对一个文件的间接指针, 而硬链接直接指向文件的inode。

软链接克服了硬链接的不足,可以作用于目录,也没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。

建立软链接,只要在ln后面加上选项 –s。

在创建文件的软链接时,软链接会使用一个新的inode,所以软链接的inode号和文件的inode号不同,软链接的inode里存放着指向文件的路径。

如果删除文件,软链接则也无法使用,因为文件的路径不存在了;当再次创建这个文件时(文件名与之前相同),软链接又会重新指向这个文件(inode号与之前不同了),而硬链接不会受其影响



总结


硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系,就像文件被复制了一份一样;链接数目是不一样的,软链接的链接数目不会增加,硬链接会相应的加一;文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,而这里软链接显示的大小与原文件就不同了。

硬链接有点像聚簇索引,数据和索引在一起.

软链接有些像非聚簇索引,数据和索引是独立的.




参考:

Linux内核分析与应用8-文件系统

文件系统的中枢—Inode结构体

Linux的硬链接和软连接(符号链接)的区别