在执行其他操作之前,如何让 systemd 启动我的 ZFS 挂载脚本?

在执行其他操作之前,如何让 systemd 启动我的 ZFS 挂载脚本?

现在我在 Fedora 19 上使用 zfsonlinux,它运行得非常好。按照计划,使用 systemd 调用的 initscript(包含在 zfs 中)在启动时进行挂载,但是有一个非常明显的缺陷:ZFS 的挂载方式,在启动期间太晚了,以至于在没有 /zfs 的情况下传输和其他服务会丢失很多已安装且无法恢复,因此失败。

我所追求的是一种让 systemd 在执行其他操作之前启动脚本的方法。我知道如何使用 initscripts 来做到这一点(只需将其设置为较低的运行级别,例如 2),但是当涉及到使用 systemd 的目标系统执行此操作时,我还没有最模糊的地方。

我尝试在需要 zfs 启动的服务中进行设置,但是除了 Type=idle 之外不起作用(但无论如何肯定有更好的方法):

Requires=network.target
After=zfs
Type=idle

并且作为参考,这是 Fedora 提供的 initscript。由于 ZFS 在 Linux 上挂载方式的性质(?),我不能只是将一个条目放入 fstab 中并完成它,它必须使用命令来挂载。

答案1

systemd对于这种情况有一个特定的指令,称为RequiredMountsFor;看man systemd.directives

用法是RequiresMountsFor=[mountpoint],例如RequiresMountsFor=/zfs

关键问题可能是您是否真的需要反映“任何其他”条件,例如您的 Q 状态。我认为这个想法是尽可能有选择性地使用这些依赖关系来支持寻找最佳序列和最大并行化。

答案2

我会尽力回答,但不太熟悉 systemd。

提供的脚本只是一个标准脚本,因此您始终可以以script_name start.

根据我在 systemd 手册页中看到的内容,您可以定义依赖项,最好的方法是使用 Before 和 After 特定目标。查看这些文件,有一个来自运行级别 2、3 和 4 的别名始终为 multiuser.target。

如果您执行 systemctl list-dependency basic.target 您可以轻松找出您希望服务启动的位置。

[Unit]
Description=my Service
Before=basic.target 
After=local-fs.target

[Service]
Type=simple
ExecStart=/path/to/script start
ExecStop=/path/to/script stop

保存文件示例 /usr/lib/systemd/myservice.service。 systemctl 启用 myservice.service。

相关内容