我想让自定义服务单元依赖于远程文件系统 CVMFS 的挂载点。远程文件系统在 systemd 中有一个奇怪的设置,我并不完全理解。我使用中间服务单元做了一个简单的解决方法,所以它工作正常。但我想了解远程文件系统的单元是如何工作的,以便了解 systemd 中的这种行为。
这是远程文件系统的挂载点单元:
$ systemctl status cvmfs-sft.cern.ch.mount
* cvmfs-sft.cern.ch.mount
Loaded: loaded
Active: active (mounted) since Wed 2024-07-31 23:31:49 CEST; 1min 32s ago
Until: Wed 2024-07-31 23:31:49 CEST; 1min 32s ago
Where: /cvmfs/sft.cern.ch
What: cvmfs2
它没有列出单元文件。该单元必须以某种方式动态创建。因此,当我将 添加Requires=cvmfs-sft.cern.ch.mount
到我的单元时,它在 Linux 启动过程中失败,并显示以下内容:
localhost systemd[1]: Failed to start A one shot script ...
<hostname> systemd[1]: ....service: Failed to schedule restart job: Unit cvmfs-sft.cern.ch.mount not found.
但是,如果我在启动后启动我的设备,它会正常运行。即,Requires=cvmfs-sft.cern.ch.mount
当我以普通用户身份登录时,依赖关系正常工作,服务器已达到多用户目标,cvmfs 已安装并且该设备cvmfs-sft.cern.ch.mount
处于活动状态。
我期望的是 cvmfs 安装点有实际的单元文件。远程文件系统需要时间来安装这些安装点,然后我的单元将从那里继续。
根据CVMFS 文档,真正管理这个文件系统的是这个autofs.service
。该autofs
服务运行挂载点如下:
$ systemctl status autofs
* autofs.service - Automounts filesystems on demand
Loaded: loaded (/usr/lib/systemd/system/autofs.service; enabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/autofs.service.d
`-50-cvmfs.conf
...
CGroup: /system.slice/autofs.service
|-3405 /usr/bin/cvmfs2 ... sft.cern.ch /cvmfs/sft.cern.ch
...
我想问的是,在 systemd 中,什么可以创建这样的单元而无需单元文件?如果我有一个 init.d 脚本,systemd总是会将其转换为实际的单元文件,不是吗?在这个特定情况下,单元状态显示What: cvmfs2
。这是否意味着cvmfs2
使用以下功能systemd.mount
?
$ man systemd.mount
...
DESCRIPTION
...
The systemd-mount(1) command allows creating .mount and .automount units
dynamically and transiently from the command line.
我猜想你需要这种用于安装点的瞬时行为,例如当用户将 USB 驱动器插入计算机等时。但是其他单元类型是否可以瞬时创建,即在没有单元文件的情况下动态创建?
有没有一个好的方法可以找出是什么启动了这样一个临时单元? 就我而言,单元依赖关系没有告诉我任何信息:
$ sudo systemctl list-dependencies cvmfs-sft.cern.ch.mount
cvmfs-sft.cern.ch.mount
* |--.mount
* `-system.slice
$ sudo systemctl list-dependencies --reverse cvmfs-sft.cern.ch.mount
cvmfs-sft.cern.ch.mount
是否有其他systemctl
命令可以告诉您更多有关此类瞬态单元的来源的信息?
从技术上来说,Systemd 本身。
就像 systemd 为 libudev 看到的设备生成 .device 单元表示一样,它也会为其 /proc/self/mounts 中可见的每个实际挂载生成 .mount 单元表示,以及为每个活动交换设备生成 .swap 单元表示。
但这些并不是 systemd 所用的“临时单元”。临时单元源自systemd – 它通过 API 创建(例如通过调用
systemd-mount
或systemd-run
),通常作为临时文件存在于 /run/systemd 中 – 而您看到的这些单元并非如此。它们是源自 systemd 控制之外的某种状态的表示;在这种情况下,它们表示由程序直接与内核对话而不涉及 systemd 的挂载。所以,
该单位根本没有发射。它的存在是实际发射的结果,而不是原因。
是的,尽管在所有当前版本中,该翻译都不是由 systemd 本身完成的(即不是由服务管理器完成);而是由一个单独的“生成器”完成的,该生成器根据 init.d 脚本在 /run/systemd 中写出 .service 文件。
只有非常旧的 systemd 版本才会真正创建代表 init.d 脚本的虚拟内存 .service 单元,但是它在 10 年前就被删除了。(是的,如果您正在运行 systemd v209,那么它已经有十年历史了!)
不,这意味着该字符串
cvmfs2
被指定为挂载的“源”字段。它就是您在mount
或 的“SOURCE”列中看到的内容findmnt
。这意味着您可能不需要依赖单个挂载 - 依赖
autofs.service
整体就足够了。是的,它有点偏离了通常的 systemd 逻辑,但假设 autofs 完成了它应该做的工作,它应该可以工作。(我无法立即想到一种定义挂载依赖项的方法,该依赖项会等待该挂载出现。我本来希望它是 Requires+After - 事实上,
After=
在任何情况下你都希望拥有它 - 但它似乎只适用于设备而不适用于挂载。)