Linux 系统中有软链接和硬链接两种特殊的“文件”。
软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。
硬链接则透过文件系统的inode来产生新档名,而不是产生新档案。

1、创建方法

软链接(符号链接) ln -s source target
硬链接 (实体链接)ln source target

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

2、inode

要解释清楚两者的区别和联系需要先说清楚 linux 文件系统中的 inode 这个东西。
当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)
这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个文件的 inode。
Liunx 命令之链接操作 随笔 第1张
Inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber, 其他信息还有创建时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息。
Liunx 命令之链接操作 随笔 第2张

inode本身并不记录文件名
文件名记录在目录文件的block当中,所以新增、删除、更改文件名与目录的写权限有关。
因此当我们要读某个档案时,就务必经过其目录的inode和block,然后才能够找到待读取档案的inode号,最终才会读到正确的档案block内的数据。
系统是通过索引节点(而不是文件名)来定位每一个文件。

硬链接解析

当前目录下有两个文件soft_sourcefile和hard_sourcefile
这里我们注意在创建链接前,hard_sourcefile显示的链接数目为1,创建链接后
1.hard_sourcefile和hard_sourcefile_hardlink的链接数目都变为2。
2.hard_sourcefile和hard_sourcefile_hardlink的inode号是一样的,都是492911。
3.hard_sourcefile和hard_sourcefile_hardlink显示的文件大小也是一样,都是16B。
Liunx 命令之链接操作 随笔 第3张

可见进行了ln命令的操作结果:
1)hard_sourcefile和hard_sourcefile_hardlink是同一个文件的两个名字,
2)它们具有同样的索引节点号和文件属性,建立文件hard_sourcefile的硬链接,就是为 hard_sourcefile的文件索引节点在当前目录上建立一个新指针。
3)你可以删除其中任何一个,如rm hard_sourcefile,每次只会删除一个指针,链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。
Liunx 命令之链接操作 随笔 第4张

尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一些不足之处:
1)不允许给目录创建硬链接。
2)不可以在不同文件系统的文件间建立链接。因为 inode 是这个文件在当前分区中的索引值,是相对于这个分区的,当然不能跨越文件系统了。

软链接解析

Liunx 命令之链接操作 随笔 第5张
从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是完全不同的。
Liunx 命令之链接操作 随笔 第6张

软链接和硬链接的区别:

1)硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;
2)在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
3)链接数目是不一样的,软链接的链接数目不会增加;
4)文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了,soft_sourcefile大小是16B,而soft_sourcefile_symbolic是15B。
5)软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接

总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

当然软链接也有硬链接没有的缺点:
1)因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;
2)还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄