我在一台有 6 个磁盘的服务器上的 ZFS 上安装了 proxmox(我认为是 v5.4)。有 2 个池:rpool 位于两个 SSD 的镜像中,其中包含 proxmox 根文件系统和一些容器和 zvol。其他 4 个磁盘位于 raidz-1 中的另一个池(HDD)中。
两个月前,我在 ZFS 参数中做了一些优化工作,并dnodesize = auto
在所有池中激活了它,包括 rpool 池和子池。现在我重新启动了服务器,出现了以下消息:
error: no such device: 40d7d14f38cc...
error: unknown filesystem
Entering rescue mode...
grub rescue>
根据我所做的研究,我认为这与参数有关dnodesize
(检查这里,这里和这里)直接引用第一个链接:
某些文件一定触发了数据集中的非旧式(512 字节) dnode 大小,这意味着 GRUB 无法再读取驱动器。
现在我对从哪里开始有一些想法,但也有很多疑问(我是一个不太有经验的管理员),所以我想先问你,以免走进死胡同和/或彻底破坏某些东西。
首先,我可以创建一个具有 ZFS 操作系统的实时 USB。最好的选择可能是使用相同的 5.4 proxmox ISO。到达那里后,是否可以从实时 USB 加载和操作旧的 proxmox 池?怎么做?
问题是设置还不够,dnodesize = legacy
因为更改不会追溯应用。所以我不知道这里该怎么做。但我有以下选择:
- 如果有办法检测哪些文件超出了 512 字节的标准 dnode 限制。然后将它们剪切/移动到另一个位置,再粘贴/移动回去。问题来了,如何检测这些文件?
- 将所有 rpool 内容剪切到外部磁盘,然后再次将其粘贴到 rpool 中。这里的问题是,我觉得将 proxmox 根文件系统前后移动并期望它再次工作不安全。也许用
cp -a
? - 似乎 grub 需要读取的唯一内容是 /boot 中的内容。但 /boot 文件夹位于 rpool 池内,而 zfs 池不可缩小。因此,我无法缩小任何当前池来为启动创建新池,也无法向服务器添加任何额外磁盘。唯一的选择是将 /boot 移动到 pen 驱动器并告诉 grub 在那里搜索。但这似乎不是一个非常强大或明确的解决方案。
有什么建议吗?
编辑:将 grub2 替换为更适合 zfs 的引导程序怎么样?摘自 proxmox wiki:
systemd-boot 是一个轻量级 EFI 引导加载程序。它直接从安装它的 EFI 服务分区 (ESP) 读取内核和 initrd 映像。直接从 ESP 加载内核的主要优点是它不需要重新实现用于访问存储的驱动程序。在 ZFS 作为根文件系统的上下文中,这意味着您可以在根池上使用所有可选功能,而不是在 grub 中的 ZFS 实现中也存在的子集,或者必须创建单独的小型引导池。
事实上看起来:
Proxmox VE 目前使用两个引导加载程序之一,具体取决于安装程序中选择的磁盘设置。对于使用 ZFS 作为根文件系统安装的 EFI 系统,使用 systemd-boot。所有其他部署都使用标准 grub 引导加载程序。
所以我不知道为什么它是用 grub 而不是 systemd-boot 安装的。在不破坏任何东西的情况下更换引导加载程序是否可行?
感谢您的帮助。