linux下systemd的有关知识
在 Linux 中,/etc/systemd/system/ 和 /lib/systemd/system/ 这两个目录都存放与 systemd 相关的单元文件(unit files),但它们在 目的、优先级和管理方式 上存在显著差异。
它们目录下存放的主要是 .service、.socket、.target、.mount、.timer 等描述 systemd 如何管理系统服务、进程、资源等的 文本配置文件,而不是二进制文件。
下面详细解释它们的区别:
1. /lib/systemd/system/
- 目的: 这个目录存放的是 系统自带的、由发行版安装的默认单元文件。当你安装一个软件包时,如果它需要启动一个服务,那么该服务的单元文件通常会被安装到这个目录下。
- 来源:
- 发行版打包工具: 例如
dpkg(Debian/Ubuntu) 或rpm(Red Hat/CentOS/Fedora) 会将软件包的单元文件安装到这里。 - 默认配置: 这些文件代表了系统默认的服务和单元的定义。
- 发行版打包工具: 例如
- 优先级: 优先级较低。systemd 在查找和加载单元文件时,会先查找
/etc/systemd/system/目录下的文件。如果存在同名文件,/etc/systemd/system/中的文件会覆盖/lib/systemd/system/中的文件。 - 管理方式: 不建议直接修改。直接修改这个目录下的文件通常不是最佳实践,因为当该软件包被更新时,你的修改可能会被新版本的单元文件覆盖。
2. /etc/systemd/system/
- 目的: 这个目录是 用户自定义或系统管理员修改系统行为的首选位置。它用于存放覆盖或扩展系统自带单元文件的文件。
- 来源:
- 系统管理员手动创建: 例如,你可能需要为一个自定义脚本创建一个新的服务。
- 系统管理员修改现有服务: 你可以复制
/lib/systemd/system/中的一个单元文件到/etc/systemd/system/中,然后对其进行修改,以覆盖原有的行为。 - 软件包的覆盖文件: 有些软件包安装时,会将一些覆盖文件放到这个目录下,以修改默认服务的行为。
- 优先级: 优先级较高。当 systemd 需要加载一个单元文件时,它会先在
/etc/systemd/system/目录下查找。如果找到了同名的文件,它会使用/etc/systemd/system/中的文件,而忽略/lib/systemd/system/中的同名文件。 - 管理方式: 推荐的修改位置。由于
/etc/目录是用户和系统管理员的配置目录,在这里进行的修改不会在软件包更新时丢失(除非软件包的安装脚本有意替换此目录下的文件,但这通常不常见)。
目录结构和优先级工作原理:
systemd 在加载单元文件时,会按照一定的搜索路径和优先级顺序进行。大致顺序是这样的(虽然具体细节可能更复杂,但这抓住了核心概念):
/etc/systemd/system/(最高优先级)/run/systemd/system/(临时文件系统中的,通常是运行时生成的或某些服务在运行时创建的)/usr/local/lib/systemd/system/(本地安装的第三方服务,不通过包管理器安装)/lib/systemd/system/(系统自带的、由发行版安装的默认单元文件)
当 systemd 需要加载名为 foo.service 的单元时,它会按顺序查找:
- 如果
/etc/systemd/system/foo.service存在,就使用它。 - 否则,如果
/run/systemd/system/foo.service存在,就使用它。 - 否则,如果
/usr/local/lib/systemd/system/foo.service存在,就使用它。 - 否则,如果
/lib/systemd/system/foo.service存在,就使用它。 - 如果以上都不存在,则找不到该单元。
总结:
| 特性 | /lib/systemd/system/ |
/etc/systemd/system/ |
|---|---|---|
| 目的 | 系统自带的、发行版安装的默认单元文件 | 用户自定义或系统管理员修改系统行为的首选位置 |
| 来源 | 发行版打包工具安装的软件包 | 手动创建、复制和修改的单元文件 |
| 优先级 | 低 | 高 |
| 管理 | 不建议直接修改,更新可能覆盖 | 推荐修改或创建的位置,修改不会因软件包更新而丢失 |
| 内容 | 文本格式的单元配置文件 (如 .service, .target 等) |
文本格式的单元配置文件 (如 .service, .target 等) |
因此,当你想要修改一个现有的系统服务(例如,调整它的启动参数或依赖关系)时,最正确的做法是:
- 找到
/lib/systemd/system/目录下的原始单元文件。 - 将它复制到
/etc/systemd/system/目录下,并保持相同的文件名。 - 修改
/etc/systemd/system/目录下的这个副本。 - 运行
sudo systemctl daemon-reload来让 systemd 重新加载配置。
浙公网安备 33010602011771号