Btrfs send/receive 增量复制
把只读快照序列化成数据流发送出去,接收端还原成同名快照,两端快照链保持一致。指定父快照后只传两份快照之间的差异,形成高效的异地备份通道。它是 Btrfs 生态里做增量复制的标准方式,本质是快照级复制而不是文件级同步,因此对大量小文件的场景效率明显优于 rsync。
基本信息
| 适用平台 | Linux + Btrfs(btrfs-progs) |
|---|---|
| 前置条件 | 发送端快照必须是只读(btrfs subvolume snapshot -r) |
| 增量依据 | -p 指定父快照,仅传输差异数据 |
| 传输方式 | 数据流可经 ssh、管道或文件转存,接收端用 btrfs receive 还原 |
典型使用场景
- 异地备份:每日快照增量发送到备份服务器,链路占用小
- 首次全量后长期增量:两端保留完整快照链,可随时取任一时间点
- 跨存储迁移:把整个子卷历史一次性搬到新设备
- 容器或虚拟机目录保护:快照粒度复制,不需逐文件比对
- 离线导带:把数据流写文件后再落到离线介质
全量与增量发送
全量与增量发送
btrfs subvolume snapshot -r /mnt/data /mnt/snap/data-2026-10-12 # 只读快照是前提
# 首次全量
btrfs send /mnt/snap/data-2026-10-12 | ssh backup@10.0.0.5 'btrfs receive /backup/btr'
# 次日增量:-p 指定父快照
btrfs send -p /mnt/snap/data-2026-10-12 /mnt/snap/data-2026-10-13 \
| ssh backup@10.0.0.5 'btrfs receive /backup/btr'
# 接收端核对快照链
ssh backup@10.0.0.5 'btrfs subvolume list -s /backup/btr'常见问题读法
| 报错/现象 | 含义 | 处理 |
|---|---|---|
| not a read-only snapshot | 发送端快照可写 | 用 -r 重建只读快照 |
| cannot find parent subvolume | 接收端缺少父快照 | 补齐父快照或改做全量 |
| 链路中断 | 传输未完成,接收端留下半成品 | 重试并检查接收端是否有残留快照 |
| 接收端空间不足 | 目标文件系统容量不够 | 扩容或调整保留策略 |
接收端保留父快照才能持续接收增量;保留策略要保证两端快照链一致。定期安排一次全量重做,可以避免长期依赖一条脆弱的增量链。
增量发送过程中删除发送端快照会直接破坏链路;接收端若被他人误删快照,下次增量会因找不到父快照而失败。