我想确保在由 管理的服务systemd
启动之前有一个可用的 ZFS 挂载点。因此,我将使用单元After=
中的节systemd
。但是,要写什么作为参数呢?
由于发布版本持续存在性能问题,我使用本地安装的 ZFS,并导入唯一的池
[Unit]
Description=ZFS pool import for source installations of ZFS
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/zpool import -d /dev data
[Install]
WantedBy=multi-user.target
因为我从来没有找到任何有用的关于 Ubuntu 的支持文档systemd
,而且似乎现在才成为开发者的目标。
但是,在另一个系统上,我也遇到了内置资源问题,例如,zfs-mount.service
即使没有导入任何池,它也会加载并运行,因此无法成功挂载。
是否有一个目标可以让我的服务依赖它,以便仅在挂载点可用后启动,并且如果整个 ZFS 或仅挂载点初始化失败则拒绝启动(并且我可以复制它以进行本地安装)?
我正在使用 Ubuntu 17.10。
答案1
系统默认设置
这里有很多神奇的东西,但在 Ubuntu 18.04 上答案一般来说似乎是zfs.target
,它被列为WantedBy
各种zfs-*.service
s(mount、modprobe 等)。如果你仔细阅读,你会看到这一点
more /lib/systemd/system/zfs* | less
您可能会注意到,在运行之后但在文件系统挂载之前也有一个zfs-import.target
满足的条件。zpool import
不过,就我而言,还有其他步骤需要先执行(例如,加密块设备映射),因此这些步骤对我来说不是开箱即用的。
特定挂载点
对于特定挂载点,我建议不要依赖通用的zfs.target
,而是添加您自己的服务(可能使用Wants=zfs.target
),以检查系统所依赖的特定挂载的状态。例如,如果您依赖于/blah/my/zfs/mount
挂载,只需为其创建一个服务,该服务可以在返回之前检查 zfs 挂载状态,可能使用
zfs get mounted blah/my/zfs/mount | grep yes
例子
/etc/systemd/system/my-zfs-mount.service
[Unit]
Description=ZFS mount blah/my/zfs/mount
Wants=zfs.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/zfs get mounted blah/my/zfs/mount | grep yes
[Install]
WantedBy=multi-user.target
然后您的其他服务就可以依赖于这个。