Linux 数据备份与恢复高级技巧

10次阅读

安全使用 rsync 需分三步:先 –dry-run 模拟检查 deleting 行,再 –backup–backup-dir 保留被删文件,关键任务用 –delete-after;tar 排除。git 应写 –exclude=”.git”;dd 前须 lsblk/fdisk 核验设备;btrfs send/receive 要求收发端子卷路径严格对齐。

Linux 数据备份与恢复高级技巧

rsync 增量备份时 –delete 误删目标文件的预防措施

--delete 是为了保持目标与源完全一致,但一旦源目录路径写错、或同步前没确认源是否为空,rsync 会把目标里所有“多出来”的文件全删掉,且不进回收站。

真正安全的做法不是不用 --delete,而是分三步走:

  • 先用 --dry-run 模拟执行,重点看输出里有没有大量 deleting xxx 行——如果有,立刻停手查源目录状态
  • 加上 --backup --backup-dir=PATH,让被覆盖 / 删除的文件自动挪到指定备份目录,而不是直接丢弃
  • 对关键任务,把 --delete 换成 --delete-after,确保传输完成后再删,避免中断导致目标残缺

tar 归档时排除临时文件却漏掉 .git 目录的常见写法错误

tar--exclude 参数不支持通配符展开,也不能用正则;写成 --exclude="*.tmp" 看似合理,实际只排除字面名为 *.tmp 的文件(根本不存在),真正的临时文件一个没躲过。

正确写法必须匹配完整路径片段:

  • 排除当前目录下所有 .tmp 文件:--exclude="*.tmp" 可用,但仅限于 tar 当前工作目录下的直接子项
  • 排除任意深度的 .git 目录:--exclude=".git" 就够了,tar 内部按路径前缀匹配
  • 想排除 /var/log/journal 下所有内容,得写 --exclude="/var/log/journal",开头带斜杠才精确

顺带一提:--exclude-vcs 能自动跳过 .git.svn 等,但不包括 .idea.vscode,这些还得手动加。

使用 dd 恢复磁盘镜像时设备名写错导致覆写系统盘

dd if=image.img of=/dev/sdX 这条命令只要把 /dev/sdX 错写成当前系统盘(比如 /dev/sda),整块系统盘秒变砖——没有警告,不提示确认,写完就启动不了。

防错不是靠记性,而是靠验证链:

  • 执行前先用 lsblk -fsudo fdisk -l 对照看设备型号、大小、挂载点,确认目标盘没挂载(mount | grep sdb
  • ddconv=noerror,sync 不解决误写问题,但至少能让出错时停住,而不是硬着头皮继续写
  • 真正保险的做法是:先用 dd if=/dev/zero of=/dev/sdX bs=1M count=10 往目标盘开头写 10MB 零,再用 hexdump -C /dev/sdX | head 确认写入成功——这步能强制你反复核对设备名

用 btrfs send/receive 做快照级备份时子卷路径不一致引发恢复失败

btrfs send 发送的是子卷(subvolume)的完整路径快照,不是相对路径。如果备份时用 btrfs subvolume snapshot /data /backup/data_2024,而恢复时在另一台机器上建了 /mnt/backup,再执行 btrfs receive /mnt/backup,它会试图在 /mnt/backup/data_2024 创建子卷——但父目录 /backup 根本不存在,报错 Invalid argument

关键不在命令本身,而在路径层级是否对齐:

  • 发送端子卷路径是 /backup/data_2024,接收端挂载点就必须是 /backup(不能是 /mnt/backup
  • 如果无法对齐,得用 btrfs send -f 先导出到文件,再用 btrfs receive -f-v 查看具体路径需求
  • btrfs send -p 做增量时,父快照也必须存在于接收端同路径下,否则直接失败,不会自动创建

这个路径刚性约束,比 rsync 或 tar 隐蔽得多,出错时错误信息又特别笼统,最容易卡在“明明命令没错,就是收不进去”。

text=ZqhQzanResources