删除原文件后链接不需要保留的就用软链接;删除原文件后链接还要保留的用硬链接。 ### 数据在Linux系统中是如何存储 为了理解什么是硬链接和软链接,需要了解数据在Linux系统中是如何存储的。 在计算机中,数据存储在硬盘上。硬盘被分成多个Block,每个Block又被分成很多称为扇区(sector)的小块。典型情况下,每个扇区的大小是 512 字节,Block的大小为4096字节,这种情况下,一个Block包含8个扇区。 ![](https://pic4.zhimg.com/v2-1d889e019bfb59d5c1644f3a230d1ccd_b.jpg) 文件系统是以Block为单位分配空间的,你可以这么理解,即使你创建一个大小只有1字节的文件,它都会占用一个完整的Block。你用ls -l去查看这个文件的大小,会显示是4096 个字节大小。 但是如果你创建的文件大小超过4096个字节怎么办?答案是文件将被“碎片化”并存储到多个不同的Block中。 ![](https://pica.zhimg.com/v2-2cb3ec176ac23c2bd4f29791c32530b0_b.jpg) ### 什么是 inode Inode 本质上是用于描述文件的数据结构,innode主要存储了如文件权限、文件类型、文件大小等文件元数据信息,但最重要的是存储了该文件的真实数据存放在磁盘上的哪些Block中。 ![](https://pic1.zhimg.com/v2-b9d9b12c52253bcb7d2262ed20515c48_b.jpg) 需要注意的是`文件名不是 inode 的一部分。` ### 关于文件名和 inode 在 Linux 系统上,文件名保存在单独的索引中,这个单独的索引记录了系统上所有文件(包括目录)的文件名,并且它也知道每一个文件其对应的inode。 ![](https://pic2.zhimg.com/v2-07aec1f31b0217562f9aa572be8f2335_b.jpg) ### Linux 上的硬链接和软链接是什么 有了上面的背景,现在我们可以来介绍硬链接和软链接了。 让我们从软链接开始,因为它可能是最容易理解的。 ### 软链接 软链接,也称为符号链接,运行 ls 命令时,符号链接用文件类型“ l ”标识,同时文件名那一列是`链接名称 -> 所引用文件的文件名。` ![](https://pic1.zhimg.com/v2-4e56744b67504bfb7ab1259a5a5aec5a_b.jpg) 这个图中,文件“shortcut”指向我文件系统上的文件“file.txt ”。 现在我们来看一下原文件file.txt的 inode 和shortcut的 inode。 ```text $ stat shortcut File: shortcut -> file.txt Size: 3 Blocks: 0 IO Block: 4096 symbolic link Device: fc01h/64513d Inode: 258539 Links: 1 $ stat file.txt File: job Size: 59 Blocks: 8 IO Block: 4096 regular file Device: fc01h/64513d Inode: 258545 Links: 2 ``` 可以看出,两个文件的 inode不同,但是两者也有一定的关联:原始文件 inode 直接指向文件内容(即包含实际数据的块),而符号链接“shortcut”的 inode 指向包含原始文件路径的块。 ![](https://picx.zhimg.com/v2-fe57cc60ace1b1a7db01c6a9aaf02a59_b.jpg) 不难看出,软链接下,链接文件和原始文件是共享文件的实际数据,这意味着如果我修改链接 文件的内容,其实就是修改了原始文件的内容。 如果我删除链接文件,它只会删除对第一个 inode(原始文件的 inode) 的引用。由于原始文件的 inode仍然引用磁盘上文件的内容,因此内容不会丢失,但是,如果我删除原始文件,将无法再读取该文件,符号链接会变成一个“断开”的链接,因为它指向的文件已经不存在了,这就是我们所说的悬空符号链接,即未指向任何内容的链接。 ![](https://pica.zhimg.com/v2-8915c9f44a55dd9f7c2c0ae6791230ec_b.jpg) 现在,我们来思路另外一个问题:软链接的大小是多少? 为了说明这个问题,下面我创建了一个名为“devconnected”的文件,并使用 ln 命令为它建立了一个软链接。 ![](https://pica.zhimg.com/v2-8d09a338063b6556d689a9b324e9c376_b.jpg) 可以看出软链接的大小是12,这个大小正好是原始文件名 “devconnected”的长度。 最后需要说明的是:软链接可以指向不同的文件系统,包括指向远程文件系统。如果您使用 NFS(网络文件系统),则可以创建从一个文件系统到网络访问的文件系统的软链接。 ### 硬链接 我们再来看一下原始文件 inode和硬链接 inode。 ```text $ stat hardlink File: hardlink Size: 59 Blocks: 8 IO Block: 4096 regular file Device: fc01h/64513d Inode: 258545 Links: 2 $ stat file.txt File: file.txt Size: 59 Blocks: 8 IO Block: 4096 regular file Device: fc01h/64513d Inode: 258545 Links: 2 ``` 您可能已经注意到,inode 是相同的,但是文件名不同! 以下是此情况下文件系统发生的情况。 ![](https://pic2.zhimg.com/v2-1e44d9e3b14fb2b63ec8221e7bc0625f_b.jpg) 因此,如果修改硬链接文件中的内容,则原文件中的内容也会改变,同样地,如果你修改了原始文件中的内容,那么在硬链接文件中也会被修改。 但是,如果删除硬链接文件,您仍然可以访问原始文件内容,同样,删除原始文件不会对硬链接的内容产生任何影响,`这也是和软链接一个显著的不同点。` 最后需要注意的一点是`不能为目录创建硬链接`。 ### 链接相关操作 ### 创建软链接 要创建软链接,需要使用ln命令,带有-s选项(表示符号)和两个参数,第一个参数指定想要链接到的原文件名称,第二个参数指定即将创建的软链接的名称。 ```text $ ln -s file shortcut $ ls -l -rw-rw-r-- 1 schkn schkn 0 Aug 14 20:12 file lrwxrwxrwx 1 schkn schkn 4 Aug 14 20:12 shortcut -> file ``` 还可以创建到目录的软链接: ```text $ mkdir folder $ ln -s folder shortcut-folder $ ls -l drwxrwxr-x 2 schkn schkn 4096 Aug 14 20:13 folder lrwxrwxrwx 1 schkn schkn 7 Aug 14 20:14 shortcut-folder -> folder/ ``` ### 删除软链接 要删除现有的软链接,使用unlink命令,后面的参数是要删除的软链接名称。 ```text $ unlink shortcut $ ls -l -rw-rw-r-- 1 schkn schkn 0 Aug 14 20:12 file ``` ### 创建硬链接 创建硬链接也是使用ln命令,只是不需要-s选项。 ```text $ ln file hardlink $ ls -l -rw-rw-r-- 2 schkn schkn 0 Aug 14 20:12 file -rw-rw-r-- 2 schkn schkn 0 Aug 14 20:12 hardlink ``` ### 删除硬链接 同样,可以使用unlink命令删除 Linux 系统上的硬链接。 ```text $ ln file hardlink $ unlink hardlink $ ls -l -rw-rw-r-- 2 schkn schkn 0 Aug 14 20:12 file ``` ### 查找系统上的链接 在 Linux 系统上可以使用find 命令查找链接,find 命令有一个选项可以指定类型来查找文件,因此可以使用它来查找系统上的链接: ```text $ find . -type l -ls 262558 0 lrwxrwxrwx 1 schkn schkn 7 Aug 14 20:14 ./shortcut-folder2 -> folder2/ 262558 0 lrwxrwxrwx 1 schkn schkn 7 Aug 14 20:14 ./shortcut-folder -> folder/ ``` [编辑于 2024-07-09 19:19](https://zhuanlan.zhihu.com/p/707875954)