systemd 单元名称中“前缀的最终组成部分”的使用示例是什么?

systemd 单元名称中“前缀的最终组成部分”的使用示例是什么?

Systemd 允许您创建模板单元,如中所述系统单元

您可以在模板单元中使用许多变量。

我对......感兴趣"%j"

这是最后一个“-”和前缀名称末尾之间的字符串。

“前缀名称”也被定义:

对于实例化单元,这是指单元名称的第一个“@”字符之前的字符串。

我很清楚什么他们是,不清楚为什么它们存在。

我猜他们可能正在运行同一服务的多个版本。现实世界中如何使用它的示例是什么?

答案1

单元可以在.d/单元旁边的目录中具有其他设置。例如,foo.service可以通过 进行扩展foo.service.d/*.conf

模板单元将使用两个目录 - 实例和模板,因此[email protected]将从两个目录进行扩展[email protected]/*.conf [email protected]/*.conf。这样您就可以一次扩展该单元的所有实例。在这两种情况下,您的设备及其扩展配置可以使用 %i 来获取“ttyS1”位。

然而,某些单元不能使用模板,例如切片(代表 cgroup)被命名user-<UID>.slice,而不是user@<UID>.slice因为这些单元的名称代表一个文件系统路径(破折号映射到斜杠,因此“user-123.slice”是“user.slice”的子项)。

因为希望能够配置所有单独的用户切片(例如,给每个切片 x% 的内存),所以为使用类路径名称的单元添加了类似的机制:与上面的 getty 示例类似,该单元user-1000.slice可以扩展来自两者user-1000.slice.d/ user-.slice.d/,后一个通用目录中的文件能够使用 %j 来获取“1000”位。

最后一个示例在实践中由默认的 systemd 安装使用:

$ systemctl cat user-1000.slice
# /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
[Unit]
Description=User Slice of UID %j

答案2

其中一个示例可能是引用名称中的路径的系统单元。在此类单位中,/被替换为-(并且前导-被删除)。例如,安装单元/home/muru将被命名为home-muru.mount。同样,当我运行时,我可以看到其他基于路径的单元名称systemctl list-units

sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.5-1\x2d1.5:1.0-host0-target0:0:0-0:0:0:0>
sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.5-1\x2d1.5:1.0-host0-target0:0:0-0:0:0:0>
sys-devices-virtual-misc-rfkill.device          loaded active plugged   /sys/devices/virtual/misc
sys-devices-virtual-tty-ttyprintk.device        loaded active plugged   /sys/devices/virtual/tty/
sys-module-configfs.device                      loaded active plugged   /sys/module/configfs
sys-subsystem-net-devices-eth0.device           loaded active plugged   SMSC9512/9514 Fast Ethern
sys-subsystem-net-devices-wlan0.device          loaded active plugged   /sys/subsystem/net/device

在其中许多中,路径的最后一个组成部分(即由 给出的部分%j)可能在单元内有用。我不知道其中是否有任何一个实际上使用该名称,但它可能很方便,例如,用于获取 in 、 in或类似目录%j的安装单元生成器的用户名。/home/run/user

相关内容