为什么 `/usr/lib/systemd/system/` 中的 systemd 单元文件仍然适用于 Ubuntu?

day*_*oli 3 ubuntu debian systemd elasticsearch systemd-unit

我知道systemd将单元文件存储在不同版本的 Linux 的不同位置。在 RHEL 上,它位于/usr/lib/systemd/system/,而在基于 Debian 的机器上,它位于/lib/systemd/system/.

然而,我的Ubuntu 18.04的机器上,我刚刚安装Elasticsearch使用.deb的文件,它的systemd单元文件下安装的/usr/lib/systemd/system/,但systemd仍然能够把它捡起来。

$ uname -a
Linux nucleolus 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ sudo systemctl status elasticsearch.service
? elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: http://www.elastic.co
Run Code Online (Sandbox Code Playgroud)

注意路径是/usr/lib/systemd/system/elasticsearch.service.

那么为什么systemd单元文件 at/usr/lib/systemd/system/仍然适用于 Ubuntu?Debian/Ubuntu 系统的真实单元文件加载路径是什么?

Tho*_*mas 5

systemd查找单元文件的路径是从中读取的,UnitPath并且可以使用systemctl.

# systemctl --no-pager --property=UnitPath show | tr ' ' '\n'
UnitPath=/etc/systemd/system.control
/run/systemd/system.control
/run/systemd/transient
/etc/systemd/system
/run/systemd/system
/run/systemd/generator
/lib/systemd/system
/run/systemd/generator.late
Run Code Online (Sandbox Code Playgroud)

如您所见,这不包括/usr/lib/systemd/system,它是 Ubuntu 18.04 系统上的输出。该UnitPath期间实际存在这里显示运行时,只有目录中生成。

# mkdir -p /usr/lib/systemd/system
# systemctl daemon-reload
# systemctl --no-pager --property=UnitPath show | tr ' ' '\n' | grep "/usr/lib/systemd/system"
/usr/lib/systemd/system
Run Code Online (Sandbox Code Playgroud)

因此,创建目录足以添加/usr/lib/systemd/systemUnitPath,这可能是通过安装 Elasticsearch 来完成的。


UnitPath可以使用pkg-config变量systemdsystemunitdir和查询构建时考虑哪些目录systemdsystemunitpath

# pkg-config systemd --variable=systemdsystemunitdir 
/lib/systemd/system

# pkg-config systemd --variable=systemdsystemunitpath | tr ':' '\n'
/etc/systemd/system
/etc/systemd/system
/run/systemd/system
/usr/local/lib/systemd/system
/lib/systemd/system
/usr/lib/systemd/system
/lib/systemd/system
Run Code Online (Sandbox Code Playgroud)

src/core/systemd.pc.insystemdsystemunitpath如下。

systemdsystemunitpath=${systemdsystemconfdir}:/etc/systemd/system:/run/systemd/system:/usr/local/lib/systemd/system:${systemdsystemunitdir}:/usr/lib/systemd/system:/lib/systemd/system
Run Code Online (Sandbox Code Playgroud)