首页/系统/信创系统运维速查/drop-in 覆盖单元配置
服务与运维65 条

drop-in 覆盖单元配置

不改厂商原始单元文件,用 drop-in 片段(/etc/systemd/system/单元.d/*.conf)追加或覆盖参数,系统升级时不会被覆盖,是运维调整服务参数的标准做法。

信创系统运维速查系统更新于 2026-10-13

drop-in 覆盖是什么

直接修改软件包自带的单元文件有两个问题:系统升级时会被覆盖,改动丢失;出问题时很难判断哪些是原始定义、哪些是本地改动。drop-in 机制解决的就是这件事:在独立的覆盖目录下放片段文件,systemd 加载时把它合并进主单元,同名键以片段为准。这样既保留了软件包的原始定义,本地调整也集中可查、可单独回滚。它是运维调整服务参数的标准做法。

基本信息

覆盖目录与单元同名的目录,后缀为 .d
片段文件目录下的配置文件,可放多个
合并顺序按文件名排序,后加载的覆盖同名的键
命名建议用数字前缀管理覆盖优先级
编辑入口有交互式编辑命令可自动创建片段并重载
权限写入覆盖目录需 root

典型使用场景

  • 调整资源上限:为高连接数服务放开文件句柄限制而不动原文件
  • 追加环境变量:给服务补充环境变量或配置文件路径
  • 调整重启策略:按业务重要性改变异常退出后的行为
  • 临时排障:加一个只读或调试参数,用完删除片段即可回滚
  • 变更留痕:把本地调整集中存放,便于审计与交接
  • 多环境差异管理:同一软件在不同环境用不同片段区分

交互方式与手工方式

交互方式与手工方式
systemctl edit myapp.service          # 生成片段并自动重载,推荐
# 手工方式:建同名目录后写入片段
# mkdir -p /etc/systemd/system/myapp.service.d
# 片段内容示例:
# [Service]
# LimitNOFILE=65535
# Environment=APP_ENV=prod
systemctl daemon-reload               # 手工方式需自行重载
systemctl restart myapp               # 让新参数落到进程
systemctl cat myapp                   # 查看合并后的最终定义
systemctl show myapp -p LimitNOFILE   # 核对实际生效值

用法要点

项目规则常见错误
目录命名单元名加 .d 后缀目录名与单元名不一致则不生效
片段文件名建议数字前缀加描述排序靠后覆盖靠前,顺序影响结果
段落名必须与主单元一致写错段落名会报未知段落
重复键同名键以片段为准期望追加却被整体替换
生效步骤重载后重启服务只重载不重启,运行中的进程不变
回滚方式删除片段后重载重启忘记重载导致改动看似没撤销
片段用的是合并语义:同名键被整体替换而不是追加。对于列表类参数要特别注意这一点——想追加内容可能需要把完整列表写全,或者改用独立的配置目录加载。改完用查看合并结果的命令核对,比盯着两个文件猜要可靠得多。
生成完整副本的编辑方式会复制整份单元文件,之后系统升级带来的新定义不会同步进来,容易与软件包版本脱节。除排障临时使用外,长期调整应坚持用片段覆盖的方式。

易错点

  • 片段的目录名或段落名写错,配置看着放对了却完全不生效
  • 以为同名键是追加语义,实际被整体替换,列表类参数被覆盖后功能缺失
  • 手工写完片段忘记重载并重启,服务仍按旧定义运行,误判为配置无效
  • 用生成完整副本的方式长期维护,软件包升级后定义脱节,行为差异难以解释

数据来源与参考

  • man 5 systemd.unit(drop-in 机制)
  • man 1 systemctl(edit)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌