科技 · 实用指南
rsync --link-dest 生成了副本?验证路径结构与保留属性
从目标目录解析基准目录,找出属性不匹配,并以设备号和 inode 验证硬链接,而不是只相信相同的哈希值。

对 rsync --link-dest 而言,文件字节完全相同还不够。旧快照中的文件必须位于相同的相对路径,并且命令要求保留的每项属性都必须一致。相对于目标目录的基准路径错误、--relative 前缀不一致、mode 权限模式或组不同,或者使用了 --ignore-times,都可能在不改变文件内容的情况下生成独立副本。
把硬链接创建视为可验证的备份属性。记录准确命令和接收端解析后的路径,用同一命令加上 --dry-run 与 --itemize-changes 运行,再写入空快照目录,随后比较设备号与 inode。哈希值相同只能证明字节相同,不能证明共享存储。
1. 固定准确命令,并准备空目标目录
将准确的 rsync 命令复制到故障记录中,包括源和目标路径末尾的斜杠、-a 展开的选项、-R 或 --relative、-H、ACL 或 xattr 选项、排除规则,以及每个 --link-dest。使用新的空快照目录;上游手册提醒,目标目录中已有文件的属性可能被修改,也可能使逐项变更输出难以判断。
不要把添加 --ignore-times 当作诊断捷径。rsync 手册明确指出,这个选项会阻止 --link-dest 建立链接,因为链接是传输的替代方式,并不是更新后再执行的第二轮操作。
2. 从目标目录解析基准目录
如果 DEST=/backups/2026-10-28,且指定 --link-dest=../2026-10-27,基准目录应解析为 /backups/2026-10-27。对目标目录和拼接后的基准路径分别使用 realpath,并确认旧文件位于新传输将创建的相同相对路径。不要从当前 shell 目录解析相对基准路径。
源路径以斜杠结尾时,传输的是目录内容;没有末尾斜杠时,rsync 会额外创建一层源目录。使用 --relative 还会保留源路径前缀。绝对基准路径只消除 DIR 起点的歧义,并不会移除 --relative 引入的前缀;旧基准目录仍须包含完全相同的传输相对路径。
3. 区分字节相同与属性相同
在与原命令相同的发起主机、用户账号和工作目录下运行 rsync,保持源和目标端点及其余所有选项不变,只加上 --dry-run 与 --itemize-changes。在接收端检查基准路径、目标路径及其设备号。解读逐项输出中的字母,不要看到校验和相同就停止检查。p、o、g、t、a 或 x 的差异可能解释 rsync 为何创建本地副本:硬链接名称不能各自具有不同的 inode 元数据。
用 stat 比较源文件与旧快照中的候选文件,记录 mode 权限模式、所有者、组、大小和修改时间。如果有意不保留某项属性,应将其作为明确的策略决定,并让源、旧快照和新运行保持一致;不要为了强行去重而盲目取消属性保留。
4. 检查文件系统与 rsync 的适用边界
GNU 文档说明,硬链接不能跨越文件系统边界。记录旧文件和新目标目录的设备号。如果设备号不同,rsync 仍可能把旧文件用作传输基准,但无法创建跨文件系统硬链接。特殊文件类型和文件系统还可能带来其他限制。
区分 -H 与 --link-dest。-H 保留源中已有的硬链接组;--link-dest 则利用另一套快照目录树中的未变文件创建链接。用其中一个选项,不能修复另一个选项所面对的错误基准路径。
5. 运行一次,再证明链接确已建立
实际运行前,从核对过的命令中去掉 --dry-run(若使用 -n,则去掉 -n),保留其余已核对的选项,再运行 rsync 写入空目标目录;下文的 stat -c 检查使用 GNU stat。抽取未变的普通文件,在旧路径和新路径上运行 stat -c '%d %i %h %a %s %Y %n'。只有设备号与 inode 均相同,才能接受节省空间的结论;链接计数应反映新增的文件名。
同时记录哈希值以检查内容完整性,但要把两类结论分开。在本地 rsync 3.2.7 测试用例中,属性完全相同的文件共用一个 inode,链接计数为 2。只修改 mode 权限模式时,产生了逐项输出 cf...p..... 和新的 inode;--ignore-times 则产生了 >f......... 和另一个新 inode,即使所有 SHA-256 哈希值都相同。
6. 携带证据升级排查特定版本故障
升级排查前先按观察结果分支。如果计算出的 --relative 路径上缺少旧候选文件,同时检查传输路径的层级,以及所选旧快照是否包含该文件、是否成功完成;单凭缺失不能认定前缀错配。确认是层级不符时,在传输设置中修正布局。如果参考快照不完整或没有该文件,可改选已核实完整且包含该候选文件的参考快照;没有可用参考时,应预期该文件会重新复制。p、o、g、t、a 或 x 标记表示对应的保留属性值不同;先将源和旧快照的元数据与预期的保留策略比较,再决定改什么。-I 或 --ignore-times 会禁用以链接替代传输;设备号不同则不可能建立硬链接。只有这些检查都通过后,才记录本地与远端 rsync 版本、传输模式、逐项输出和最小复现。2026 年的项目一手问题记录了守护进程相对基准路径回归:它会无提示地重新传输数据,并已在项目中修复;应保留版本证据,而不是把所有失败都归为该缺陷。
这套流程只证明抽样路径中的普通文件实现了链接复用,不能为每种 ACL、xattr、符号链接、设备节点、远程挂载或旧版 rsync 构建提供全面保证。应围绕备份承诺覆盖的具体文件类别扩大样本,然后监控新快照中的 inode 复用情况及非预期的传输字节数。
