纠正自己对 systemd 的一个错误认知

2020-04-28 23:20:16 +08:00
 atuocn

忽然惊喜的发现,自己原来写在 oschina 上的文章,找到入口了。自从它要求绑定手机后,因不想提供手机号,我再也没找到原来的文章。既然失而复得,转几个还有点价值的文章到这里,以免再次丢失。

原文写于 2014/07/05 12:17


以前一直以为,systemd 只会到 /etc/systemd/system 读取配置文件。要 enable 某个 service 就是 copy service 的配置文件到 /etc/systemd/system 目录下或者建一个 symlinks 。

昨天,想在启动时自动执行一个程序,自己写了个 service 文件放到 /etc/systemd/system,发现没起作用。

看了一下 systemd 的手册

http://www.freedesktop.org/software/systemd/man/

其实下面目录都是 systemd 的读取目录。读取的优先次序是从上到下。

Table 1.  Load path when running in system mode (--system).
/etc/systemd/system/*
/run/systemd/system/*
/usr/lib/systemd/system/*

Table 2.  Load path when running in user mode (--user).                
$XDG_CONFIG_HOME/systemd/user/*
$HOME/.config/systemd/user/*
/etc/systemd/user/*
/run/systemd/user/*
/usr/lib/systemd/user/*

既然上面的目录都是 systemd 的读取目录,service 的 enable, disable 是怎么回事呢?/usr/lib/systemd/system/下有所有安装的软件的配置,systemd 如何来确定需要运行那个 unit 呢?

systemd 的启动项是用 unit 文件来定义的。首先,每个 unit 都有 Requires,Wants 字段配置 unit 间的依赖关系。除 unit 文件定义外,每个 unit 都另外可以有一个配套的 .requires/.wants/ 目录,放到这两个目录里的 unit 会被隐式作为依赖项。

其次,unit 文件里可以定义一个 install 节,描述该单元 WantsBy,或 RequiresBy 哪个单元。当使用 systemctl enable service 时,就到 WantsBy 的单元的.wants 目录建一个 symlinks 过来。类似的,RequiresBy 也是这样。

因为 /etc/systemd/system 优先级最高,/etc/systemd/system 目录下建立一些 unit 的.requires 和.wants 目录,然后 systemctl 在 /etc/systemd/system 对应目录下建立 symlinks,就能保证不修改软件的安装文件的情况下,enable service,避免软件包升级时被覆盖。

最后,系统启动时 systemd 自动读取 default.target 这个 unit,default.target 定义了它的 Requires 和 Wants,然后一路按依赖启动各项服务。

3219 次点击
所在节点    Linux
1 条回复
CheekiBreeki
2020-04-29 08:45:47 +08:00
我的理解就是建立原來的 services 各種軟鏈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667115

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX