跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    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。

    $ rpm -q systemd-resolved
    package 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 NetworkManager
    nameserver 223.5.5.5
    $ systemctl is-enabled systemd-resolved
    disabled

    也就是说:最小化安装里 DNS 由 NetworkManager 直接管理,它把结果写成普通文件;53 端口上没有任何监听者。绝大多数场景这就够用了。

    • 需要按链路(per-link)区分 DNS,比如一块网卡走内网 DNS、另一块走公网;
    • 需要本地缓存,减少对上游的重复查询;
    • 需要统一用 resolvectl 排查(resolvectl query、resolvectl statistics);
    • 有 systemd-networkd 或容器场景,希望 DNS 配置跟随网络配置走。

    反过来说:单网卡、单一 DNS、只求能解析,装了是增加一层间接。

    # 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: foreign

    foreign 的意思是:/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

    两件事缺一不可:

    1. dns=none 让 NetworkManager 不再重写 /etc/resolv.conf;
    2. 把 /etc/resolv.conf 指向 resolved 的 stub 文件,查询才会进它。

    验证:

    $ ls -l /etc/resolv.conf
    lrwxrwxrwx. 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",...))

    Rocky Linux 10.2:foreign → stub 的前后对比

    # rm -f /etc/NetworkManager/conf.d/90-dns-none.conf
    # rm -f /etc/resolv.conf
    # systemctl disable --now systemd-resolved
    # systemctl restart NetworkManager

    rm 掉软链而不是「改成普通文件」很关键: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。
    Terminal window
    resolvectl --no-pager status | grep "resolv.conf mode" # 先看是 foreign 还是 stub
    ip route | head -3

    检查:

    1. 未装时 rpm -q systemd-resolved 报未安装;
    2. 装完只 enable 时 mode 仍是 foreign;
    3. 交接后 mode 变 stub,且 ss -lnup 能看到 127.0.0.53:53;
    4. 按「回滚三步」操作后恢复原状。

    常见问题

    不装 systemd-resolved 会有什么问题?

    单网卡单 DNS 没有区别。需要 per-link DNS、缓存或统一排查工具时才有收益。

    dns=none 之后 NM 还管别的吗?

    管。它仍然管理地址、路由和连接状态,只是不再写 /etc/resolv.conf。

    能不能只让某个网卡走 resolved?

    可以,但需要 systemd-networkd 或手工 per-link 配置;NM 全量 dns=none 是二选一的切换。