在 Windows 中安装应用程序,通常安装向导会提示是否创建桌面快捷方式。如果选择同意创建,安装完成后会在桌面上看到对应应用程序的图标,如果想要使用这个应用程序只需要双击桌面上的快捷方式即可,这就是 Windows 中的快捷方式。Linux 链接文件类似于 Windows 中的快捷方式,Linux 链接文件分为硬链接和软链接,不过在具体介绍 Linux 中的硬链接和软链接之前,先来看看 Linux 文件系统中文件的具体结构。
在 Linux 文件系统中,一个文件被分成两个部分:元数据(metadata)与用户数据(user data)。元数据为文件的附加属性,如索引节点(Inode)、文件大小、文件创建时间、文件所有者等。元数据中并不包含文件名,文件名仅仅是为了方便用户使用。Linux 文件系统为每一个保存在磁盘分区中的文件(无论什么类型)都分配一个索引节点号(Inode Number),索引节点号是文件在一个文件系统中的唯一标识,不同文件所对应的索引节点号是不相同的;用户数据,即文件数据块(data block),文件数据块中以二进制的形式记录着文件的真实内容。
如果想要查看对应文件的索引节点号可以使用ls -i
指令:
chenkc@chenkc:~$ vim hello.txt
chenkc@chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc@chenkc:~$ ls -i hello.txt
1837900 hello.txt
1. 硬链接
在 Linux 中允许多个文件名指向同一个索引节点号,而硬链接(hard link, 也称链接)指的是通过索引节点号进行的链接。可以通过ln
指令为文件创建硬链接:
ln 源文件 链接文件
为 hello.txt 文件创建两个硬链接:
chenkc@chenkc:~$ ln hello.txt hardlink_hello.txt
chenkc@chenkc:~$ ln hello.txt hardlink_hello2.txt
chenkc@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@chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc@chenkc:~$ cat hardlink_hello.txt
AI机器学习与深度学习算法
chenkc@chenkc:~$ cat hardlink_hello2.txt
AI机器学习与深度学习算法
执行ls -il
指令后发现在表示文件类型以及权限的 10 个字符之后有一个数字 3,对于文件来说 3 表示硬链接数,每一个硬链接数都可以看成是文件的一个文件名,此时inode:1837900
的文件拥有 3 个文件名。
假设我们现在删除硬链接对应的源文件 hello.txt:
chenkc@chenkc:~$ rm -rf hello.txt
chenkc@chenkc:~$ cat hardlink_hello.txt
AI机器学习与深度学习算法
chenkc@chenkc:~$ cat hardlink_hello2.txt
AI机器学习与深度学习算法
如果删除硬链接对应的源文件,硬链接文件仍然存在,这是因为硬链接是有着相同索引节点号仅文件名不同的文件,因此,删除一个硬链接文件并不影响其他有相同索引节点号的文件。我们可以为重要的文件创建硬链接,这样即使错误操作误删了文件,也不会重要文件造成影响。当文件没有任何文件名指向的时候,文件也会被删除,也就是此时的硬链接数为 0。硬链接相当于为文件创建了一个新的文件名,当删除其中一个链接的时候并不影响索引节点本身以及其它链接到该索引节点的文件名,所以这些链接是相对独立的,这也是为什么 Linux 中仅仅标识文件硬链接的数目,并没有显示的标识文件是否为硬链接文件的原因。
2. 软链接
软链接(也称符号链接)可以看成是一个普通的文件,只不过这个文件中的数据块存放的是源文件的索引节点号。可以通过为ln
指令添加-s
(s: soft 的意思)选项创建软链接:
ln -s 源文件 链接文件
为 hello.txt 文件创建一个软链接:
chenkc@chenkc:~$ ln -s hello.txt softlink_hello.txt
chenkc@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@chenkc:~$ rm -rf softlink_hello.txt # 删除软链接文件并不影响源文件
chenkc@chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc@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@chenkc:~$ rm -rf hello.txt
chenkc@chenkc:~$ cat softlink_hello.txt
cat: softlink_hello.txt: No such file or directory
chenkc@chenkc:~$ ll softlink_hello.txt
lrwxrwxrwx 1 chenkc chenkc 9 8-р с 25 19:17 softlink_hello.txt -> hello.txt # 红色
软链接不同于硬链接,在软链接中删除源文件会影响到软链接的使用,因此在 Linux 中会有很多地方标识文件是否为软链接:
-
ls -l
指令输出的文件,其中十个字符中的第一个字符代表文件类型,如果文件为软链接文件则为l
; - Linux 会使用特殊的颜色将软链接文件与其它文件进行区分,如果删除了源文件,软链接失效则软链接文件也会呈现失效的颜色;
注意:如果软链接文件和源文件不在同一个目录,源文件要使用绝对路径,不能使用相对路径。
3. 硬链接和软链接的区别
最后来简单总结一下硬链接和软链接的区别: