Linux 系统备份与恢复高级方案

7次阅读

rsync 增量备份跳过修改文件因默认仅比对 mtime 和 size,内容未变但时间戳或权限变动即误判同步;加 –checksum 可强制校验内容确保准确。

Linux 系统备份与恢复高级方案

rsync 增量备份时为什么跳过修改过的文件?

因为默认不比较内容,只看 mtime 和 size —— 只要文件被 touch 过或权限改了但内容没变,rsync 就可能误判为“已同步”。

  • --checksum 强制逐块校验(慢但准),尤其适合 NFS 或某些容器挂载场景下 mtime 不可靠的情况
  • 避免用 -a 单独跑备份:它隐含 -t(保留时间戳),反而掩盖真实变更;建议拆成 -rlptgoD,按需去掉 t
  • 注意 --ignore-times--size-only 是互斥的,后者跳过时间检查只比大小,适合日志轮转后文件名不变但内容全换的场景

用 dd 备份整个系统盘会不会把坏块也复制过去?

会。dd 是纯字节拷贝,不识别文件系统结构,遇到磁盘坏道直接报 input/output Error 并中断,或者静默跳过(取决于设备层设置)。

  • 先用 smartctl -a /dev/sdXReallocated_Sector_CtCurrent_Pending_Sector,数值非零就别用 dd 直拷
  • 真要物理镜像,改用 ddrescue:它自动跳过坏块、记录日志、支持断点续传,命令是 ddrescue -d -r3 /dev/sdX image.img rescue.log
  • 备份完别直接 dd 回写验证 —— 先用 file image.img 确认是 ext4/LVM 等预期格式,再 mount -o ro 检查关键目录是否存在

systemd 的 btrfs snapshot 怎么避免快照爆炸?

btrfs subvolume snapshot 本身不占空间,但一旦原数据被覆盖或删除,快照就会“固化”占用实际空间;没人清理的话,/var/lib/machines 或 /home 下几十个快照能把根分区撑爆。

  • 别依赖 snapper 默认策略:它的 timeline_cleanup 默认只删 10 天内的 hourly 快照,但对 root 分区这种低频变更场景意义不大
  • btrfs Filesystem usage / 查看各子卷实际占用,重点关注 DataSystem 列,不是 Overall 那行
  • 定期执行 btrfs subvolume delete /path/to/old-snap,注意不能在挂载状态下删当前子卷,且删前确认没被 grub-btrfs 引用(否则启动项失效)

恢复时 chroot 进去发现网络不通、journalctl 报 no such file or Directory

因为 /proc /sys /dev 没正确挂载,systemd 启动依赖这些虚拟文件系统,裸 chroot 下它连自己的 PID 1 都找不到。

  • 进 chroot 前必须挂载: mount -t proc /proc /mnt/proc mount -t sysfs /sys /mnt/sys mount --rbind /dev /mnt/dev mount --make-rslave /mnt/dev(这步漏掉会导致 udev 启动失败)
  • 如果用 LVM 或加密卷,chroot 前得先 vgchange -aycryptsetup open,否则 /dev/mapper/xxx 根本不存在
  • journalctl 报错还可能是 /run 没挂载 tmpfs:mount -t tmpfs tmpfs /mnt/run,否则 systemd-journald 写不了日志文件

备份恢复这事,最难的从来不是命令敲对,而是每次操作前得想清楚:我正在覆盖的是哪个时间点的数据?上一次成功验证是在哪台机器上?有没有人动过 /etc/fstab 或 /boot/grub/grub.cfg?

text=ZqhQzanResources