我使用 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'
设置方法如下。
- 从 Ubuntu Live CD(或任何其他恢复媒体)启动
- 将池导入
/mnt
使用zpool import rpool -R /mnt
- 绑定必要的文件系统
mount --rbind /dev /mnt/dev; mount --rbind /proc /mnt/proc; mount --rbind /sys /mnt/sys
- Chroot 进入
/mnt
:chroot /mnt /bin/bash --login
- 编辑
/etc/default/zfs
以将上面的值从更改0
为15
- 运行
update-initramfs
并update-grub
- 退出 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 问题报告中提及: 816, 4514, 9461, 9479, 9958, 10348, 和可能更多。
由于许可证冲突,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