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 在加载单元文件时,会按照一定的搜索路径和优先级顺序进行。大致顺序是这样的(虽然具体细节可能更复杂,但这抓住了核心概念):

  1. /etc/systemd/system/ (最高优先级)
  2. /run/systemd/system/ (临时文件系统中的,通常是运行时生成的或某些服务在运行时创建的)
  3. /usr/local/lib/systemd/system/ (本地安装的第三方服务,不通过包管理器安装)
  4. /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 等)

因此,当你想要修改一个现有的系统服务(例如,调整它的启动参数或依赖关系)时,最正确的做法是:

  1. 找到 /lib/systemd/system/ 目录下的原始单元文件。
  2. 将它复制到 /etc/systemd/system/ 目录下,并保持相同的文件名。
  3. 修改 /etc/systemd/system/ 目录下的这个副本。
  4. 运行 sudo systemctl daemon-reload 来让 systemd 重新加载配置。
posted on 2025-07-02 16:12  Leo-Yide  阅读(68)  评论(0)    收藏  举报