什么是“ln -L”(--逻辑)?

use*_*520 4 linux hardlink ln proc

我可以在 ln 手册页中阅读:

   -L, --logical
          make hard links to symbolic link references
Run Code Online (Sandbox Code Playgroud)

我在某处阅读了ln -L可以使用文件系统重新链接已删除但仍处于打开状态的/proc文件的地方。例如:

ln -L /proc/1234/fd/12 /tmp/my-file
Run Code Online (Sandbox Code Playgroud)

但我得到ENOENT:没有这样的文件或目录。如果我尝试使用不同的文件系统,则会得到无效的跨设备链接。

如果我不能ln -L用来恢复已删除的文件,那么它可以用来做什么?

ktf*_*ktf 6

好吧,对新手更友好一点的答案......

一些基础知识

关于文件如何在 UNIX/Linux 系统上存储的一个简单视图是: 有一个目录条目,由您使用ls -l看到的名称和一个 Inode 编号(您可以使用ls -i看到)组成。Inode 包含您的数据存储在文件系统上的实际信息(包括所有权、权限、必要时更多 Inode 等):

(是时候体验 UTF-8 的乐趣了……;-))

简单视图:

???????????????????    ?????????    ???????????????
? directory entry ? ?? ? Inode ? ?? ? data blocks ?
???????????????????    ?????????    ???????????????
Run Code Online (Sandbox Code Playgroud)

现在来看看硬链接和符号链接之间的区别:

硬链接只是一个目录条目,它指向与现有 Inode 相同的 Inode,而符号链接只是一个特殊文件,其中包含另一个文件的名称(直接存储在 Inode 中,如果路径名足够小适合)。这就是原因,为什么

  • 同一个文件的硬链接不能有不同的文件访问权限(因为它们存储在 Inode 中)
  • 硬链接必须位于同一文件系统中

展开的简单视图

 ???????????????????   
 ?    hard link    ? ????????
 ???????????????????        ?
 ???????????????????    ?????????    ???????????????
 ?  example_file   ? ?? ? Inode ? ?? ? data blocks ?
 ???????????????????    ?????????    ???????????????
          ?
          ?????????????????????????
                                  ?
 ???????????????????    ??????????????????????
 ?  symbolic link  ? ?? ? filename reference ?
 ???????????????????    ??????????????????????
Run Code Online (Sandbox Code Playgroud)

现在回到不存在的-L选项-s:它允许您创建符号链接指向的文件的硬链接(如上例中的“硬链接”)。

为什么这有助于恢复已删除但仍被打开的程序使用的文件?

那么这种行为肯定是非常依赖于实现的,而且你可以在所有的UNIX / Linux平台上有所不同,但我会试着解释它是如何可能的工作:

当文件被删除时(比如通过rm(1)),系统调用总是unlink(2)。它删除目录条目并将链接计数器(在 Inode 中维护)减一。

如果链接计数器达到零,则是操作系统清理的时间(实际上释放 inode 指向的数据块,然后释放 inode 本身。如果文件仍然打开,此任务通常会推迟到使用 inode 的程序终止。

如今,大多数 UNIX 系统都维护一个/proc文件系统层次结构,可以在其中查找对打开文件的引用,这些文件是(令人惊讶!)符号链接。鉴于找到了正确的条目,ln -L 可能有助于重新创建指向 inode 的链接,再次增加链接计数器,从而防止操作系统删除 inode(如果幸运的用户足够快并且程序仍在运行)。

注意:要使其正常工作,新链接的位置必须与原始链接所在的文件系统相同!

最后的例子

 ???????????????????   
 ?   rescue_link   ? ????????
 ???????????????????        ?
 ???????????????????    ?????????    ???????????????
 ? *** removed *** ?    ? Inode ? ?? ? data blocks ?
 ???????????????????    ?????????    ???????????????
          ?
          ?????????????????????????
                                  ?
 ???????????????????    ??????????????????????
 ? /proc/bla/fd/n  ? ?? ? filename reference ?
 ???????????????????    ??????????????????????
Run Code Online (Sandbox Code Playgroud)

最后的话

有很多事情可能会阻止正确创建链接,这非常依赖于符号链接本身的实现方式,我不得不承认:我严重怀疑它是否适用于许多 UNIX 变体 - 但也许是一个愿意的志愿者花一些时间来测试这个?