首先需要明确:rsync并非像dd那样逐字节操作的底层工具——它不会处理磁盘结构、MBR、分区表,也不会触及未格式化的空白区域。rsync只同步已经挂载并可供访问的文件系统内容。如果你追求的是“镜像恢复即可启动”的完整克隆方案,rsync确实无法胜任。但换个角度思考:当你需要一份可启动、可灵活选择、同时节省存储空间的“逻辑全盘备份”时,rsync反而是更高效、更顺手的工具。

用rsync做全盘备份时,哪些目录必须排除?
如果直接执行rsync -a / /backup/,很可能会翻车——因为系统中存在一些虚拟文件系统路径,其内容在运行时实时生成,既无法复制,也不应该被备份。
需要排除的路径包括:
- /proc、/sys、/dev——属于内核接口层,只有挂载后才呈现内容,备份它们只会引发错误且毫无意义
- /run、/tmp——存放运行时临时数据,重启即清零,没有保留价值
- /mnt、/media——可能挂载了外部设备或其他分区,若未经处理直接同步会导致数据混乱
- /lost+found——ext文件系统专有目录,无需纳入备份
- /boot/efi/EFI/Microsoft/(适用于双系统环境)——避免误将Windows引导文件一同复制
正确的命令示范如下:
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /backup/rootfs/
为什么仅用 -a 不够,必须加上 -A 和 -X?
参数-a虽然涵盖了递归、权限、时间戳、符号链接等基本要素,但它遗漏了三项关键属性:
- -A:保留ACL(访问控制列表),例如通过
setfacl为特定用户设置的细粒度权限 - -X:保留扩展属性(xattr),其中包含SELinux上下文(
security.selinux)和capability(如ping命令所需的cap_net_raw)
缺少这两个参数可能造成严重后果——恢复后可能无法登录(ACL失效),服务启动失败(SELinux上下文错误),或者某些二进制文件无法正常执行(capability丢失)。
需要注意一点:Debian/Ubuntu系统默认不启用SELinux,但CentOS、RHEL 8及以上版本默认开启SELinux。对于后者而言,-X并非可选项,而是必须携带的参数。
恢复时最容易卡住的三个环节
在Live环境中还原后系统无法启动?问题往往出在以下几步:
- 虚拟文件系统未重新挂载到目标根目录——
/dev、/proc、/sys缺一不可,需要使用mount --bind逐一挂载 - 引导程序未重新安装——即使文件已全部到位,
/boot中的内核和initramfs未更新,GRUB配置也未重写,系统依旧无法启动。grub-install与update-grub必须在chroot环境中执行 - 未核对
/etc/fstab——原系统的UUID很可能与恢复盘不一致,若不修正,启动时会卡在“Failed to mount /”。使用blkid查询后,对应修改fstab即可
切勿因为嫌麻烦而跳过chroot步骤——哪怕只是在chroot内执行ls /boot,也能确认/boot是否已成功同步。
--delete 参数用不好就是双刃剑
--delete能让备份目录与源目录保持“严格一致”:源端删除的内容,备份中也会自动清除。听起来逻辑清晰,但实际操作中风险不容小觑:
- 若误删了
/etc目录,紧接着执行一次同步,备份也会同步删除,导致无法回滚 - 远程备份时一旦网络中断,
rsync可能只删除了部分文件,使备份处于半残状态
更稳妥的做法是分步实施:首次全量备份时不加--delete;后续增量备份时使用--delete-after(传输完成后再执行删除),并配合--dry-run预先查看将要被删除的内容。另一种更巧妙的方式是改用--link-dest创建硬链接快照——每次备份都会生成一个独立目录,天然具备防误删功能。
