创建 udev 符号链接后启动 systemd 服务

问题描述 投票:0回答:1

我有一个 systemd 服务将 UFS LU 的分区安装到 /mnt

## bt_mount.service ##
[Unit]
Description=Mount bt_firmware_a/b to /mnt

[Service]
Type=oneshot
PassEnvironment="SLOT"  ## "_a" or "_b", depends on the boot slot
ExecStart=/bin/mount -o noexec,nodev,ro /dev/disk/by-partlabel/bt_firmware${SLOT} /mnt

[Install]
WantedBy=local-fs.target

但是

有时这样说是失败的 “特殊设备 /dev/disk/by-partlabel/bt_firmware_a 不存在”

systemd-analyze 显示 bt_mount.service 在创建符号链接之前运行,这就是原因。

我在谷歌上搜索并了解到 systemd-udevd.service 在创建符号链接方面发挥着重要作用,并且当 udevadm --trigger 时它会创建它们。

systemd-udevd.service
systemd-udevd-trigger.service

我曾尝试使用下面的语句添加服务的依赖项,但仍然相同。

After=systemd-udevd-trigger.service systemd-udevd.service

那么,有没有办法让某些服务在创建特定符号链接后启动?

systemd udev
1个回答
0
投票

我参加聚会迟到了。然而,由于仍然没有答案并且出现在搜索引擎的顶部,值得提出一个解决方案。

在使用一次性服务时遇到类似问题花了一些时间,该服务必须在安装某些分区之前但在创建部分标签符号链接之后运行。

Systemd 为每个部分标签(此处为 XXX)创建一个

systemd-fsck@dev-disk-by\x2dpartlabel-XXX.service
,对于其他磁盘标签或partuuid 也类似。

由于您依赖于启动槽,我认为不可能仅等待活动启动槽的符号链接,因此将两个分区标签添加到您的

Wants/Requires
After
中,如下所示:

Wants=systemd-fsck@dev-disk-by\x2dpartlabel-bt_firmware_a.service systemd-fsck@dev-disk-by\x2dpartlabel-bt_firmware_b.service
After=systemd-fsck@dev-disk-by\x2dpartlabel-bt_firmware_a.service systemd-fsck@dev-disk-by\x2dpartlabel-bt_firmware_b.service

请根据您的使用情况随意使用

Requires
代替
Wants

希望这会对某人有所帮助,即使OP同时可能自己找到了方法。

© www.soinside.com 2019 - 2024. All rights reserved.