忽然惊喜的发现,自己原来写在 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,然后一路按依赖启动各项服务。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.