vault backup: 2026-11-07 16:33:44
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
删除原文件后链接不需要保留的就用软链接;删除原文件后链接还要保留的用硬链接。
|
||||
### 数据在Linux系统中是如何存储
|
||||
|
||||
为了理解什么是硬链接和软链接,需要了解数据在Linux系统中是如何存储的。
|
||||
|
||||
在计算机中,数据存储在硬盘上。硬盘被分成多个Block,每个Block又被分成很多称为扇区(sector)的小块。典型情况下,每个扇区的大小是 512 字节,Block的大小为4096字节,这种情况下,一个Block包含8个扇区。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
文件系统是以Block为单位分配空间的,你可以这么理解,即使你创建一个大小只有1字节的文件,它都会占用一个完整的Block。你用ls -l去查看这个文件的大小,会显示是4096 个字节大小。
|
||||
|
||||
但是如果你创建的文件大小超过4096个字节怎么办?答案是文件将被“碎片化”并存储到多个不同的Block中。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
### 什么是 inode
|
||||
|
||||
Inode 本质上是用于描述文件的数据结构,innode主要存储了如文件权限、文件类型、文件大小等文件元数据信息,但最重要的是存储了该文件的真实数据存放在磁盘上的哪些Block中。
|
||||
|
||||

|
||||
|
||||
需要注意的是`文件名不是 inode 的一部分。`
|
||||
|
||||
### 关于文件名和 inode
|
||||
|
||||
在 Linux 系统上,文件名保存在单独的索引中,这个单独的索引记录了系统上所有文件(包括目录)的文件名,并且它也知道每一个文件其对应的inode。
|
||||
|
||||

|
||||
|
||||
### Linux 上的硬链接和软链接是什么
|
||||
|
||||
有了上面的背景,现在我们可以来介绍硬链接和软链接了。
|
||||
|
||||
让我们从软链接开始,因为它可能是最容易理解的。
|
||||
|
||||
### 软链接
|
||||
|
||||
软链接,也称为符号链接,运行 ls 命令时,符号链接用文件类型“ l ”标识,同时文件名那一列是`链接名称 -> 所引用文件的文件名。`
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
这个图中,文件“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 指向包含原始文件路径的块。
|
||||
|
||||

|
||||
|
||||
不难看出,软链接下,链接文件和原始文件是共享文件的实际数据,这意味着如果我修改链接 文件的内容,其实就是修改了原始文件的内容。
|
||||
|
||||
如果我删除链接文件,它只会删除对第一个 inode(原始文件的 inode) 的引用。由于原始文件的 inode仍然引用磁盘上文件的内容,因此内容不会丢失,但是,如果我删除原始文件,将无法再读取该文件,符号链接会变成一个“断开”的链接,因为它指向的文件已经不存在了,这就是我们所说的悬空符号链接,即未指向任何内容的链接。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
现在,我们来思路另外一个问题:软链接的大小是多少?
|
||||
|
||||
为了说明这个问题,下面我创建了一个名为“devconnected”的文件,并使用 ln 命令为它建立了一个软链接。
|
||||
|
||||

|
||||
|
||||
可以看出软链接的大小是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 是相同的,但是文件名不同!
|
||||
|
||||
以下是此情况下文件系统发生的情况。
|
||||
|
||||

|
||||
|
||||
因此,如果修改硬链接文件中的内容,则原文件中的内容也会改变,同样地,如果你修改了原始文件中的内容,那么在硬链接文件中也会被修改。
|
||||
|
||||
但是,如果删除硬链接文件,您仍然可以访问原始文件内容,同样,删除原始文件不会对硬链接的内容产生任何影响,`这也是和软链接一个显著的不同点。`
|
||||
|
||||
最后需要注意的一点是`不能为目录创建硬链接`。
|
||||
|
||||
### 链接相关操作
|
||||
|
||||
### 创建软链接
|
||||
|
||||
要创建软链接,需要使用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)
|
||||
Reference in New Issue
Block a user