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

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

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

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

注意我使用的是 ext4 文件系统。

答案1

AFAIK,不使用内核 API。如果存在这样的接口,则必须仅限于超级用户,否则任何人都可以访问他们无权搜索访问的目录中的文件。

但是您可以debugfs在文件系统上使用(一旦卸载)来执行此操作(假设您具有对块设备的写访问权限)。

调试文件-w/dev/块/设备

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

然后在 的提示下debugfs输入

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

如果一切顺利,请输入:

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

米<123>
增加链接计数(Enter按此按钮可访问除链接计数之外的所有字段,您需要在当前值上加 1)。

答案2

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

例如

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>不会回收空间,因为有额外的硬链接。

相关内容