首页/系统/Linux 运维命令速查/drop-in 目录组织与 .d 约定
systemd 与服务42 条

drop-in 目录组织与 .d 约定

所有单元支持 <unit>.d/ 目录扩展:.conf 文件按名称排序生效;理解排序与合并规则才能安全地做多来源定制。

Linux 运维命令速查系统更新于 2026-10-13

drop-in 目录与点 d 约定是什么

systemd 允许用「覆盖目录」扩展单元:任何单元都可以有同名的点 d 目录,里面的配置片段会按名称顺序加载并叠加到原单元上。这带来两个好处:不用复制整个单元文件就能改个别指令,包升级时原有改进也不会被覆盖。理解加载顺序是安全使用的前提——文件名前缀数字小的先加载,同一条指令后面加载的生效,所以约定俗成用 10、20 这类编号来编排覆盖层次。

基本信息

适用平台使用 systemd 的 GNU/Linux
目录位置/etc/systemd/system/<单元>.d/ 等对应优先级目录
文件要求只加载以 .conf 结尾的文件
加载顺序按文件名排序,后加载的同名指令生效
常用命名10-环境变量.conf、20-资源限制.conf
生效方式改完执行 daemon-reload 并重启服务

典型使用场景

  • 给包自带的单元追加环境变量或调整资源限制,不替换整个文件。
  • 按来源拆分覆盖内容:环境相关一份、监控接入一份,各自命名互不干扰。
  • 临时排障时插入调试配置,事后再删掉该片段。
  • 排查叠加配置后最终生效的值到底是什么。
  • 统一管理同一服务的多份定制,避免直接改包安装的文件。

操作流程

操作流程
mkdir -p /etc/systemd/system/myapp.service.d      # 创建覆盖目录
# 在目录内新建 10-env.conf,内容示例:
# [Service]
# Environment=LOG_LEVEL=debug
ls -1 /etc/systemd/system/myapp.service.d/         # 核对片段文件名与顺序
systemctl daemon-reload                            # 重新加载单元
systemctl restart myapp                            # 重启使配置生效
systemctl cat myapp                                # 打印生效内容与全部片段
systemctl show myapp -p Environment                # 查看最终生效的属性值

约定与语义读法

要素规则使用要点
目录命名单元名加点 d 后缀必须与单元名严格一致,拼错完全无效
文件后缀只加载 .conf其他后缀被忽略,容易误判为已生效
加载顺序按文件名排序数字前缀控制顺序,后加载的生效
覆盖语义同名指令后者优先多数列表类属性是追加语义
生效动作daemon-reload改完必须重新加载并重启服务
查看方式systemctl cat一步看到全部叠加内容,排障首选
只加载以 .conf 结尾的文件:把备份文件或编辑器临时文件放在同一个目录里,如果名字恰好以 .conf 结尾,它也会被加载,这是极难发现的幽灵问题来源。
想覆盖列表类属性(例如多个环境变量)时,多数指令默认是追加而不是替换,需要先清空原值再赋值;具体写法以本机手册为准,改完用查询命令确认最终值。
判断最终生效值要用查询命令或打印单元内容,不要凭片段文件名猜顺序,尤其当目录里存在多个来源的片段时。

易错点

  • 目录名或文件后缀写错导致配置完全不生效,服务行为没有任何变化却找不到报错;命名要与单元名严格一致并使用正确后缀。
  • 以为覆盖片段会完全替换原值,实际多为追加语义,结果出现重复或叠加的配置项;需要清空时必须在片段里显式处理。
  • 在覆盖目录里放了以 .conf 结尾的备份文件,被一并加载造成难以察觉的配置污染;备份文件不要放在该目录或改用其他后缀。
  • 改完片段忘记重新加载并重启服务,验证时看到的还是旧行为,误判为配置写法错误。

数据来源与参考

  • man 5 systemd.unit(drop-in 目录规则)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌