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

rsync 增量备份时为什么跳过修改过的文件?
因为默认不比较内容,只看 mtime 和 size —— 只要文件被 touch 过或权限改了但内容没变,rsync 就可能误判为“已同步”。
- 加
--checksum强制逐块校验(慢但准),尤其适合 NFS 或某些容器挂载场景下 mtime 不可靠的情况 - 避免用
-a单独跑备份:它隐含-t(保留时间戳),反而掩盖真实变更;建议拆成-rlptgoD,按需去掉t - 注意
--ignore-times和--size-only是互斥的,后者跳过时间检查只比大小,适合日志轮转后文件名不变但内容全换的场景
用 dd 备份整个系统盘会不会把坏块也复制过去?
会。dd 是纯字节拷贝,不识别文件系统结构,遇到磁盘坏道直接报 input/output Error 并中断,或者静默跳过(取决于设备层设置)。
- 先用
smartctl -a /dev/sdX看Reallocated_Sector_Ct和Current_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 /查看各子卷实际占用,重点关注Data和System列,不是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/procmount -t sysfs /sys /mnt/sysmount --rbind /dev /mnt/devmount --make-rslave /mnt/dev(这步漏掉会导致 udev 启动失败) - 如果用 LVM 或加密卷,chroot 前得先
vgchange -ay和cryptsetup open,否则 /dev/mapper/xxx 根本不存在 - journalctl 报错还可能是 /run 没挂载 tmpfs:
mount -t tmpfs tmpfs /mnt/run,否则 systemd-journald 写不了日志文件
备份恢复这事,最难的从来不是命令敲对,而是每次操作前得想清楚:我正在覆盖的是哪个时间点的数据?上一次成功验证是在哪台机器上?有没有人动过 /etc/fstab 或 /boot/grub/grub.cfg?