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

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 -f和sudo fdisk -l对照看设备型号、大小、挂载点,确认目标盘没挂载(mount | grep sdb) - 用
dd的conv=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 隐蔽得多,出错时错误信息又特别笼统,最容易卡在“明明命令没错,就是收不进去”。










