如何在不覆盖包提供原始文件的前提下覆盖systemd配置文件?set-property命令执行失败求助
如何在不覆盖包提供原始文件的前提下覆盖systemd配置文件?set-property命令执行失败求助
你遇到的systemctl set-property执行失败的问题,其实是对这个命令的用途理解错啦——这个命令是用来设置服务的资源控制参数(比如CPU、内存使用上限)的,根本不是用来修改像Resolve.LLMNR这种systemd服务自身的配置项的,所以报错完全正常~
那回到你的核心需求:不想直接修改包提供的原始配置文件(比如/etc/systemd/resolved.conf),怕后续包更新时覆盖你的修改或者打乱注释,同时要自定义配置。systemd官方早就提供了完美的解决方案:配置片段(drop-in文件)机制,这也是推荐的最佳实践。
针对systemd-resolved的配置,具体操作步骤如下:
- 先创建对应的drop-in配置目录(如果不存在的话):
sudo mkdir -p /etc/systemd/resolved.conf.d/ - 在这个目录下创建一个自定义的.conf文件(文件名建议加数字前缀,比如
90-custom-resolved.conf,数字越大越晚加载,优先级越高,能确保覆盖默认配置):sudo nano /etc/systemd/resolved.conf.d/90-custom-resolved.conf - 在文件里写入你需要修改的配置项,格式和原始配置文件一致:
[Resolve] LLMNR=no DNSStubListener=no - 保存退出后,重新加载systemd配置并重启服务,让修改生效:
sudo systemctl daemon-reload sudo systemctl restart systemd-resolved.service
这个方法的好处在于:包更新只会修改/etc/systemd/resolved.conf这个原始文件,根本不会碰/etc/systemd/resolved.conf.d/目录下的文件,你的自定义配置会一直保留;而且drop-in文件里的配置项会自动覆盖原始文件中的对应项,原始文件里的其他默认配置和注释也完全不受影响,完美解决你担心的“用户 annoyance”问题。
另外,这个方法是通用的,其他systemd服务或配置文件也可以照搬:
- 如果是修改服务单元的配置(比如某个.service文件),对应的drop-in目录是
/etc/systemd/<服务名>.service.d/ - 如果是修改其他systemd的配置文件(比如
logind.conf),对应的drop-in目录就是/etc/systemd/logind.conf.d/
只需要在对应目录下创建自己的.conf片段文件,写入要修改的配置项即可。
最后再提一句:如果以后需要设置服务的资源限制,比如限制systemd-resolved最多用50%的CPU,那才是systemctl set-property的正确用法,比如:
sudo systemctl set-property systemd-resolved.service CPUQuota=50%
备注:内容来源于stack exchange,提问作者gcb
相关产品推荐
相关产品推荐

