我理解为什么几乎每个 UNIX 版本都不允许目录硬链接的原因(事实上 OS X 上的 HFS+ 是我所知道的唯一一个,但即使如此,你自己也不容易做到)。然而,理论上所有文件系统都支持硬链接目录,因为所有目录都至少包含一个指向其自身的额外硬链接,以及指向其父目录的子目录中的额外硬链接。
现在,我意识到如果误用硬链接可能会很危险,因为它会创建很少有程序会检查的循环结构,从而陷入无限循环。然而,我希望使用硬链接来创建一个适用于任何 UNIX 的时间机器风格的备份。我不认为这种结构有危险,因为链接只是指向以前的备份;不应存在循环链接的风险。就我而言,我目前只是使用 rsync 创建到现有文件的硬链接,但这缓慢且浪费,特别是对于非常大的备份,特别是如果我已经知道哪些目录未更改。
考虑到这一点,有什么方法可以强制在 UNIX 变体上创建目录硬链接吗?ln
大概没有什么好处,因为这是许多 UNIX 风格为了防止硬链接目录而施加限制的地方,并且ln
支持硬链接目录的版本特别声明该操作可能会失败。但是对于知道风险并且知道他们的用例是安全的人来说,有什么方法可以实际创建链接吗?非常适合 shell 脚本,但如果我需要编译一个小程序来完成它,那么我想我可以。
答案1
不要这样做。如果你想有一个使用硬链接的备份系统来节省空间,最好使用 rsync with --link-dest
,这将硬链接文件适当地节省空间,而不会引起由此引起的问题(即,目录之间的硬链接会损坏文件系统,并会导致它报告错误的 inode 计数 + fsck 失败 + 由于不是 DAG,通常具有未知的语义)。
答案2
如果您无法debugfs
交互使用,您可以通过管道连接到它并使用它
sed
从其输出中删除提示和回显命令。
echo 'link /foo /bar' | debugfs -w [device] | sed '$s/debugfs: $//' | sed '1d'
答案3
您可以用来debugfs
执行此操作。在未安装文件系统的情况下,执行debugfs -w /dev/device_name
.然后,在 debugfs 提示符处,使用该命令的方式与通常link
可以使用目录硬链接时使用的方式相同。 ln
(例如link /original_dir /new_link
)link
debugfs 中的命令ln
与link
系统调用不同,允许创建指向目录的硬链接。完成后,只需输入quit
。
然而,正如其他人提到的,不要实际上这样做。这会引起问题。我这么说只是因为您问如何强制创建目录硬链接,而您就是这样做的。
答案4
目录永远不应该有额外的硬链接到他们。当然,您可以创建它们,但这是一个严肃的文件系统损坏。
原因是目录必须始终形成树结构,否则无法理智地遍历它们进行清理。是的,目前可以正常工作。但是下次您出于任何原因必须运行 fsck(8) 时,它可能不会完成其工作,或者最多只是删除其中一个虚假链接。
不,这不是理论。很久以前,Ultrix 系统由于一些故障而出现了一些硬链接的目录。通过编辑文件系统来清理它并不有趣。