我的systemd单位文件放在哪里?


59

读到有两个单位文件文件夹(不在用户模式下)。

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

与此答案相矛盾的是以下答案:https : //unix.stackexchange.com/a/47715/33386。有人可以填写缺少的信息,以便我了解发生了什么吗?(更新:答案已更新,我的理解不再与之冲突。

另外,脚本似乎组织在该/etc/systemd/system/文件夹中的子文件夹中:

getty.target.wants
multi-user.target.wants

在另一个位置,我读到还有其他位置。看来这些是针对特定于用户的服务的。

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

更新2015-08-31:

为了其他人,这是我最近问过的一个相关问题的链接: 我该把由systemd单元执行的脚本放在哪里?


4
/etc/systemd/system放置脚本的地方,pacman放入程序包脚本/usr/lib/systemd/system并发出systemctl enable foo.service创建从/usr到的符号链接/etc...
jasonwryan 2015年

1
请参阅man systemd.target:它说明了分组背后的原因。
jasonwryan

Answers:


57

放置系统单元文件的最佳位置: /etc/systemd/system 只需确保在[安装]部分下添加了一个目标,请阅读“如何知道?” 有关详细信息。 UPDATE/usr/local/lib/systemd/system是另一个选项,请阅读“灰色区域”以获取详细信息。”

放置用户单元文件的最佳位置: /etc/systemd/user或者,$HOME/.config/systemd/user 但这取决于权限和情况。

事实是,系统化的单位(或序言中称为“单位配置”)可以在任何地方使用-前提是您愿意进行手动符号链接,并且您知道了警告。systemctl daemon-reload出于某些良好的原因,使将设备放置在可以找到它的地方更加容易:

  • 使用标准位置意味着systemd生成器将找到它们,并使它们易于在启动时启用systemctl enable。这是因为您的单元将自动添加到单元相关性树(单元缓存)中。
  • 您无需考虑权限,因为只有正确的特权用户才能写入指定区域。

怎么知道

以及如何确切systemctl enable知道在哪里创建符号链接?您可以在该[install]部分下的单元本身中对其进行硬编码。通常有一条线像

[Install]
WantedBy = multi-user.target

对应于文件系统上的预定义位置。这样,就systemctl知道此单元依赖于一组称为的单元文件multi-user.target(“ target”是用于指定单元依赖项组的术语。您可以使用列出所有组systemctl list-units --type target)。要与目标一起加载的一组单位文件放在targetname.target.wants目录中。这只是一个充满符号链接(或真实内容)的目录。如果你的[Install]部分说,这是WantedBymulti-user.target的,但如果一个符号链接它不存在的multi-user.target.wants目录,那么它不会加载。当systemd单元生成器在引导时将单元文件添加到依赖关系树缓存中时(您可以使用手动触发生成器systemctl daemon-reload),它会自动知道将符号链接放置在哪里(在这种情况下位于目录中)/etc/systemd/system/multi-user.target.wants/ 你应该启用它。

手册重点:

可能会将其他单元从不在单元加载路径上的目录加载到systemd(“链接”)中。请参阅link命令以获取systemctl(1)。

在systemctl下,查找单位文件命令

单位文件加载路径

单位文件是从编译期间确定的一组路径中加载的,如下两张表所述。在较早列出的目录中找到的单位文件会覆盖列表中较低目录中具有相同名称的文件。

当变量$SYSTEMD_UNIT_PATH被设置,此变量的内容覆盖单元负载路径。如果$SYSTEMD_UNIT_PATH以空的组件(“:”)结尾,则通常的单位加载路径将附加到变量的内容中。

表1和表2 man systemd.unit都不错。

在系统模式(--system)中运行时加载路径。

  • /etc/systemd/system 本地配置
  • /run/systemd/system 运行时间单位
  • /usr/lib/systemd/system 已安装软件包的单位

在用户模式(--user)下运行时的加载路径

每个用户单位与所有/全局用户单位之间存在差异。

取决于用户

  • $XDG_CONFIG_HOME/systemd/user 用户配置(仅在$XDG_CONFIG_HOME设置时使用)
  • $HOME/.config/systemd/user 用户配置(仅在$XDG_CONFIG_HOME未设置时使用)
  • $XDG_RUNTIME_DIR/systemd/user 运行时间单位(仅在$XDG_RUNTIME_DIR设置时使用)

  • $XDG_DATA_HOME/systemd/user 主目录中已安装的软件包的单位(仅在$XDG_DATA_HOME设置时使用)

  • $HOME/.local/share/systemd/user 主目录中已安装的软件包的单位(仅在$XDG_DATA_HOME未设置时使用)

--global (全部用户)

适用于所有用户的单位-也意味着每个用户拥有的单位。因此,即使管理员在启动时启用了这些服务,每个用户也可以停止这些服务。

  • /etc/systemd/user 所有用户的本地配置(systemctl --global enable userunit.service
  • /usr/lib/systemd/user 已为所有用户在系统范围内安装的软件包单位
  • /run/systemd/user 运行时间单位

灰色地带

一方面,文件层次结构标准指定/etc用于不执行二进制文件的本地配置。另一方面,它指定/usr/local/“供本地安装软件时的系统管理员使用”。您还可以争辩(如果不仅仅是为了组织目的),所有系统单元文件都应该存在于之下/usr/local/lib/systemd/system,但这是针对属于“软件”而不是来自程序包管理器的单元文件的。全系统范围内的相应systemd用户单元可能位于下方 /usr/local/lib/systemd/user


有关将单位文件放入的建议/etc/systemd/system,这是针对自己创建的单位文件的一般建议吗?包管理器安装的任何东西都应始终放入/usr/lib/systemd/system例如。
slm

@slm是的,当问题涉及到我的 systemd单位文件时,它意在暗示着自己创建的文件。
乔纳森·科玛

我要区分:/etc/systemd/user对于(保证的)系统范围的用户服务和~/.config/systemd/user针对特定用户的定制服务。
Suuuehgi

16

/etc/systemd/system是你把你的脚本,吃豆子放在脚本/usr/lib/systemd/system

发行systemctl enable foo.service会创建从/usr到的符号链接/etc。有关man systemd.unit(5)更多详细信息,请参见“单元加载路径”部分。


@ macmadness86它丢失了,因为它与问题无关。
jasonwryan

1

我已经写了3个,一个写为ntpd,一个写为第二张静态以太网卡,一个写为运行p0f,是被动OS标识符。我把它们都放进去了/etc/systemd/system。看起来我也许可以systemd处理NTP,但我认为我不想过分依赖它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.