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 会强制回滚并可能与源端一致,目标上不在快照链里的数据会被丢弃,执行前确认目标池没有需要保留的内容。