AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 768504
Accepted
Rahul Sharma
Rahul Sharma
Asked: 2024-02-03 15:00:41 +0800 CST2024-02-03 15:00:41 +0800 CST 2024-02-03 15:00:41 +0800 CST

如果我们删除原始文件,为什么硬链接不会损坏?[复制]

  • 772
这个问题在这里已经有了答案:
删除硬链接时会发生什么? (3 个回答)
5 小时前关闭。
这个问题是从服务器故障 迁移过来的,因为它可以在 Unix & Linux Stack Exchange 上得到回答。9 小时前迁移 。

如果我们删除原始文件,为什么硬链接不会损坏?如果我删除原始文件,那么软链接会损坏,但硬链接不会损坏,所以为什么它不会损坏

linux
  • 3 3 个回答
  • 51 Views

3 个回答

  • Voted
  1. Jörg W Mittag
    2024-02-04T01:07:15+08:002024-02-04T01:07:15+08:00

    您似乎误解了Unix 中的硬链接和文件是什么。

    Unix 文件系统的基础是文件。文件是非结构化的匿名字节流。文件没有名称。它只有一个文件序列号,基本上是一个唯一的(对于该文件系统)标识符。(文件序列号有时称为inode)

    有几种不同类型的特殊文件由POSIX标准化:

    • 设备特殊文件(进一步分为)
      • 字符设备特殊文件
      • 阻止特殊文件
    • FIFO特殊文件(命名管道)
    • 套接字特殊文件
    • 目录特殊文件
    • 符号链接特殊文件

    操作系统可以添加自己的特殊文件,例如Solaris有doors。

    设备文件用于提供与设备交互的接口,例如传统上/dev/sda与第一硬盘交互的接口。FIFO 特殊文件的工作方式类似于 shell 管道,但由于它们有名称,因此读取和写入它们的两个进程可以在不同的时间和不同的安全上下文中启动。套接字允许类似于网络套接字的进程间通信,但仅限于本地计算机。

    现在我们讨论与您的问题相关的两种特殊文件:目录和符号链接。

    目录特殊文件实际上与现实生活中的目录非常相似。例如,考虑一下电话簿:它列出了人员的姓名及其电话号码。这正是 Unix 文件系统中目录的作用:它列出文件的名称及其文件序列号。

    这种名称和文件序列号的配对就是我们所说的硬链接(或简称链接)。

    当您在 Unix 中使用该rm实用程序“删除文件”时,您实际上并不是在“删除文件”。您正在从目录中删除该名称的条目,换句话说,您正在删除硬链接,而不是文件。这称为取消链接,实际上调用的rm是POSIX 库函数unlink。

    所以,当你做类似的事情时

    touch foo
    

    您尚未创建名为 的文件foo。您创建了一个没有名称但具有某些特定文件序列号的文件,并且您已向当前目录添加了一个目录条目,该目录条目将该名称链接foo到您刚刚创建的文件的文件序列号。

    现在,当您使用该ln实用程序创建第二个硬链接时:

    ln foo bar
    

    您已在当前目录中创建了第二个目录条目,该条目将名称链接bar到所链接的同一文件序列号foo。

    重要的是要认识到这两个链接都不是特殊的。它们是完全相同的。

    如果您现在取消链接foo:

    rm foo
    

    您所做的只是删除将名称链接foo到文件序列号的目录条目。您没有删除该文件。因此,您仍然可以使用该名称访问该文件bar,因为根本没有触及该目录条目。

    事实上,在 Unix 中你不能删除文件。您只能删除链接。一旦文件不再有指向它的链接并且不再打开,文件系统本身就会删除该文件。

    然而,符号链接是一个包含路径的特殊文件。即,当你这样做时

    ln -s /path/to/quux baz
    

    您实际上是将字符串/path/to/quux写入文件中。更准确地说,您正在使用内容创建一个符号链接特殊文件/path/to/quux ,并在当前目录中创建一个目录条目,该目录条目将名称baz与刚刚创建的文件的文件序列号链接起来。

    /path/to/quux是否解析为文件序列号实际上并不重要。事实上,有些程序使用它来进行一些巧妙的配置。例如,fnord和gatting Web 服务器使用符号链接来表示 HTTP 重定向,因此当您这样做时:

    ln -s https://www.google.com/ /var/www/search.html
    

    然后导航到http://mydomain/search.html会将您重定向到https://www.google.com/。

    所以,简而言之:

    如果我们删除原始文件,为什么硬链接不会损坏?

    因为你没有删除原来的文件。您仅删除了多个链接之一。无法再使用该特定名称访问该文件,但该文件仍然存在并且仍然可以使用其他名称访问。

    如果我删除原始文件,那么 sorflink 就会损坏

    再次强调,您并没有删除原始文件。您正在删除该名称。但符号链接指向名称而不是文件。因此,符号链接现在指向无法再解析为文件的名称。


    旁注:您可能已经注意到一些有趣的事情:目录提供名称到文件的映射。但目录本身也是文件。因此,目录也会自动提供名称到目录的映射。

    换句话说:目录在Unix中是可以任意嵌套的!

    今天这听起来可能不太令人兴奋,因为广泛使用的每个文件系统都允许任意深度的嵌套层次结构。但近 60 年前 Unix 诞生时,情况完全不是这样。当时的一些文件系统要么根本没有目录,要么有固定的嵌套级别(例如 2 层)。

    将目录制作为特殊文件可以免费为您提供分层文件系统,而无需添加任何特殊结构。这是一个非常优雅的设计。

    • 13
  2. Best Answer
    Danila Vershinin
    2024-02-03T15:32:59+08:002024-02-03T15:32:59+08:00

    这是因为硬链接本质上是对同一文件的引用,并且就硬链接而言不存在“原始”文件。它们指向磁盘上相同的数据结构(包含文件所有元数据的索引节点)。

    而软链接指向文件名而不是描述文件的数据结构。

    • 10
  3. shodanshok
    2024-02-03T22:28:14+08:002024-02-03T22:28:14+08:00

    在 Linux 上,文件系统范围内唯一标识文件的是inode数字。这只不过是一个数字ID,保证在整个文件系统中是唯一的(注意:可以回收,但在同一文件系统中inodes没有两个“活动”文件可以具有相同的)。inode

    文件名只不过是附加在inode特定目录内的“方便标签”。硬链接文件只不过是在相同或不同的目录中添加另一个这样方便的名称(在第一种情况下,新的硬链接必须具有不同的名称)。

    您可以inode通过查看该号码ls -i。例如:

    # ls -alni
    total 4
     68329917 drwxr-xr-x.  2 1000 1000   37 Feb  3 15:25 .
    101396179 drwx------. 25 1000 1000 4096 Feb  3 15:24 ..
     68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 test.txt
     68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 zzz.txt
    

    请注意zzz.txt,test.txt具有相同inode编号的 和 确实是同一文件 - 通过两个不同的名称引用。仅删除这两个名称之一并不会真正inode从文件系统中删除(取消链接),而另一个名称不受影响。

    软链接是完全不同的东西 - 它不是到原始文件的真正链接,而是指向原始文件路径/名称的inode特殊小文件(有自己的不同) 。删除原始文件会留下损坏的(“损坏的”)指针。inode

    • 4

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve