要保留硬链接关系,tar 默认行为即可实现:不加--hard-dereference,确保所有硬链接文件在同一命令中被包含,解包后inode和link count保持一致。

要让 tar 在打包时原封不动保留所有硬链接关系,关键不是“复制链接”,而是让 tar 识别并记录多个路径指向同一 inode 的事实,并在解包时重建这种关联。
必须使用 --hard-dereference 以外的默认行为
很多人误以为加 --hard-dereference(或 -h)能保留硬链接——其实恰恰相反:
--hard-dereference 会让 tar 把每个硬链接都当作独立文件展开打包,彻底破坏原始硬链接结构。
真正保留硬链接的默认行为是:不加 -h,让 tar 自动检测并复用已打包过的 inode。
打包命令只需基础选项,但路径需合理
只要满足以下两点,tar 就会自动保留硬链接:
- 使用
-c(创建归档)和-f(指定文件名),例如:tar -cf archive.tar dir/ - 所有被硬链接指向的文件,必须在同一轮 tar 命令中被包含(不能分多次打包,也不能部分通过软链/绝对路径间接引入)
例如,若 a.txt 和 b.txt 是同一个 inode 的硬链接,且都在 ./data/ 下,则:
✅ 正确:tar -cf backup.tar data/ → 解包后 data/a.txt 和 data/b.txt 仍是硬链接
❌ 错误:tar -cf backup.tar data/a.txt 再单独加 data/b.txt → 不生效,因 tar 无法跨调用追踪 inode
验证是否成功保留
打包完成后,可用以下方式确认硬链接关系未丢失:
- 解包到空目录:
mkdir out && tar -xf archive.tar -C out - 检查 inode 是否一致:
ls -i out/data/a.txt out/data/b.txt→ 两个数字应完全相同 - 对比源与目标的 link count:
stat data/a.txt和stat out/data/a.txt中Links:值应相等
注意跨文件系统场景
硬链接本质依赖同一文件系统上的 inode 共享。如果源目录跨越多个挂载点(如 /home 和 /opt 分属不同磁盘),tar 仍会尽力保留 —— 但仅限于每个文件系统内部。跨分区的硬链接在原始系统中本就不存在(Linux 不允许跨设备建硬链接),所以无需额外担心。











