据我所知,systemd
不同版本的 Linux 的单元文件存储在不同的位置。在 RHEL 上,它位于/usr/lib/systemd/system/
,而在基于 Debian 的计算机上,它位于/lib/systemd/system/
。
然而,在我的 Ubuntu 18.04 机器上,我刚刚使用.deb
文件安装了 Elasticsearch,其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
注意路径是/usr/lib/systemd/system/elasticsearch.service
.
那么为什么systemd
单位文件 at/usr/lib/systemd/system/
仍然适用于 Ubuntu?是什么真实的Debian/Ubuntu 系统的单元文件加载路径?
答案1
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
如您所见,这不包括/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
因此,创建目录足以添加到/usr/lib/systemd/system
,UnitPath
这可能是通过安装 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
在src/core/systemd.pc.in
如下systemdsystemunitpath
。
systemdsystemunitpath=${systemdsystemconfdir}:/etc/systemd/system:/run/systemd/system:/usr/local/lib/systemd/system:${systemdsystemunitdir}:/usr/lib/systemd/system:/lib/systemd/system