我在自动挂载具有嵌套挂载点的单独池时遇到问题。我使用的是 ZfsOnLinux 0.6.2。
目前情况如下:
zpool1 ---> /var
zpool1/log ---> /var/log
zpool1/mail ---> /var/mail
现在我需要为 db 添加一个单独的 zpool。为了保持目录层次结构的一致性,我考虑了这一点:
zpool2 ---> /var/db
现在,问题是当首先挂载 zpool2 时,zpool1 无法挂载(这是合乎逻辑的)。
除了使用旧式挂载选项外,还有什么方法可以强制池的挂载顺序,以允许在 zpool1 内挂载 zpool2?类似 zpools 依赖项?还是我应该不惜一切代价避免这种嵌套挂载?
答案1
不要将其安装zpool2
为/var/db
,而是将其安装为/zpool2
或/db
或任何对您有意义的内容。
然后建立/var/db
一个符号链接到/db
。
答案2
您可以设置文件系统挂载点属性legacy
并使用/etc/fstab
来定义它们。
这样,您将能够定义它们的安装顺序。
编辑:我刚刚注意到您已经考虑了传统方法。不过它可能是唯一的方法。
答案3
在同一个池内,挂载路径的组成决定了挂载顺序。在一个池内,Zfs 会按照各自的挂载点路径对要挂载的文件系统进行排序,从而保证挂载顺序正确。
当涉及 2 个或更多池时,没有类似的设施来自动在池之间强制执行安装顺序。
换句话说,Zfs 有一个内置机制,可确保任何挂载点组合都会使 fs-s 以正确的顺序挂载,但是当涉及多个池时,它没有类似的功能来做出此保证。
如果pool2 有一个文件系统,该文件系统设置为挂载在挂载点上,而该挂载点是通过首先在pool1 中挂载 fs 而提供的,则管理员需要确保pool1 确实首先挂载。例如:必须编写脚本。因此答案是“不要指望这个问题会自行解决”。
答案4
在 ubuntu 和 debian 中您可以编辑文件 /etc/default/zfs ....
initramfs 启动时应导入的池列表
而不是尝试导入所有可用池。如果设置了
那么 ZFS_POOL_EXCEPTIONS 将被忽略。
这是一个以分号分隔的列表。
#ZFS_POOL_IMPORT="rpool;bpool;cpool"
也许您可以设置 ZFS_POOL_IMPORT="zpool1;zpool2" 并尝试是否按照列出的顺序导入它们。如果没有,则只需将 zpool1 放入其中,并创建一个名为 zpool2-import.service 的 systemd 文件
[单元] 描述=Zpool2 安装后=zfs-import.target 需要=zfs-mount.service
[服务] Type=oneshot ExecStart=/sbin/zpool import zpool2 -N Exec=/sbin/zfs mount -a (或 zpool2/var/db)
[安装] WantedBy=zfs-import.target.wants
################# 或者编辑 zpool1 的挂载点 zfs set canmount=off zpool1/var zfs set mountpoint=none zpool1/var mkdir -p /var/db
因此 /var 中的其他数据集都可以挂载,例如 zpool1/var/cache 将挂载
在 /var/cache 上,如果首先导入 zpool2,则 pool1 是否挂载并不重要,因为目标( /var/db )仍然在根文件系统上。
也以同样的方式编辑 zpool2 zfs set canmount=off zpool2/var zfs set mountpoint=none zpool2/var
zfs 设置挂载点=/var zpool2 zfs 设置挂载点=/var/db zpool2/var/db zfs 设置覆盖=on zpool2
然后它应该挂载