我在通用的 Ubuntu 18.04 系统上使用 zfs。使用常规挂载点创建和挂载文件系统时一切正常。
但是,如果我可以使用在启动时自动挂载的旧式挂载,那么这个用例将会很有帮助。
如果我将传统挂载设置为noauto
,然后在启动后手动挂载,则一切都正常。
但是当我删除时noauto
,我无法在启动时自动挂载。问题很明显——在启动期间,在加载 ZFS 模块之前尝试挂载驱动器:
$ systemctl status home-vagrant.mount
● home-vagrant.mount - /home/vagrant
Loaded: loaded (/etc/fstab; generated)
Active: failed (Result: exit-code) since Thu 2020-04-30 11:41:07 PDT; 24s ago
Where: /home/vagrant
What: vagrant
Docs: man:fstab(5)
man:systemd-fstab-generator(8)
Process: 464 ExecMount=/bin/mount vagrant /home/vagrant -t zfs (code=exited, status=2)
Apr 30 11:41:07 ubuntu mount[464]: The ZFS modules are not loaded.
Apr 30 11:41:07 ubuntu mount[464]: Try running '/sbin/modprobe zfs' as root to load them.
Apr 30 11:41:07 ubuntu systemd[1]: home-vagrant.mount: Mount process exited, code=exited status=2
Apr 30 11:41:07 ubuntu systemd[1]: home-vagrant.mount: Failed with result 'exit-code'.
Apr 30 11:41:07 ubuntu systemd[1]: Failed to mount /home/vagrant.
当然,在引导过程的后期,ZFS 模块会被加载,并且可以正确安装。我可以在引导打印输出中看到这两个事件,很明显问题是什么 - 但不是解决办法。
我还没能找到简单的方法来处理这个问题。据我所知,安装 zfs-initramfs 似乎应该能解决这个问题 - 但如何解决呢?
目前流传的少量信息似乎主要涉及使用 zfs 作为根文件系统,而在许多情况下,这要复杂得多。
部分用例可能会澄清我为什么需要旧式挂载 - 我有正在 ZFS 文件系统中挂载的绑定挂载。因此,一种解决方法是使用链接而不是挂载 - 如果我无法解决这个问题,我就会这么做。
但这似乎是可行的!
编辑:我可以通过三种不同的方式在启动中看到 zfs 模块插入:modules_load=zfs
在我的内核启动命令行中,或者将 zfs 行添加到/etc/modules-load.d/modules.conf
,或者/etc/modules-load.d/zfs.conf
使用该行创建。
当这些存在时,我看到了“插入模块 zfs”这一行,但它后挂载驱动器的尝试失败。
如果没有这三行中的任何一行,我就看不到“插入模块 zfs”行,但是我可以看到模块安装后出现的配套行“ZFS:已加载模块”。
无论如何,看起来所有这些强制提前加载模块的尝试似乎都是无效的。
编辑2:如果我将 zfs 添加到 /etc/initramfs-tools/module,然后 update-initramfs -c -k all,然后 update-grub,我会看到行为发生变化。
现在看起来像是 ZFS 模块做在 systemd 模块加载器服务模块之前以及在 mount 命令之前加载。
安装仍然失败,并出现无法打开数据集信息。
这可能是因为,虽然模块已加载,但其他 ZFS 服务尚未启动。尽管我很早就得到了“内核:ZFSL 已加载模块”,但直到很晚(安装失败后)我才看到“systemd[1]:正在启动安装 ZFS 内核模块”。我认为模块已经启动,所以这是一个毫无意义的输出,但那是各种 zfs 服务启动的时候。
我不知道这些服务如何能在启动过程的更早阶段启动,但有些系统是从 zfs 根驱动器启动的,所以有办法做到这一点……
解决方案?:
@Gordan Bobic 建议在我的 fstab 条目中使用 _netdev - 这可能不是最优雅的解决方案,使用了错误的工具,但它确实延迟了安装足够长的时间来避免问题。
我采纳了这个想法,并尝试使用noauto,x-systemd.automount
它,我猜想它对我的用例来说可能更可靠一些。需要更多测试,但它似乎会起作用。
答案1
不确定这是否是正确的解决方案,但这对我有用。
systemctl edit home-vagrant.mount
[Unit]
Requires=zfs-import.target
After=zfs-import.target
编辑:下列方法之一也可能有效。
<pool/dataset> /var/log zfs x-systemd.after=var.mount
<pool/data> /home zfs x-systemd.before=zfs-mount.service
答案2
尝试添加 zfs/etc/modules-load.d或使用 modules_load 和 rd.modules-load 的内核启动命令行。
如果失败,请将 _netdev 添加到您的 fstab 选项中。这将推迟安装,直到网络堆栈初始化,这将为 zfs 池导入服务提供额外的时间来加载。