如果我知道一个文件的索引节点(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>
不会回收空间,因为有额外的硬链接。