systemd-delta用于静态比对systemd配置覆盖情况,按/etc > /run > /usr/lib优先级识别被替代的默认配置,支持按类型、路径筛选并显示diff差异。

用 systemd-delta 查看被覆盖的默认资源配置,核心是识别哪些配置文件因目录优先级规则被本地修改所替代。它不运行服务、不修改文件,只做静态比对,适合快速定位配置漂移。
理解覆盖逻辑:三个目录决定谁“说话算数”
systemd 按目录优先级加载配置:
- /etc/systemd/system/:最高优先级,管理员手动添加或覆盖的单元文件全放这里,会直接屏蔽低层同名配置
- /run/systemd/system/:中间层,运行时生成(如容器或临时覆盖),重启后丢失
- /usr/lib/systemd/system/:最低优先级,软件包安装的原始默认单元文件,仅当上两层无同名文件时才生效
例如,若 /usr/lib/systemd/system/nginx.service 存在,但你又在 /etc/systemd/system/nginx.service 放了一个同名文件,后者就完全覆盖前者——systemd-delta 就是专门揪出这类情况的工具。
常用命令组合:从全局到聚焦
不加参数运行最直观,能一次看到所有被改动的位置:
-
systemd-delta:列出全部被覆盖、屏蔽、重定向或扩展的单元和片段 -
systemd-delta --type=overridden:只显示内容不同的覆盖(即你改过配置的那些) -
systemd-delta /etc:只检查/etc下有哪些配置覆盖了低层默认项 -
systemd-delta systemd/system:专注系统服务单元(.service、.target等)的覆盖情况 -
systemd-delta --type=extended /etc/systemd/system:查看/etc中哪些.d/目录(如nginx.service.d/)正在向默认单元注入额外配置片段
看懂输出:关键字段含义
执行后每行格式类似:overridden /etc/systemd/system/chrony.service → /usr/lib/systemd/system/chrony.service
- overridden 表示两个文件内容不同,你改过了
-
masked 表示该单元被软链接到
/dev/null,彻底禁用(常见于安全加固) - redirected 表示它是符号链接,指向另一个路径
-
extended 表示有
.d/目录里的.conf文件在补充原单元行为 - 箭头右侧是被覆盖的原始位置,左侧是你当前生效的配置来源
加 --diff=yes(默认开启)还会直接显示两文件 diff,方便确认改了哪几行。
配合 systemctl 验证实际影响
发现覆盖后,别急着删改,先确认它是否真在起作用:
-
systemctl cat nginx.service:显示当前实际加载的完整单元内容(含所有.d/片段) -
systemctl show nginx.service --property=FragmentPath:查当前使用的是哪个路径下的主文件 -
systemctl daemon-reload:修改配置后必须执行,让 systemd 重新读取文件
这样就能把静态差异和运行时行为对应起来,避免误判。











