符号链接与硬链接的区别是什么?

硬链接Hard links)和符号链接symbolic links)是引用硬盘驱动器中文件的两种不同方法。这些方法是文件系统的一部分,用于定义文件是什么以及在哪里。硬链接本质上是文件的同步副本,直接引用文件的 inode。而符号链接直接引用指向 inode 的文件,更像是一种快捷方式。为了理解符号链接和硬链接的工作原理,我们需要了解什么是 inode。

符号链接与硬链接的区别是什么?
符号链接与硬链接的区别是什么?

什么是inode?

inode 是一个数据库,用于描述文件/目录属性,例如元数据和硬盘上的物理位置。它们本质上是完整地址的数字等价物。使用 inode,操作系统可以检索访问文件所需的权限和硬盘驱动器上的物理位置等信息。如果将文件从一个文件夹移动到另一个文件夹,该文件将被移动到硬盘驱动器上的不同位置,并且其 inode 值将自动更改。这对于硬链接很重要。

什么是硬链接?

在计算中,硬链接是将名称与文件系统上的文件相关联的目录条目。—维基百科

硬链接是通过其 inode 直接引用文件。硬链接只能用于文件而不能用于目录。通过使用硬链接,即使更改原始文件的内容或位置,硬链接仍将指向原始文件,这是因为它的 inode 仍指向该文件。没有对原始文件的引用。此外,硬链接只能引用同一卷内的文件,否则需要使用符号链接。

硬链接语法:

┌──The link command
│
│                          ┌──Path to the intended link, can use . or ~
│                          │
│                    ┌─────┴──────┐
ln /path/to/original /path/to/link
    └───────┬───────┘
            └──Path to the original file/folder can
               use . or ~ or other relative paths

在计算中,符号链接(也称为软链接)是一种特殊类型的文件,它以绝对或相对路径的形式包含对另一个文件或目录的引用,并影响路径名解析。—维基百科

符号链接本质上是引用文件而不是其 inode 值的快捷方式。此方法可以应用于目录,并且可以跨不同的硬盘/卷进行引用。由于符号链接指的是原始文件而不是其 inode 值,因此将原始文件替换到不同的文件夹将破坏符号链接,或创建一个空链接。

符号链接有点像同时在两个地方拥有一个目录或文件。如果在./file-a路径中执行某文件,它实际上是运行在 ./file-b路径。

符号链接:

┌──The link command
│   ┌──Create a symbolic link
│   │                         ┌── Path to the intended symlink, can use . or ~
│   │                         │
│   │                   ┌─────┴────────┐
ln -s /path/to/original /path/to/symlink
        └───────┬───────┘
                └── the path to the original file/folder
                    can use . or ~ or other relative paths

顾名思义,软链接硬链接更“脆弱” 。以下是硬链接可以做,但软链接不能做的事情:

  • 硬链接的两端都可以重命名,链接将保持不变。
  • 两端可以移动,但链接仍然存在。
  • 硬链接的源目录可以删除,目标链接将保持不变。

软链接可以做硬链接不可以做的事情

  • 从一个文件系统到另一个文件系统,例如从你的主机到一个虚拟机。

文件实际上是指向 inode 的链接,硬链接会创建另一个文件,其中包含指向同一 inode 的链接。

下面进行简单的测试,可以创建以下测试文件:

$ mkdir link-test \
  && cd link-test \
  && echo Banana > File_A \
  && echo Apple > File_B \
  && echo Orange > File_C \
  && mkdir Dir_A \
  && mv File_C Dir_A/File_C

最终在link-test下是这样的:

├── Dir_A
│   └── File_C
├── File_A
└── File_B

如果查看File_A的 inode 编号:

$ ls -i File_A
51882811 File_A

使用stat命令查看存储在 inode 中的所有属性:

$ stat -x File_A
    File: "File_A"
    Size: 7            FileType: Regular File
    Mode: (0644/-rw-r--r--)         Uid: (  501/   bob)  Gid: (   20/   staff)
Device: 1,4   Inode: 51882811    Links: 1Access: Tue Jan 20 09:14:04 2015
Modify: Tue Jan 20 09:14:04 2015
Change: Tue Jan 20 09:14:04 2015

上面是在 OS X 上,如果在其他系统上的输出可能略有不同。

可以根据文件的 inode 号删除该文件:

$ find . -inum 51882811 -exec rm -i {} ;

在硬链接中,链接位于 inode 和文件之间:

$ ln File_A File_B

┌──────────┐     ┌──────────┐
│  File_A  |     |  File_B  |
└─────┬────┘     └─────┬────┘
      |                |
      └─────┐  ┌─link──┘
            |  |
      ┌─────┴──┴─────┐
      |    inode     |
      | representing |
      |    File_A    |
      └──────────────┘

由于软链接与 inode 无关,软链接与文件之间关系如下:

$ ln -s File_A File_B

  ┌──────────┐          ┌──────────┐
  |  File_A  ├───link───|  File_B  |
  └─────┬────┘          └──────────┘
        |
        └─────┐
              |
        ┌─────┴────────┐
        |    inode     |
        | representing |
        |    File_A    |
        └──────────────┘

作者:牛奇网,本站文章均为辛苦原创,在此严正声明,本站内容严禁采集转载,面斥不雅请好自为之,本文网址:https://www.niuqi360.com/linux/difference-between-symbolic-links-and-hard-links/

(0)
牛奇网牛奇网
上一篇 2022年5月23日 上午8:59
下一篇 2022年5月24日 下午8:11

发表回复

登录后才能评论