要完整保留软硬链接,需用 rsync -ah(-a 隐含 -l 保软链,-h 显式保硬链),且源目标须同文件系统;-l 会展开软链而非保留,跨分区时硬链必断裂。

配置自动化备份系统时,要让软链接(symbolic link)和硬链接(hard link)的属性完整保留,关键不在“加 -H -l 参数”,而在于理解 rsync 的链接处理逻辑,并配合正确的策略组合。默认情况下 rsync 会把软链接当普通文件复制(即复制目标内容),硬链接则需特殊触发才能保持跨文件的 inode 关联。
软链接必须用 -L 或 -a 才能还原为真实路径
rsync 默认不解析软链接,而是原样复制链接文件本身(即保留 link 文件结构)。若你希望备份中软链接指向的内容被实际复制(比如 /etc/nginx -> /etc/nginx-stable,你希望备份里直接存一份完整的 nginx-stable 目录),就得用 -L(--copy-links)参数。但注意:这会丢失原始软链接关系,变成普通目录/文件。
如果你的目标是 完全保留软链接本身(即备份后 /backup/etc/nginx 仍是 → /etc/nginx-stable 这样的符号链接),那就不能加 -L,而应使用 -a(归档模式),它隐含 -H(保留硬链接)+ -l(保留软链接作为链接,而非内容)。
- -a = -rlptgoD(递归、保留链接、权限、时间戳、属主属组、设备文件、特殊文件)
- -H 必须显式加入,因为 -a 不包含它;-H 让 rsync 在扫描源时记录硬链接关系,并在目标端重建相同 inode 关联
- -l 已被 -a 包含,无需重复写;它确保软链接不被展开,只复制链接文件
硬链接保留依赖两个前提:-H + 同一文件系统
硬链接本质是多个目录项指向同一 inode。rsync 只有在启用 -H 且源与目标位于 同一挂载点(同一文件系统) 时,才能真正复现硬链接关系。跨分区或跨磁盘备份时,即使加了 -H,rsync 也只能复制为独立文件(因为 inode 无法跨文件系统共享)。
典型场景如备份 /home 到 /backup/home(两者同属 / 分区),-H 就有效;若 /backup 是单独挂载的 /dev/sdb1,则硬链接必然断裂。
- 验证是否生效:备份后执行
ls -i file1 file2,若两文件 inode 编号一致,说明硬链接成功保留 - 避免误用 --hard-link(这是 rsync 的另一种增量备份模式,用于多版本快照,和 -H 完全不同)
复杂目录树备份推荐命令模板
针对完整系统级备份(如 /etc、/var/lib、/opt 等含大量软/硬链接的路径),建议使用以下组合:
rsync -aHAXv --delete \ --exclude='/proc' --exclude='/sys' --exclude='/dev' --exclude='/run' \ --exclude='/tmp' --exclude='/backup' \ / /backup/full_system_$(date +%Y%m%d)/
- -aHAX:归档 + 硬链接 + ACL + 扩展属性(XATTR),覆盖绝大多数元数据
- --delete:确保目标与源严格一致,避免残留旧链接
- --exclude:跳过虚拟文件系统和临时路径,防止崩溃或无效链接
- 务必确认
/backup和/在同一文件系统,否则 -H 失效
验证与补救:检查链接完整性
备份完成后,不要只看目录结构,要主动验证链接行为:
- 查软链接:
find /backup/full_system_* -type l | head -10,再用readlink确认指向是否合理 - 查硬链接:
find /backup/full_system_* -links +1 -ls | head -5,对比源端同路径输出 - 若发现硬链接断裂,说明备份目标跨文件系统——此时只能接受“副本替代”,或改用
cp -a --reflink=auto(支持 btrfs/xfs 的写时复制)或 tar 归档(tar -cf - . | (cd /backup && tar -xf -)自然保留所有链接)











