把ZFS根文件系统的Proxmox VE迁移到另一组硬盘上

任务简述

现在我们有一台Proxmox VE 6.0的服务器,原来是四块SSD组的ZFS mirror,因为各种原因需要把数据迁移到另两块SSD组的新ZFS mirror上,把原来的四块SSD释放出来挪作他用。因为跨国操作IPMI延迟很高,所以我们要尽量避免操作IPMI,尽量通过SSH完成整个迁移流程。

操作流程

准备操作系统

  1. 关掉所有无关的开机启动程序;
  2. 关掉所有的VM的开机启动;
  3. 如果有VM的硬盘在rpool下的ZFS zvol里面,把它迁移到Directory类型的存储下并勾选删除源;
  4. 做一次完整的系统备份

关于迁移硬盘存储位置:zvol需要逐个迁移,但是如果在Directory类型的存储下那就可以跟着系统一起复制走,能省很多条命令。有些类型的VM硬盘(比如EFI Disk)似乎是没有办法迁移的;这次要操作的服务器上正好遇到了这样的情况,所以下面的流程当中也会讲到怎么处理这样的硬盘。

识别硬盘ID

组ZFS最好用硬盘ID而非顺序分配的dev名称进行,以防翻车。为了下文识别方便,这里我们使用A、B、C、D来标识原来的四块SSD,用X和Z标识新的两块SSD。在开始之前,先记录一下硬盘id和dev名称的对应关系。

在新硬盘上建立GPT分区表

首先我们记录一下原来分区的分区表:

在新的两块硬盘上抄一个结构差不多的上去:

建立新的ZFS存储池

同样首先记录一下原来的zpool的状态:

然后在新硬盘上抄一个差不多的:

看一下原来的池子里面有什么卷:

vm开头那些是zvol,不需要管,把剩下那些volume也一样创建一份:

注意:

  • 我们这里暂时把新的根文件系统找了个地方挂载,因为直接挂载到/显然是会挂不上的;
  • 新创建的存储池名叫rpool2;但是为了迁移方便,它之后还是会被挂载到/rpool这个位置。

迁移数据

Volume全部创建好以后,把原来volume里面的数据原样复制到新的volume里面:

至于那些vm开头的zvol,逐个创建相同大小的新zvol然后把数据全部dd进去:

修复各种程序对路径的引用

首先是Proxmox VE的存储池定义:

然后是GRUB:

操作GRUB时我们还是使用传统的dev设备名。

从新硬盘引导启动

重启,在固件中设置用新硬盘(任意一块即可)引导启动。

清空旧硬盘

注意:

  • 卸载volume的时候需要按列出顺序的相反顺序进行;
  • 如果第一步失败了,那么完成以后再次重启一下,这样系统就不会认到旧的硬盘了。

恢复环境

  1. 把VM的硬盘重新迁移回zvol;
  2. 启动所有VM;
  3. 恢复所有VM的开机自启动设置;
  4. 恢复程序的开机自启动设置。

故障救援

Proxmox VE安装盘可以用来临时引导系统进行特定的恢复工作,不过光盘内建的GRUB不支持lz4压缩的ZFS根文件系统,所以GRUB里面直接选择Rescue Boot菜单项是无法引导成功的。这时候可以先选择进入安装程序,等待同意用户协议的画面出现,按Ctrl+Alt+F1,再按Ctrl+C退出安装程序,从这里挂载根文件系统进行修复工作:

在完成修复工作后,需要正确卸载存储池,以防进系统以后出现问题:

GRUB无法加载Stage 2

如果GRUB在安装的时候读取到了错误的硬盘信息,可能会发生这样的问题:抹掉原来的硬盘并重启以后,GRUB无法加载stage 2,在屏幕上输出:

这可以通过重新安装GRUB并生成配置文件来解决。按上面的说法进入恢复环境,然后运行:

退出恢复环境并重启即可。


参考:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据