Rocky 10:要不要装 systemd-resolved,怎么交接
在 PVE 的 Rocky Linux 10.2 虚拟机(最小化安装)上实测,包来自 Rocky 10.2 DVD 的 BaseOS:
BaseOS/Packages/s/systemd-resolved-257-23.el10_2.1.rocky.0.1.x86_64.rpm安装、启用、切换、回滚四步都做了,截图:public/evidence/systemd-resolved/rocky-foreign-to-stub.png。
默认状态:没有它,也能解析
Section titled “默认状态:没有它,也能解析”$ rpm -q systemd-resolvedpackage systemd-resolved is not installed
$ ls -l /etc/resolv.conf-rw-r--r--. 1 root root 51 ... /etc/resolv.conf$ head -2 /etc/resolv.conf# Generated by NetworkManagernameserver 223.5.5.5
$ systemctl is-enabled systemd-resolveddisabled也就是说:最小化安装里 DNS 由 NetworkManager 直接管理,它把结果写成普通文件;53 端口上没有任何监听者。绝大多数场景这就够用了。
什么情况下值得装
Section titled “什么情况下值得装”- 需要按链路(per-link)区分 DNS,比如一块网卡走内网 DNS、另一块走公网;
- 需要本地缓存,减少对上游的重复查询;
- 需要统一用
resolvectl排查(resolvectl query、resolvectl statistics); - 有 systemd-networkd 或容器场景,希望 DNS 配置跟随网络配置走。
反过来说:单网卡、单一 DNS、只求能解析,装了是增加一层间接。
装上之后:它并不会自动接管
Section titled “装上之后:它并不会自动接管”# dnf -y --disablerepo=* install /path/to/systemd-resolved-*.rpm# systemctl enable --now systemd-resolved# resolvectl --no-pager status | grep "resolv.conf mode" resolv.conf mode: foreignforeign 的意思是:/etc/resolv.conf 不是它生成的,所以它只运行、不被使用——查询仍然走 NM 写的那个文件。这是最容易误解的一步。
交接:关掉 NM 的 DNS 管理 + 指向 stub 文件
Section titled “交接:关掉 NM 的 DNS 管理 + 指向 stub 文件”# cat /etc/NetworkManager/conf.d/90-dns-none.conf[main]dns=none
# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf# systemctl restart NetworkManager systemd-resolved两件事缺一不可:
dns=none让 NetworkManager 不再重写/etc/resolv.conf;- 把
/etc/resolv.conf指向 resolved 的 stub 文件,查询才会进它。
验证:
$ ls -l /etc/resolv.conflrwxrwxrwx. 1 root root 37 ... /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf$ resolvectl --no-pager status | grep -E "resolv.conf mode|Current DNS Server" resolv.conf mode: stub Current DNS Server: 223.5.5.5$ ss -lnup | grep ":53 "UNCONN 0 0 127.0.0.54:53 0.0.0.0:* users:(("systemd-resolve",...))UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",...))
回滚:三步回到原样
Section titled “回滚:三步回到原样”# rm -f /etc/NetworkManager/conf.d/90-dns-none.conf# rm -f /etc/resolv.conf# systemctl disable --now systemd-resolved# systemctl restart NetworkManagerrm 掉软链而不是「改成普通文件」很关键:NM 发现文件不存在会重新生成,发现是软链反而可能不动。回滚后 resolvectl status 应报 command not found 或服务未运行,/etc/resolv.conf 重新是普通文件。
- 只 enable 不交接:
mode: foreign,等于白装; - 只改软链不关 NM:NM 下次联网事件会把文件覆盖回去,看起来「时好时坏」;
- 回滚时
rm掉了dns=none却忘了删软链:resolved 停掉后/etc/resolv.conf指向不存在的文件,DNS 直接失效; resolvectl query报No route to host:这不是 DNS 故障,是没有默认路由。我们在离线实验网里就是这么撞上的——先ip route确认出网,再怀疑 DNS。
练习:安全地交接与回滚
Section titled “练习:安全地交接与回滚”resolvectl --no-pager status | grep "resolv.conf mode" # 先看是 foreign 还是 stubip route | head -3检查:
- 未装时
rpm -q systemd-resolved报未安装; - 装完只 enable 时
mode仍是foreign; - 交接后
mode变stub,且ss -lnup能看到 127.0.0.53:53; - 按「回滚三步」操作后恢复原状。
常见问题
不装 systemd-resolved 会有什么问题?
单网卡单 DNS 没有区别。需要 per-link DNS、缓存或统一排查工具时才有收益。
dns=none 之后 NM 还管别的吗?
管。它仍然管理地址、路由和连接状态,只是不再写 /etc/resolv.conf。
能不能只让某个网卡走 resolved?
可以,但需要 systemd-networkd 或手工 per-link 配置;NM 全量 dns=none 是二选一的切换。
- 日志排查:/journald-logging/
- 网络基础:bond 与 VLAN
- 仓库与包源:/repos/