zfs send/receive 将旧存储池 app 完整迁移到新存储池 appdata 的命令流程
以下是使用 zfs send/receive 将旧存储池 app 完整迁移到新存储池 appdata 的命令流程(假设新旧池均为 ZFS 文件系统):
步骤 1:创建旧池的快照
bash
复制
创建一次性快照(名称可自定义,如 "migration")
zfs snapshot -r app@migration
-r 参数会递归为旧池下所有子数据集(dataset)创建快照。
步骤 2:发送快照到新池
单次全量传输(适用于首次迁移)
bash
复制
将旧池快照完整发送到新池
zfs send -R app@migration | zfs receive -F -v appdata
关键参数:
-R:发送包含所有子数据集及历史快照的完整流。
-F:强制覆盖目标池(确保新池 appdata 已创建且为空)。
-v:显示传输详情。
步骤 3(可选):增量同步
如果旧池在首次迁移后仍有数据变动,可基于旧快照进行增量同步:
bash
复制
1. 创建新快照(如 "migration2")
zfs snapshot -r app@migration2
2. 发送增量数据(从旧快照 "migration" 到新快照 "migration2")
zfs send -R -I app@migration app@migration2 | zfs receive -F -v appdata
-I 表示增量传输(需指定起始快照)。
步骤 4:验证迁移结果
bash
复制
查看新池数据集结构是否与旧池一致
zfs list -r appdata
检查新池是否包含快照
zfs list -t snapshot -r appdata
注意事项
存储池状态:
确保新池 appdata 已提前创建且无重要数据(-F 会覆盖目标池)。
新旧池的 ZFS 版本需兼容(TrueNAS Scale 默认自动处理)。
服务暂停:
迁移前停止所有访问旧池的服务(如 SMB/NFS/Docker),避免数据不一致。
空间要求:
新池容量应 ≥ 旧池已用空间(可通过 zfs list -o used app 查看)。
跨物理机传输:
若新旧池位于不同设备,需通过 SSH 管道传输:
bash
复制
zfs send -R app@migration | ssh user@new_host "zfs receive -F appdata"
迁移后操作
重定向应用:
修改 TrueNAS 应用(如 Docker)、共享服务的存储路径至新池 appdata。
删除旧池(可选):
确认数据无误后,可销毁旧池:
bash
复制
zpool destroy app
通过以上命令,旧池 app 的所有数据(包括子数据集、属性、压缩设置等)将完整复制到新池 appdata,且效率远高于文件级复制工具(如 rsync)。