Rocky Linux 9 修改 DNS 及 cloud-init 冲突排查记录

Rocky Linux 9 修改 DNS 及 cloud-init 冲突排查记录

一、问题背景

在 Rocky Linux 9 上修改 DNS:

1
2
3
nmcli connection modify "System eth0" ipv4.dns "172.16.xx.xx"
nmcli connection modify "System eth0" ipv4.ignore-auto-dns yes
nmcli connection up "System eth0"

操作执行成功,但 /etc/resolv.conf 仍然出现多个 DNS:

1
2
3
4
5
6
; Created by cloud-init automatically, do not edit.

nameserver 8.8.8.8
nameserver 172.16.xx.xx
nameserver 1.1.1.1
search example.internal

明显被覆盖。


二、问题分析

关键提示:

1
Created by cloud-init automatically

说明当前系统 DNS 管理权不在 NetworkManager,而在:

  • cloud-init

也就是说:

  • nmcli 修改成功
  • 但 cloud-init 会重新写入 /etc/resolv.conf

三、排查过程

1️⃣ 删除 resolv.conf 测试

1
2
rm -f /etc/resolv.conf
systemctl restart NetworkManager

结果:

1
cat: /etc/resolv.conf: No such file or directory

说明:

  • resolv.conf 原本可能是软链接
  • 删除后 NetworkManager 没有自动重建
  • cloud-init 也未立即写回

2️⃣ 进一步判断控制来源

Rocky Linux 9 中 DNS 可能由以下组件控制:

  • NetworkManager
  • cloud-init
  • systemd-resolved

本次环境为云初始化环境,cloud-init 参与网络配置。


四、解决方案

✅ 推荐方式:禁用 cloud-init DNS 管理

编辑:

1
vi /etc/cloud/cloud.cfg

修改或添加:

1
manage_resolv_conf: false

同时禁用 network config:

1
vi /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

写入:

1
network: {config: disabled}

然后恢复 NetworkManager 控制

删除旧文件:

1
rm -f /etc/resolv.conf

重新建立软链接:

1
ln -s /run/NetworkManager/resolv.conf /etc/resolv.conf

重启 NetworkManager:

1
systemctl restart NetworkManager

五、最终 DNS 设置方式

1
2
3
nmcli connection modify "System eth0" ipv4.dns "172.16.xx.xx"
nmcli connection modify "System eth0" ipv4.ignore-auto-dns yes
nmcli connection up "System eth0"

验证:

1
2
cat /etc/resolv.conf
nmcli device show eth0 | grep DNS

六、关键知识点总结

1️⃣ nmcli 设置 DNS 是“覆盖”,不是追加

1
nmcli connection modify <连接名> ipv4.dns "x.x.x.x"

会直接替换原有 DNS。


2️⃣ Rocky Linux 9 DNS 控制层级

常见优先级来源:

  1. cloud-init(云服务器常见)
  2. NetworkManager
  3. systemd-resolved

查看控制来源:

1
2
cat /etc/resolv.conf
ls -l /etc/resolv.conf

3️⃣ 云服务器常见现象

云环境通常会:

  • 自动注入 8.8.8.8
  • 自动注入 1.1.1.1
  • 注入 search 域
  • 使用 cloud-init 管理网络

如果需要完全自定义 DNS,必须禁用 cloud-init 对 resolv.conf 的控制。


七、经验总结

本次问题本质是:

NetworkManager 和 cloud-init 同时管理 DNS,导致修改被覆盖。

排查 DNS 问题建议固定检查三步:

1
2
3
cat /etc/resolv.conf
ls -l /etc/resolv.conf
nmcli device show eth0 | grep DNS

基本可以定位 90% 的问题。


八、后续建议

如果是模板镜像或长期使用环境,建议:

  • 明确 DNS 控制权
  • 禁用不需要的网络管理组件
  • 保持 resolv.conf 由单一组件管理

避免多组件争夺控制权导致异常。


结语

Linux DNS 问题大多数不是“设置错”,而是“控制权冲突”。

理清:

  • 谁在写 resolv.conf
  • 谁在接管网络
  • 是否存在 cloud-init

问题基本都能快速解决。


Rocky Linux 9 修改 DNS 及 cloud-init 冲突排查记录
https://blog.yonagi.top/2026/03/01/f2616ee9737c/
作者
Yonagi
发布于
2026年3月1日
许可协议