在 Ubuntu 启动时等待 zpool import

在 Ubuntu 启动时等待 zpool import

我使用 ZFS 在 Dell PowerEdge R720xd 上安装了 Ubuntu 18.04。ZFS 配置中有两个 1TB 启动驱动器mirror。我按照Linux Wiki 上的 ZFS

(注意:我的系统使用 LSI LSI00244(9201-16i)主机总线适配器(HBA)而不是板载 RAID 卡,因为 ZFS 和此 RAID 卡不兼容。)

启动 Ubuntu 时,系统需要大约十秒钟才能枚举驱动器(共有 14 个驱动器 - 两个用于操作系统,12 个用于数据存储,稍后将在其他 zpools 中设置)。但是,启动过程会在枚举驱动器之前尝试导入启动池。

BusyBox 错误消息在屏幕上闪过,其基本内容是:

池导入失败。

在此 BusyBox shell 中手动导入池,然后键入exit以继续启动过程。

如果我在该消息出现后等待几秒钟,我就会看到列出 14 个驱动器。

zpool import rpool我在 BusyBox 提示符下输入,它起作用了(用 确认zpool list),然后exit继续启动过程。(这导致了我的下一个问题,内核崩溃,但这是另一个问题。)

我尝试将其添加rootdelay=15到启动选项中,但似乎不起作用,因为它似乎想要运行该延迟ZFS 池导入。

如何让启动过程等待设备出现后再尝试导入池?

答案1

我终于在以下位置找到了它/etc/default/zfs

# Wait for this many seconds in the initrd mountroot?
# This delays startup and should be '0' on most systems. This might help on
# systems which have their ZFS root on a USB disk that takes just a little
# longer to be available
# Only applicable for Debian GNU/Linux {dkms,initramfs}.
ZFS_INITRD_POST_MODPROBE_SLEEP='0'

设置方法如下。

  1. 从 Ubuntu Live CD(或任何其他恢复媒体)启动
  2. 将池导入/mnt使用zpool import rpool -R /mnt
  3. 绑定必要的文件系统mount --rbind /dev /mnt/dev; mount --rbind /proc /mnt/proc; mount --rbind /sys /mnt/sys
  4. Chroot 进入/mntchroot /mnt /bin/bash --login
  5. 编辑/etc/default/zfs以将上面的值从更改015
  6. 运行update-initramfsupdate-grub
  7. 退出 Chroot 环境并重新启动

答案2

2022 年 5 月 27 日更新:

我安装并运行了带有 ZFS-on-root(和 ext4/boot分区)的 Ubuntu 22.04。

然而,根据我遇到的问题,我建议不要在 Linux 上使用 ZFS-on-root。

具体来说,Linux + ZFS-on-root + 快照(可能还与绑定挂载和/或容器结合)可能会导致问题。更具体地说:快照问题。

为根文件系统创建一个 ZFS 池,为其他所有文件系统创建一个单独的 ZFS 池,这样可能会缓解或避免这些问题。但我还没有尝试过。

如果你确实想尝试在 Linux 上运行 ZFS-on-root,我建议你先在 GitHub 上搜索未解决和已解决的问题熟悉您可能遇到的问题。

我遇到的问题似乎在以下 GitHub 问题报告中提及: 816451494619479995810348, 和可能更多

由于许可证冲突,OpenZFS(很可能)永远不会与 Linux 内核合并。因此,我怀疑 OpenZFS 永远不会像 Linux 上的根文件系统那样接受像直接内置于 Linux 内核的 GPL 许可文件系统(例如 ext4、Btrfs、XFS)那样多的测试。


2022 年 5 月 20 日的原始答案:

从 Ubuntu 22.04 开始,添加ZFS_INITRD_POST_MODPROBE_SLEEP='15'仍然/etc/default/zfs可以解决问题。(另外:就我而言,我只需要1延迟一秒钟。)

不过,我认为值得指出的是……

  • ZFS_INITRD_POST_MODPROBE_SLEEP
  • ZFS_INITRD_PRE_MOUNTROOT_SLEEP

...现已弃用并被删除/etc/default/zfs注1笔记2拉取请求)。

弃用的理由是描述在这里

简而言之,似乎现在有一个内核命令行选项rootdelay=n应该使用它。

如果您想查看使用这些变量的实际 OpenZFS initramfs 脚本,请参见这里:
https://github.com/openzfs/zfs/blob/master/contrib/initramfs/scripts/zfs

相关内容