首页/数据/备份与容灾速查/Btrfs send/receive 增量复制

Btrfs send/receive 增量复制

把只读快照序列化为数据流发送到另一个文件系统(可跨主机),用父快照参数实现增量传输,是 Btrfs 的异地备份通道。

备份与容灾速查数据更新于 2026-10-13

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接收端缺少父快照补齐父快照或改做全量
链路中断传输未完成,接收端留下半成品重试并检查接收端是否有残留快照
接收端空间不足目标文件系统容量不够扩容或调整保留策略
接收端保留父快照才能持续接收增量;保留策略要保证两端快照链一致。定期安排一次全量重做,可以避免长期依赖一条脆弱的增量链。
增量发送过程中删除发送端快照会直接破坏链路;接收端若被他人误删快照,下次增量会因找不到父快照而失败。

易错点

  • 父快照在任一端被删除:增量链断裂,必须重新做一次全量
  • 长距离链路中断不会自动续传:需要重试脚本并评估链路稳定性
  • 接收端快照被当作普通目录修改:快照是只读的,任何写入尝试都会报错,需用可写快照或克隆
  • 只发增量不留全量:恢复时无法从零开始还原

数据来源与参考

  • btrfs 官方文档(btrfs-send / btrfs-receive)
  • man 8 btrfs-send
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌