之前所有单元文件都在,/etc/systemd/system/
但现在有些出现在/usr/lib/systemd/system
(<- 在 CentOS 上,或/lib/systemd/system
<- 在 Debian/Ubuntu 上),这些文件夹之间有什么区别?
答案1
这个问题已经在man 7 file-hierarchy
systemd 中得到了回答(还有网络版):
/etc
System-specific configuration.
(…)
VENDOR-SUPPLIED OPERATING SYSTEM RESOURCES
/usr
Vendor-supplied operating system resources.
Usually read-only, but this is not required. Possibly
shared between multiple hosts. This directory should not
be modified by the administrator, except when installing
or removing vendor-supplied packages.
基本上,从分发存储库下载的包中附带的文件会进入/usr/lib/systemd/
.系统管理员(用户)所做的修改会进入/etc/systemd/system/
.
系统特定的单位优先于供应商提供的单位。使用 drop-ins,您可以仅覆盖单元文件的特定部分,而将其余部分留给供应商(drop-ins 从 systemd 一开始就可用,但仅在 v219 中正确记录;请参阅 参考资料man systemd.unit
)。
答案2
背景
如果您查看手册页,man systemd.unit
它有一个表格解释了这些差异。这是来自 CentOS 7.x 系统。
UNIT LOAD PATH Unit files are loaded from a set of paths determined during compilation, described in the two tables below. Unit files found in directories listed earlier override files with the same name in directories lower in the list. Table 1. Load path when running in system mode (--system). ┌────────────────────────┬─────────────────────────────┐ │Path │ Description │ ├────────────────────────┼─────────────────────────────┤ │/etc/systemd/system │ Local configuration │ ├────────────────────────┼─────────────────────────────┤ │/run/systemd/system │ Runtime units │ ├────────────────────────┼─────────────────────────────┤ │/usr/lib/systemd/system │ Units of installed packages │ └────────────────────────┴─────────────────────────────┘
当他们说“已安装的软件包”时,他们指的是通过 RPM 安装的任何东西。对于 Debian/Ubuntu 也可以假设同样的情况,其中 DEB 文件就是“已安装的软件包”。
笔记:Debian/Ubuntu 系统的上表略有不同。
Table 1. Load path when running in system mode (--system). ┌────────────────────┬─────────────────────────────┐ │Path │ Description │ ├────────────────────┼─────────────────────────────┤ │/etc/systemd/system │ Local configuration │ ├────────────────────┼─────────────────────────────┤ │/run/systemd/system │ Runtime units │ ├────────────────────┼─────────────────────────────┤ │/lib/systemd/system │ Units of installed packages │ └────────────────────┴─────────────────────────────┘
分析/usr/lib/systemd/system
/usr/lib/systemd/system
在 CentOS/Fedora/RHEL 系统上,您可以像这样辨别哪些软件包拥有哪些单元文件:
$ rpm -qf /usr/lib/systemd/system/* |sort -u | head
abrt-2.1.11-50.el7.centos.x86_64
abrt-addon-ccpp-2.1.11-50.el7.centos.x86_64
abrt-addon-kerneloops-2.1.11-50.el7.centos.x86_64
abrt-addon-pstoreoops-2.1.11-50.el7.centos.x86_64
abrt-addon-vmcore-2.1.11-50.el7.centos.x86_64
abrt-addon-xorg-2.1.11-50.el7.centos.x86_64
accountsservice-0.6.45-7.el7.x86_64
acpid-2.0.19-8.el7.x86_64
alsa-utils-1.1.3-2.el7.x86_64
anaconda-core-21.48.22.134-1.el7.centos.x86_64
分析/etc/systemd/system
如果我们对 做同样的事情/etc/systemd/system
,我们希望找不到 RPM 拥有的文件(事实上,在我的 CentOS 7.x 系统上就是这种情况。):
$ rpm -qf /etc/systemd/system/* /etc/systemd/system/*/* | grep -v 'not owned'
$
异常值
请记住,您可能会偶尔在 下找到杂散文件/usr/lib/systemd/system
,例如 Virtualbox (vboxadd*):
$ rpm -qf /usr/lib/systemd/system/* |sort -u | grep 'not owned'
file /usr/lib/systemd/system/initrd.target.wants is not owned by any package
file /usr/lib/systemd/system/shutdown.target.wants is not owned by any package
file /usr/lib/systemd/system/vboxadd.service is not owned by any package
file /usr/lib/systemd/system/vboxadd-service.service is not owned by any package
file /usr/lib/systemd/system/vboxadd-x11.service is not owned by any package
还有其他的。
结论
期望该/usr/lib/systemd/system
目录应该只包含由包管理器(YUM/DNF/RPM/APT/etc)放在那里的 systemd 单元文件。
文件/etc/systemd/system
由系统操作员手动放置在此处,用于非软件包形式的临时软件安装。这将包括 tarball 类型的软件安装或自制脚本。
答案3
运行时文件/run/systemd/system
源于在当前启动期间对进程(单元)进行修改的能力,而无需在重新启动后保留该更改/修改。
从系统控制.1:
--runtime
When used with enable, disable, edit, (and related commands),
make changes only temporarily, so that they are lost on the
next reboot. This will have the effect that changes are not
made in subdirectories of /etc/ but in /run/, with identical
immediate effects, however, since the latter is lost on
reboot, the changes are lost too.
Similarly, when used with set-property, make changes only
temporarily, so that they are lost on the next reboot.
您可以使用 Debian 系统dpkg-query -S
来查找带有或不带有软件包的单元文件。