如何创建到inode(ext4)的硬链接?


17

如果我知道文件的索引节点(索引节点),但不知道其路径(或其任何路径),是否可以直接创建到该索引节点的硬链接?

我可以使用找到文件sudo find / -inum 123546,然后创建一个硬链接,但这对于我的应用程序来说太慢了。

注意:我正在使用ext4文件系统。


1
密切相关:通过文件的inode 删除重命名文件(这两者都是直接不可能完成的)。
吉尔斯(Gillles)“所以-别再邪恶了”,

Answers:


23

AFAIK,不与内核API一起使用。如果存在这样的界面,则必须将其限制为超级用户,否则它将使任何人都可以访问他们没有搜索权限的目录中的文件。

但是您可以debugfs在文件系统上使用它(一旦它被卸载)(假设您对块设备具有写访问权)。

debugfs -w / dev / block /设备

(用/dev/block/device文件系统所在的实际块设备替换)。

然后,在的提示下debugfs,输入

统计< 123 >
(使用尖括号将123替换为实际的inode编号)以检查文件是否存在(inode的链接计数大于0)并且不是目录。

如果一切顺利,请输入:

ln < 123 > 路径/到/新文件
创建硬链接(请注意,该路径是相对于文件系统根目录的)。其次是:

mi < 123 >
来增加链接计数(Enter对于要在当前值加1的链接计数除外的所有字段,请按)。


6
这样的接口还必须检查文件的链接数是否为非零,否则就有可能恢复已删除但仍然打开的文件,该文件被IIRC拒绝,因为它违反了内核不变式。
吉尔斯(Gillles)“所以-别再邪恶了”,


1
@PhilipCouling,目录上的执行权限位转换为搜索权限。我已经在目录中说过,那么就没有对的搜索权限
斯特凡Chazelas

3
@OrangeDog,搜索许可是POSIX标准使用的术语。
斯特凡Chazelas

1
@mosvy:可以从内核中删除该检查。您必须在VFS中修补几个位置,以使其本身不软管。多年前,我在做论文时就做到了。
约书亚

3

根据您的用例,另一种方法可能是首先通过硬链接将所有候选文件收集在一个目录中,然后硬链接您特别感兴趣的文件。

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(假设您的inode数均小于1,000,000,请根据需要创建更多目录)。

然后,将您的inode分组为1000,并收集在by-inode/树中。从那里,您可以根据需要链接它们。

请注意,尽管这意味着删除该文件<path>不会因为该额外的硬链接而占用空间。

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.