将ZFS文件系统从一个池移到另一个池

我正在扩展Solaris 10 U8服务器,除了root rpool之外还有一个额外的存储池。

将特定的ZFS文件系统从rpool移动到这个新的存储池最有效/简单/可靠的方法是什么?

可以在线完成,还是应该先closures使用这些池的服务?

关于禁用服务的问题主要取决于服务本身:

  • 他们是否正在积极地写入您计划移动的文件系统?
  • 他们是否存储你想保留的持久数据。

无论如何,发送ZFS文件系统可能需要很长时间。 通过大多数时间保持在线状态,可以最大限度地减less服务不可用性:

  • 创build一个快照
  • 以前面提到的方式发送快照,但同时保持所有服务的活动
  • 当在另一个池上接收到fs时,请禁用该文件系统的关键服务边界。 确保目标池上的新文件系统未被修改,因为更改将在稍后被丢弃。
  • 创build第二个快照(例如快照2)
  • 以递增方式发送第二个快照,这将比以前的传输快得多。 例如:

    zfs send -i rpool / filesystem @ snapshot rpool / filesystem @ snapshot2 | zfs接收-F目标池/文件系统

  • 完成后,将文件系统挂载点从旧数据集移到新数据集。 例如:

    zfs set mountpoint=/application/directory.old rpool/filesystem 

    zfs set mountpoint = / application / directory destination / filesystem

您需要确保没有进程绑定到/application/filesystem (例如:访问文件或将其作为当前目录)来实现此目的。

  • 重新启用服务,你就完成了。

我不认为这可以在线执行,但我的过程将是closures必要的服务,拍摄快照并使用zfs发送/接收进行迁移。 就像是:

 zfs send rpool/filesystem@snapshot | zfs receive destinationpool/filesystem 

编辑:

如果您安装了“pipe道视图”命令(pv),则可以通过以下方式监视传输的状态:

 zfs send rpool/filesystem@snapshot | pv | zfs receive destinationpool/filesystem 

我重复了jlliagre所说的大部分内容,但增加了后代文件系统。 (当我忘记时,大部分是我有一个参考。)

如果你有子文件系统,你需要在zfs snapshot命令中使用-r标志,在zfs send命令中使用-r-R标志。 大写的-R移动所有属性 ,快照和克隆。

要移动整个池:

 zfs snapshot -r sourcepool@moving zfs send -R sourcepool@moving | zfs receive -F destpool 

然后为了更短的迁移时间同步closures应用程序,closuressamba,nfs

 zfs snapshot -r sourcepool@moving2 zfs send -Ri sourcepool@moving sourcepool@moving2 | zfs receive -F destpool 

如果要为迁移创build多个中间快照,请阅读有关zfs send -I开关的手册页。

在stream水线中使用诸如“mbuffer”之类的工具也会带来一些好处; 显然,如果ZFS的send / recv性能大大提高,如果两端都可以连续传输数据,而没有使用mbuffer(或者类似的东西),那么你会得到一个乒乓效应,而另一个则不断地阻塞。