辅助池不会在启动时导入

辅助池不会在启动时导入

我有一个 Ubuntu 19.10 安装,最初是用 EXT4 设置的,但我按照以下说明迁移到了 ZFS 上的根目录:https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS

当我使用 ZFS 设置 PopOS 或 Arch 时,我遇到了许多安装问题(例如无法将 /var 作为挂载数据集),而这些问题并没有出现。

我唯一剩下的问题是我有第二个硬盘,也是 ZFS,我试图让系统在启动时自动导入。系统和这个辅助硬盘都使用 LUKS。我正确设置了 cryptsetup,以便在我输入根系统密码的同时解密辅助硬盘。

缓存文件未导入池(尽管已将其设置为在 cryptsetup 之后运行),这显然是我在 AskUbuntu 上看到的另一个错误。然后,我设置了一个 systemd 服务来专门导入池,方法与上述说明建议创建用于导入启动池的服务相同。

问题是我无法让服务在正确的时间运行,因此导入池总是失败,ZFS 会说池不存在。似乎我无法让 systemd 在正确的时间运行服务。通过下面的文件,我注意到该服务肯定正在运行cryptsetup 已完成,所以我不知道为什么 ZFS 找不到池。奇怪的是,它似乎是第一的在 cryptsetup 完成后运行的服务。我确实注意到,在某个时候,一些 systemd 日志指出 cryptsetup 依赖项由于依赖项循环而被丢弃,但我已经很久没有看到该错误了,我不确定是什么原因造成的。

所以问题是 - 我该如何实现这一点?我是否遗漏了 systemd 中某些明显的功能?

这是我正在使用的服务文件。

[Unit]
DefaultDependencies=no
Requires=zfs-load-module.service
After=systemd-udev-settle.service
After=zfs-load-module.service
After=cryptsetup.target
Before=zfs-import-scan.service
Before=zfs-import-cache.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sleep 3
ExecStart=/sbin/zpool import -N zfsmedia

[Install]
WantedBy=zfs-import.target

如果没有 ExecStartPre,它就永远无法工作。系统启动时不会挂载池。有了 ExecStartPre,它大约能工作 50/50。我还没有尝试过更大的延迟。我还尝试添加 After=fs-remount-rw.service,但没有效果。如果我删除 Before= 行,那么系统会奇怪地进入救援 shell,其中一半的系统数据集未挂载(我在尝试获取 ZFS 上的根目录时也多次出现过这种症状)。

在启动时导入失败后,我可以在启动后输入“zpool import zfsmedia”,它工作正常。似乎只是 systemd 单元的时间错误,我不知道如何纠正它,或者如果问题是 systemd 不遵守依赖关系,该怎么办。

答案1

TL;DR-下面正在运行 systemd 服务!

感谢您的发帖,因为我遇到了完全相同的问题,也在 Ubuntu 19.10 上运行 ZFS 根。

思考发生的事情是,在启动 ZFS 根目录时,会运行一个特定于 initrd 的脚本,该脚本与中的标准脚本zfs不同,并且会忽略中的一些标准配置。我在主系统的其他地方找不到这个确切的文件。不过,我也感到很沮丧,并停止了进一步挖掘。zfs-import/etc/init.d/etc/default/zfs

自从我看到您的帖子后,我决定查看 systemd 来挂载 zpool,但我使用 Ubuntu 提供的 zfs systemd 服务作为起点。

我检查了 zfs-import-cache 服务……它显然不适合我,但我认为它会提供有关相对依赖关系的提示。然后我使用它来创建自己的服务。

systemctl cat zfs-import-cache > /etc/systemd/system/zfs-import-datastore.service
# edit as needed (see below)
systemctl daemon-reload
systemctl enable zfs-import-datastore

最终的服务:

# /etc/systemd/system/zfs-import-datastore.service
[Unit]
Description=Import ZFS pool - datastore
Documentation=man:zpool(8)
DefaultDependencies=no
Requires=systemd-udev-settle.service
Requires=zfs-load-module.service
After=systemd-udev-settle.service
After=zfs-load-module.service
After=cryptsetup.target
After=systemd-remount-fs.service
After=zfs-import-cache.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/zpool import datastore

[Install]
WantedBy=zfs-import.target

通过这项服务,我的 Ubuntu 19.10 系统可以干净启动,并且datastore除了和之外bpool还自动导入 zpool rpool

相关内容