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

时间:2022-07-24
本文章向大家介绍详解 Linux 中的硬链接与软链接,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在 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
chenkc:~$ ll softlink_hello.txt
lrwxrwxrwx 1 chenkc chenkc 9 8-р с 25 19:17 softlink_hello.txt -> hello.txt # 红色

软链接不同于硬链接,在软链接中删除源文件会影响到软链接的使用,因此在 Linux 中会有很多地方标识文件是否为软链接:

  • ls -l指令输出的文件,其中十个字符中的第一个字符代表文件类型,如果文件为软链接文件则为l
  • Linux 会使用特殊的颜色将软链接文件与其它文件进行区分,如果删除了源文件,软链接失效则软链接文件也会呈现失效的颜色;

「如果软链接文件和源文件不在同一个目录下,源文件要使用绝对路径而不能使用相对路径。」 软链接主要应用在两个方面:

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

硬链接与软链接的区别

最后来简单总结一下硬链接和软链接的区别:

参考:

  1. http://www.itheima.com/
  2. https://www.linuxprobe.com/soft-hard-links-comments.html

【数据分析】Numpy中常用随机函数的总结

【数据分析】Numpy中的两个乱序函数

【机器学习】详解训练集、测试集以及验证集

【资源分享】电子书 | 廖雪峰 Python3 教程

【自然语言处理】使用 HanLP 统计二元语法中的频次