Linux文件系统之硬连接和软连接(符号连接)

作者: 郭子渝 分类: 红帽认证 发布时间: 2020-03-07 20:02 本文共2759个字,阅读需要7分钟。

有关Linux文件系统的介绍我已经在之前的博文中提到,但是那篇博文是概要介绍,没有详细解释硬连接软连接符号连接),在阅读这篇博文之前建议阅读我那篇关于Linux文件系统的博文

首先我们明确一点:Linux一切皆文件,包括硬件,进程和文件夹也是文件

我们可以将文件夹想象成一个多行两列的文件,里面记录了本文件夹下的文件名称和对应的Inode号,可以使用ls -i查看

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客
[root@gzy2000 wechat_sync]# ls -i
918388 img.jpg
918387 index.py
918386 log.txt
918389 token.txt
918017 wxchat_mp.db

左边显示的是Inode节点号,右边是文件名,不管文件名称是什么,相同的Inode指向相同的数据块,所以同一个文件系统如果Inode一致的话,文件会完全相同,

具体关于Inode是什么请翻阅我关于文件系统的博文,如果还是没有理解,您可以留言提问。

我们知道Linux返回上级目录的快捷命令是

cd ..

那么为什么使用这个命令会返回上级目录呢,因为除了根目录,每个目录下都会有两个特殊文件:. 和..,我们可以使用ls -a查看,我这里想顺便查看他的Inode号码,所以使用ls -ai命令

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客
boot目录下的ls -ai

现在再来观察一下他上级目录中的Inode节点号码,他的上级目录是根

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

细心的朋友可能已经发现在根目录下,boot的Inode号码和boot目录下.的号码都是131074,所以当你cd ..的时候,你的文件系统会从你目录这个文件找到..对应的Inode节点号码,然后去找Inode节点表找到这个编号对应的地址。

打个比方,目录等于你爸爸,管理本级目录中的文件,不含下级目录,文件系统是个链表结构,只能管理直属下级,他能管儿子,但是不能管孙子。文件名当作你的名字,你的名字可以重复,因为每个爸爸都是分开管理的,他怎么会知道别人的儿子叫什么名字,但是最后去公安注册的时候,公安会给你分配一个唯一的身份证号码(Inode号码)并记录在你的户口本,等于是告诉你爸爸

警察叔叔要去找你,他们从你爸爸口中知道你的姓名和身份证号码(Inode号码),然后通你的身份证号码(Inode号码)去公安系统(Inode Table)里面查询你的当前地址,就假定你和你爸不在一起吧!本来你也不可能连在你爸爸身上,文件系统里面是根据Inode节点定义你的地址,同一个目录下的文件和目录本身也不一定在一起,在一起纯属巧合。

我不知道上面那个比喻会不会很难看懂,你也可以结合下图进行理解

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

如果还是无法理解,请评论您的问题,我会尽量解答。

好了,言归正传,我们cd ..和cd/boot的时候,文件系统并不是查询..和boot这两个名字,而是根据他们的目录得知他们对应的Inode号码,而他们的Inode号码一样,当然是同一个文件了,此时,我们称这两个文件互为硬连接

我讲的可能有点啰嗦,因为文件系统实在复杂,我是为了给大家都能看懂,大佬可能跳过直接看最下面的命令,小白如果还是看不懂可以评论或者联系我,我也和你们一样都是从小白走过来的,我也接受过很多的帮助。

我们可以通过以下命令创建硬连接

ln 源文件名 新文件路径

通过这个命令,我们可以为文件创建硬连接,目前我们不建议为目录创建硬连接,因为如果你在本级目录下创建上级目录的硬连接,会造成死循环,文件系统直接崩溃,比如你在boot目录下创建根文件系统的硬连接,那当你使用find命令查找文件的时候,会造成死循环,符号连接和系统自带的两个隐含文件.和..是因为提前知道他们的特征,所以可以做一些防范,但是硬连接使用了相同的Inode节点,导致他和源文件完全一致,无法判断。所以我们无法创建对目录的永久硬连接,为目录创建临时硬连接需要mount命令,可以点击超链接进行了解!

以下是两个互为硬连接的文件,你也可以创建多个文件互为硬连接,他们之间并没有主从关系,修改任何一个,其他文件内容也会变更,他更多的用于备份文件,比如你有一个很关键的文件,如果你没有额外创建硬连接,那么当你误执行rm命令之后,文件系统检测到没有任何目录引用这个Inode,那么他就会将这个Inode释放,没有Inode,你的数据虽然还在硬盘,但是已经大海捞针,基本找不回来了,这也是为什么删除一个命令很快,拷贝一个文件可能要一定的时间,删除一个文件删除他的元数据就行,他对应的空间自然会被新文件覆盖,拷贝一个文件就不是写入一个元数据那么简单,还需要将文件写入数据区中。

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

但是如果你提前创建了一个硬连接,那么文件系统发现还有目录注册这个硬连接,那么Inode就不会释放掉。所以对于关键文件,请多作几个硬连接!

请容我在打个比方,你的身份证号码原本在美国有国籍,现在你在加拿大再注册一个国籍,请问在两个地方注册国籍,你会多一个你嘛,同样都是你,当你被美国开除国籍(文件被rm删除之后)之后,你起码不是个黑户(只存在数据区,但是找你大海捞针)。所以你的文件名可以不一样,用不同的名字在不同目录中注册,但是人肯定是一样!

硬连接说完,我们来说软连接(符号连接):

软连接(符号连接)用于给文件作快捷方式,有两个作用

  • 便于文件的管理,比如把一个复杂路径下的文件链接到一个简单路径下方便用户访问。
  • 节省空间解决空间不足问题,某个文件文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那么可以把另一个剩余空间较多的文件系统中的目录链接到该文件系统中。

我们知道硬连接是在目录中,是把一个Inode在不同目录中注册。他有两个个局限性,

  • 不能跨文件系统,因为跨文件系统就是不同的超级块,不同的Inode表,数据区存储的文件也不一样
  • 不能对目录作永久连接。

我们可以使用如下命令创建软连接(符号连接

ln -s
Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

符号连接是不同的Inode号码,文件数据就相当于一张名片,告诉别人你的位置,注意看截图中的文件大小有14个字节,因为/root/index.py有14个字符,如果是连接到/root/wechat_sync/index.py就是26个字符,如下图

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

两个符号连接和源文件之间有不同的Inde号码,但是两个硬连接之间Inode号码相同号码。

如果我们将源文件删除,则软连接会变成一个死连接。但是和他互为硬连接的文件不受影响

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

细心的朋友可能发现这两张截图中,第三列原本是2,现在是1,这个数字就是这个文件在文件系统的硬连接数量。

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

我分别用7个名字在同一个目录注册,剩下那个在wechat_sync目录下,总共8个硬连接。

关于这个硬连接计数我个人也不是很理解,我询问过我的Linux导师唐波,他的回复如下

Linux文件系统之硬连接和软连接(符号连接)-郭子渝的博客

鉴于这个帖子随时会被释放,所以我不在这里发布帖子链接,有兴趣的朋友可通过点击上面的超链接进入他的论坛查询。

如果觉得我的文章对您有用,请订阅我的博客。您的支持将鼓励我继续创作!
Scroll Up