Ubuntu 18.04 上的 zfs legacy 挂载

Ubuntu 18.04 上的 zfs legacy 挂载

我在通用的 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 池导入服务提供额外的时间来加载。

相关内容