systemd启动任务DNS解析失败求助:配置相关target仍无效
解决systemd启动任务DNS解析失败的问题
我之前碰到过一模一样的问题!用systemd配置了一个启动任务,结果每次启动都因为DNS解析失败报错「Temporary Error in Name Resolution」。试过把network-online.target、nss-lookup.target、systemd-resolved.service全加到Wants、Requires、After标签里,可完全没用,任务还是没法稳定启动,DNS问题依旧。折腾了好久,终于找到了几个靠谱的解决思路:
先确认systemd-resolved本身正常运行
首先得确保负责DNS解析的systemd-resolved服务真的在正常工作:
- 先执行
systemctl status systemd-resolved.service看看服务状态是不是active (running)。如果没启动,先启动并设置开机自启:systemctl enable --now systemd-resolved.service - 再检查
/etc/resolv.conf的指向:正常情况下它应该是个软链接,指向/run/systemd/resolve/stub-resolv.conf或者/run/systemd/resolve/resolv.conf。如果不是的话,删掉原来的文件重新创建软链接:ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
优化systemd单元文件的依赖配置
之前的依赖配置太杂反而容易出问题,试试更精准的配置:
[Unit] Description=Does some stuff # 核心依赖只留systemd-resolved,确保DNS服务就绪 Requires=systemd-resolved.service # 让任务在resolved和网络都就绪后启动 After=systemd-resolved.service network-online.target # 可选:依赖network-online.target但不强求 Wants=network-online.target # 关键兜底:启动前强制等待目标域名能解析成功 ExecStartPre=/bin/bash -c 'until nslookup your-target-domain.com >/dev/null 2>&1; do sleep 1; done' [Service] Type=simple ExecStart=/path/to/your/script-or-binary # 解析失败时自动重启,增加稳定性 Restart=on-failure [Install] WantedBy=multi-user.target
这里的重点是:
- 不要把太多target塞进
Requires里,network-online.target有时候会提前标记为就绪,但实际DNS还没完全配置好,所以用Wants更稳妥 ExecStartPre的脚本是杀手锏——它会循环检测目标域名的解析状态,直到能解析成功才启动主任务,彻底避免启动时机过早的问题
额外排查点
如果上面的方法还是不行,可以试试这些:
- 手动验证域名解析:系统启动后执行
nslookup your-target-domain.com,看看是不是真的能解析到IP,排除域名本身的问题 - 检查内网DNS配置:如果是内网域名,编辑
/etc/systemd/resolved.conf,设置DNS和Domains字段(比如DNS=192.168.1.1),然后重启服务:systemctl restart systemd-resolved.service - 协调NetworkManager和systemd-resolved:如果你的系统用NetworkManager,确保它把DNS管理交给systemd-resolved——编辑
/etc/NetworkManager/NetworkManager.conf,添加或修改dns=systemd-resolved,然后重启NetworkManager:systemctl restart NetworkManager.service
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

