相关文章推荐
力能扛鼎的剪刀  ·  关于贯彻落实中共中央国务院关于进一步做好下岗 ...·  3 月前    · 
爱喝酒的核桃  ·  水龍敬 - 萌娘百科 萬物皆可萌的百科全書·  11 月前    · 
打酱油的莴苣  ·  苹果 iPad Air 5 ...·  1 年前    · 
旅行中的回锅肉  ·  【原神漫画】18 想要天空之翼的荧 下篇 ...·  1 年前    · 
道上混的杯子  ·  《斗罗大陆:魂师对决》手游公测_新浪游戏_手 ...·  2 年前    · 
Code  ›  详解 Linux 中的硬链接与软链接开发者社区
https://cloud.tencent.com/developer/article/1690636
任性的棒棒糖
2 年前
作者头像
触摸壹缕阳光
0 篇文章

详解 Linux 中的硬链接与软链接

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > AI机器学习与深度学习算法 > 详解 Linux 中的硬链接与软链接

详解 Linux 中的硬链接与软链接

作者头像
触摸壹缕阳光
发布 于 2020-09-01 23:18:06
4.8K 2
发布 于 2020-09-01 23:18:06
举报

在 Windows 中安装应用程序,通常安装向导会提示是否创建桌面快捷方式。如果选择同意创建,安装完成后会在桌面上看到对应应用程序的图标,如果想要使用这个应用程序只需要双击桌面上的快捷方式即可,这就是 Windows 中的快捷方式。Linux 链接文件类似于 Windows 中的快捷方式,Linux 链接文件分为硬链接和软链接,不过在具体介绍 Linux 中的硬链接和软链接之前,先来看看 Linux 文件系统中文件的具体结构。

在 Linux 文件系统中,一个文件被分成两个部分:元数据(metadata)与用户数据(user data)。元数据为文件的附加属性,如索引节点(Inode)、文件大小、文件创建时间、文件所有者等。 「元数据中并不包含文件名,文件名仅仅是为了方便用户使用。Linux 文件系统为每一个保存在磁盘分区中的文件(无论什么类型)都分配一个索引节点号(Inode Number),索引节点号是文件在一个文件系统中的唯一标识,不同文件所对应的索引节点号是不相同的;」 用户数据,即文件数据块(data block),文件数据块中以二进制的形式记录着文件的真实内容。

如果想要查看对应文件的索引节点号可以使用 ls -i 指令:

chenkc:~$ vim hello.txt
chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc:~$ ls -i hello.txt 
1837900 hello.txt

硬链接

在 Linux 中允许多个文件名指向同一个索引节点号,而硬链接(hard link, 也称链接)指的是通过索引节点号进行的链接。可以通过 ln 指令为文件创建硬链接:

ln 源文件 链接文件

为 hello.txt 文件创建两个硬链接:

chenkc:~$ ln hello.txt hardlink_hello.txt
chenkc:~$ ln hello.txt hardlink_hello2.txt
chenkc:~$ ls -il
total 675432
1837900 -rw-r--r--  3 chenkc chenkc        56 8-р с 24 21:34 hello.txt
1837900 -rw-r--r--  3 chenkc chenkc        56 8-р с 24 21:34 hardlink_hello.txt
1837900 -rw-r--r--  3 chenkc chenkc        56 8-р с 24 21:34 hardlink_hello2.txt
...

源文件和两个硬链接文件的索引节点号都为 1837900,而索引节点号为文件的唯一标识, 「因此源文件和硬链接文件是仅文件名不同的相同文件,创建文件的硬链接相当于为文件又起了一个新的文件名。」

此时的 hello.txt、hardlink_hello.txt 以及 hardlink_hello2.txt 拥有相同的索引节点号,查看文件内容也会发现为同一个文件:

chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc:~$ cat hardlink_hello.txt
AI机器学习与深度学习算法
chenkc:~$ cat hardlink_hello2.txt
AI机器学习与深度学习算法

执行 ls -il 指令后发现在表示文件类型以及权限的 10 个字符之后有一个数字 3,对于文件来说 3 表示硬链接数,每一个硬链接数都可以看成是文件的一个文件名,此时 inode:1837900 的文件拥有 3 个文件名。

假设我们现在删除硬链接对应的源文件 hello.txt:

chenkc:~$ rm -rf hello.txt
chenkc:~$ cat hardlink_hello.txt
AI机器学习与深度学习算法
chenkc:~$ cat hardlink_hello2.txt
AI机器学习与深度学习算法

「如果删除硬链接对应的源文件,硬链接文件仍然存在,这是因为硬链接是有着相同索引节点号仅文件名不同的文件,因此,删除一个硬链接文件并不影响其他有相同索引节点号的文件。我们可以为重要的文件创建硬链接,这样即使错误操作误删了文件,也不会重要文件造成影响。」 当文件没有任何文件名指向的时候,文件也会被删除,也就是此时的硬链接数为 0。硬链接相当于为文件创建了一个新的文件名,当删除其中一个链接的时候并不影响索引节点本身以及其它链接到该索引节点的文件名,所以这些链接是相对独立的,这也是为什么 Linux 中仅仅标识文件硬链接的数目,并没有显示的标识文件是否为硬链接文件的原因。

软链接

软链接(也称符号链接)可以看成是一个普通的文件, 「只不过这个文件中的数据块存放的是源文件的索引节点号。」 可以通过为 ln 指令添加 -s (s: soft 的意思)选项创建软链接:

ln -s 源文件 链接文件

为 hello.txt 文件创建一个软链接:

chenkc:~$ ln -s hello.txt softlink_hello.txt
chenkc:~$ ls -il
total 675236
1837900 -rw-r--r--  1 chenkc chenkc        36 8-р с 25 18:55 hello.txt
6705 lrwxrwxrwx  1 chenkc chenkc         9 8-р с 25 18:57 softlink_hello.txt -> hello.txt
...

源文件的索引节点号为 1837900,而软链接文件的索引节点号为 6705,显然源文件和软链接文件并不是同一个文件,其实从两个文件的大小也可以看出来,其中源文件大小为 36 个字节,而软链接文件大小仅仅为 9 个字节。

软链接文件的数据块中仅仅存放着源文件的索引节点号,这也是为什么源文件为 36 个字节,而软链接文件却有 9 个字节的原因。 「由于软链接只不过是数据块中存放了源文件的索引节点号,因此删除软链接文件并不会影响源文件。但是如果删除源文件,由于软链接文件中指向的索引节点号对应的文件没有了,所以会导致软链接文件失效。」

chenkc:~$ rm -rf softlink_hello.txt # 删除软链接文件并不影响源文件
chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc:~$ ll hello.txt softlink_hello.txt
-rw-r--r-- 1 chenkc chenkc 36 8-р с 25 19:16 hello.txt
lrwxrwxrwx 1 chenkc chenkc  9 8-р с 25 19:17 softlink_hello.txt -> hello.txt
chenkc:~$ rm -rf hello.txt
chenkc:~$ cat softlink_hello.txt
cat: softlink_hello.txt: No such file or directory
 
推荐文章
力能扛鼎的剪刀  ·  关于贯彻落实中共中央国务院关于进一步做好下岗失业人员再就业工作的通知若干问题的意见-国务院国有资产监督管理委员会
3 月前
爱喝酒的核桃  ·  水龍敬 - 萌娘百科 萬物皆可萌的百科全書
11 月前
打酱油的莴苣  ·  苹果 iPad Air 5 最低配机型不支持内存交换,但仍支持 iPadOS 16 台前调度功能 - IT之家
1 年前
旅行中的回锅肉  ·  【原神漫画】18 想要天空之翼的荧 下篇 - 哔哩哔哩
1 年前
道上混的杯子  ·  《斗罗大陆:魂师对决》手游公测_新浪游戏_手机新浪网
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号