是否有任何可以成功执行ln -d的文件系统?


11

ln的手册页中:

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

是否有任何文件系统驱动程序实际上允许这样做,还是唯一的选择mount --bind <src> <dest>?还是这种行为被内核阻止,甚至还没有到达文件系统特定的驱动程序?

注意:我实际上并不打算在任何计算机上执行此操作,只是出于好奇。

Answers:


6

首先请注意:在ln命令没有类似的选项-d-F--directory,这是一个不可移植GNUism。

您要查找的功能由link(1)命令实现。

回到您的原始问题:

在典型的UNIX系统上,是否可以在目录上进行硬链接的决定是在文件系统驱动程序中做出的。

Solaris UFS驱动程序支持目录上的硬链接,而ZFS驱动程序不支持。

Solaris上的UFS支持硬链接的原因是AT&T对此功能感兴趣-BSD的UFS不支持硬链接目录。

ZFS不支持硬链接目录的原因是Jeff Bonwick不喜欢该功能。

关于Linux,我猜想Linux会阻止尝试在高层内核层的目录上创建硬链接。这种假设的原因是,Linus Torvalds git clone在支持硬链接目录的平台上以root身份被调用时,为GIT编写了粉碎目录的代码。

请注意,支持创建硬链接目录的文件系统也需要支持unlink(1)以root用户身份删除非空目录。

因此,如果我们假设Torvalds知道Linux的工作方式,并且Linux如果确实支持硬链接目录,则Torvalds应该知道unlink(2)在root用户的情况下调用目录不会返回错误,但会切碎该目录。换句话说,Linux不太可能允许文件系统驱动程序实现硬链接目录。


3

OP提到的问题mount --bind。快速检查表明它不会修改所安装目录的链接数。硬链接总是会修改链接计数,您可以使用查看链接计数ls -ld

通常(大多数类Unix系统),到目录的硬链接数将是连接到该名称的目录数,例如,

  • ".." (父目录)
  • "." (目录本身)
  • 子目录

如果你读了(通常)更丰富的信息页面中,你会发现为他人做了:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

尽管目前措辞

大多数系统禁止建立到目录的硬链接。在允许的情况下,只有超级用户可以这样做(并且要小心,因为创建周期会给许多其他实用程序带来问题)。硬链接不能跨越文件系统边界。(但是,这些限制不是POSIX强制要求的。)

创建(和删除)目录的硬链接是一项受限制的功能,可以防止在目录未链接时丢失文件。由于C操作系统接口上的链接/取消链接操作是对称的,因此通常仅在mkdir / rmdir调用中完成目录的链接。

请记住,许多GNU coreutils是20到30年前编写(并记录)的,当时仍在使用一些真正的博物馆作品。正如指出的关于硬链接,原来还有没有的mkdir /命令rmdir电话; 目录是使用硬链接创建的(作为特权操作)。当添加系统调用来解决上述问题时,所有这些都消失了。但是文档继续通过维护者的记忆来引用这些系统。这被质疑的选择是在前作fileutils(这与合并textutils,并shellutils在90年代中期形成coreutils)。变更日志中的一些项目可能有助于阐明功能的来源:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

因此,例如,您可以看到适用此功能的古董之一是SunOS。相应的手册页说:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

如文档中所述,此功能(以及相应的选项不在POSIX中(请参阅解释原因的“基本原理”部分),而是将该功能移到了名为的新命令(也由GNU coreutils提供)中link。该命令本身含糊不清;您必须阅读函数调用的说明才能从该标准中获得任何使用;但是,该标准除了继续执行有关所需特权的免责声明外,并未阐明该命令的工作条件。为此,您必须使用标准以外的系统相关功能:

在大多数历史实现中,链接到目录仅限于超级用户,因为此功能可能会在文件层次结构中产生循环或损坏文件系统。本书POSIX.1-2008禁止link()并禁止这种行为,从而延续了这种哲学unlink()。如果实现者设计了这种扩展,其他功能也可以做到。

这里其中使用硬连接到目录超出正常数量(2个加子目录)系统。

OSX使用多个硬链接到普通文件的目录。它不支持使用ln(请参见手册页)。根据Time Machine如何发挥其魔力,它这样做是为了提供用于Time Machine备份工具的版本。

进一步阅读:


3
这似乎根本无法回答问题。
Michael Homer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.