在 systemd 中,什么启动了生成器生成的单元?

Gra*_*ent 14 systemd

在我的机器(Arch linux)上,systemd-generator 生成了一些单元文件/run/systemd/generator/,它们似乎在启动时以某种方式启动。什么是启动它们?

例如,boot.mount是由 systemd 生成的。systemctl list-dependencies --all显示它链接到local-fs.target(未生成)。它们是如何联系在一起的?这两个单元中似乎没有任何东西可以触发boot.mount. 嗯,在 中boot.mount,有Before=local-fs.target,但这不会启动服务,是吗?

Jde*_*eBP 12

systemd 不会自动激活生成的单元文件。就 systemd 而言,它们没有什么特别之处。每个单独的生成器都必须显式地创建符号链接,将生成的单元连接到目标,以便激活目标以正常方式通过依赖项激活生成的单元。

这利用了并非所有单元之间的连接都在单元文件中表达的事实。Wants 和 Requires 依赖可以用符号链接农场*.wants/*.requires/子目录来表达。那些符号链接农场包含/run/systemd/其他内容的子目录。

换句话说:生成器不是写出一个单元,WantedBy=local-fs.target然后必须显式调用sytemctl enable以建立符号链接(这就是启用所做的),生成器使过程短路并自行建立符号链接。并且它使它在一个短暂的地方,systemctl enable通常不会,从而防止符号链接在下一次关机后继续存在并混淆下一次启动。

具体来说,您会在系统上发现/run/systemd/generator/boot.mount/run/systemd/generator/local-fs.target.wants/boot.mount. systemd-fstab-generator创建这个符号链接,它使boot.mount被通缉local-fs.target。在系统开始激活之前,生成器在引导程序中的早期运行local-fs.target,这意味着当它确实开始激活local-fs.target生成的依赖项时会被跟随。

进一步阅读