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

ZFS send/receive 复制

把快照导出为数据流并复制到另一存储池(可跨主机),使用 -i 参数只传两个快照之间的差异,实现高效的异地副本。

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

ZFS send/receive 复制

把快照导出为数据流并复制到另一个存储池,可以在同一台机器内也可以跨主机。使用 -i 只发送两个快照之间的差异,形成高效的异地副本;-R 连子数据集一起递归复制。它是 ZFS 场景下做块级异地复制的标准手段,配合快照策略可实现接近连续的数据保护。

基本信息

适用平台OpenZFS:FreeBSD / Linux / illumos
权限要求root 或带 send/receive 委托权限的用户
核心参数-i 增量(含中间快照依赖)、-I 增量并包含中间所有快照、-R 递归含子数据集
接收端zfs receive,目标池建议关闭压缩以外的额外特性差异

典型使用场景

  • 异地副本:每日增量发送到灾备机房的存储池
  • 池迁移:整池数据迁到新设备,保留快照历史
  • 快照归档:把历史快照按月发送到低成本的归档池
  • 数据交付:给测试环境一份指定时间点的数据副本
  • 备份验证:接收端直接读快照内容,确认数据可用

全量与增量复制

全量与增量复制
# 首次全量复制(含子数据集)
zfs send -R tank/data@2026-10-01 | ssh backup@10.0.0.5 'zfs receive -F backup/data'
# 增量:只传两个快照之间的差异
zfs send -i tank/data@2026-10-01 tank/data@2026-10-02 \
  | ssh backup@10.0.0.5 'zfs receive backup/data'
# 长链路加缓冲,避免网络抖动导致中断
zfs send -i @2026-10-01 tank/data@2026-10-02 | mbuffer -q -s 128k | ssh backup@10.0.0.5 'zfs receive backup/data'
# 接收端检查快照链
ssh backup@10.0.0.5 'zfs list -t snapshot -r backup/data'

参数与行为

参数行为注意
-i两组快照之间的差异接收端必须已有基点快照
-I增量并包含中间所有快照体积更大,但链路更健壮
-R递归包含子数据集与属性接收端会创建同名子数据集
-F接收前回滚目标会丢弃目标端多余数据,谨慎使用
跨主机复制可用 pv 或 mbuffer 做缓冲,稳定长距离链路的吞吐;两端 ZFS 大版本或特性标志差异可能导致接收失败,升级前先用小数据集验证。
接收端用 -F 会强制回滚并可能与源端一致,目标上不在快照链里的数据会被丢弃,执行前确认目标池没有需要保留的内容。

易错点

  • 接收端快照被删除:增量流缺少基点被拒绝,只能重新全量
  • 两端特性标志不兼容:接收失败且报错不易理解,升级前先验证
  • 误用 -F 覆盖目标:目标端独立数据被回滚丢弃
  • 把复制当备份:复制会同步误删,历史版本仍需保留策略保护

数据来源与参考

  • OpenZFS 文档(zfs-send / zfs-receive)
  • man 8 zfs-send
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌