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


18

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

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

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

Answers:


15

关于禁用服务的问题基本上取决于服务本身:

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

无论如何,发送ZFS文件系统可能会花费很长时间。通过使大多数时间保持在线状态,可以最大程度地减少服务的不可用性:

  • 创建快照
  • 以先前建议的方式发送该快照,同时保持所有服务处于活动状态
  • 当在另一个池上接收到fs时,请禁用该文件系统的关键服务绑定。确保目标池上的新文件系统没有被修改,因为无论如何以后所做的更改都将被丢弃。
  • 创建第二个快照(例如,snapshot2)
  • 逐渐发送第二张快照,这将比上一次传输快得多。例如:

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

  • 完成后,将文件系统安装点从旧数据集中移动到新数据集中。例如:

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

    zfs set mountpoint = /应用程序/目录目标/文件系统

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

  • 重新启用服务即可完成。

10

我不认为这可以在线执行,但是我的过程将是关闭必需的服务,拍摄快照并使用zfs send / receive进行迁移。就像是:

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

编辑:

如果安装“管道视图”命令(pv),则可以使用以下方法监视传输状态:

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

10

我将重复jlliagre所说的大部分内容,但还要添加一些有关后代文件系统的内容。(通常是这样,当我忘记时我会提供参考。)

如果您有子文件系统,则需要使用-rzfs snapshot命令上的标志以及该命令上的-ror -R标志zfs send。大写字母-R将移动所有属性,快照和克隆。

要移动整个池:

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

然后在较短的迁移周期内同步更改,请关闭应用程序,关闭samba,nfs

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

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


3
在我的实验中,确切的命令似乎是:zfs send -R Pool0 @ moving | zfs收到-dF Pool1
TinkerTank,2012年

4

您还会发现在管道中使用“ mbuffer”之类的工具会有一些好处。显然,如果两端大部分都可以连续流传输数据,并且没有mbuffer(或类似的东西),您会得到乒乓效应,其中一个在另一个上连续阻塞,那么ZFS发送/接收性能会大大提高。


请注意,这是一个非常古老的问题(超过5年),您的答案不太可能为这个古老的问题添加任何内容。
Catherine MacInnes

1
这是很好的建议,我也将其用于池移动。
Dan Buhler
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.