![ext2/3/4 文件系统上的目录可以使用硬链接吗?](https://linux22.com/image/94088/ext2%2F3%2F4%20%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84%E7%9B%AE%E5%BD%95%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E7%A1%AC%E9%93%BE%E6%8E%A5%E5%90%97%EF%BC%9F.png)
我读过,用于创建硬链接的命令(也许还有系统调用)不允许为目录创建硬链接。我还了解到,硬链接可能会给基于路径的安全性(例如 DAC、Linux 安全模块和 IMA/EVM)带来问题。如果无法创建到目录的硬链接,则可以解决此类目录可能带来的安全问题。但是,是否可以通过在存储级别编辑文件系统来创建两个或多个到目录 inode 的硬链接?
答案1
目录做有硬链接...每次您创建mkdir
一个新目录时,该..
条目都是指向与父目录相同的 inode 的链接。
例如
$ ls -lid .
23855134 drwxr-xr-x 2 sweh sweh 4096 Sep 8 21:57 .
$ mkdir foo
$ ls -lid . foo/..
23855134 drwxr-xr-x 3 sweh sweh 4096 Sep 8 21:57 .
23855134 drwxr-xr-x 3 sweh sweh 4096 Sep 8 21:57 foo/..
我们可以看到目录上的链接计数增加了 1(从 2 到 3),索引节点为“.”。和“foo/..”都是23855134。您会注意到它以两个链接计数开始;那是因为 ”。”并且父目录中的条目也共享 inode 号
$ ls -lid foo foo/.
23855343 drwxr-xr-x 2 sweh sweh 4096 Sep 8 21:57 foo
23855343 drwxr-xr-x 2 sweh sweh 4096 Sep 8 21:57 foo/.
现在,如果您能够通过编辑文件系统来建立另一个链接,您很容易就会抱怨fsck
。
不要这样做:-)
答案2
从技术上讲,您也可以轻松做到这一点:debugfs
有一个ln
可以创建目录硬链接的命令。这样做会产生一个工作文件系统,其中多个目录指向同一个 inode(超出..
了史蒂芬·哈里斯'答案),尽管如果您希望链接计数正确显示,则需要手动处理链接计数。
正如斯蒂芬所说,这会让人e2fsck
不高兴,并且它将删除重复的目录条目(不过你不会丢失数据,它会留下一个目录)。
(我还没有尝试过任何真正损坏的东西,特别是目录循环......)