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 结尾,它也会被加载,这是极难发现的幽灵问题来源。
想覆盖列表类属性(例如多个环境变量)时,多数指令默认是追加而不是替换,需要先清空原值再赋值;具体写法以本机手册为准,改完用查询命令确认最终值。
判断最终生效值要用查询命令或打印单元内容,不要凭片段文件名猜顺序,尤其当目录里存在多个来源的片段时。