Appearance
Ubuntu 22.04 重启后静态 IP 配置被重置?一招彻底解决

排错实录:解决
cloud-init抢占 Netplan 网络配置的问题
问题现象
在 Ubuntu 22.04 系统中,按标准流程修改 /etc/netplan/ 下的配置文件并执行 sudo netplan apply 后,静态 IP 地址确实生效了。但一旦执行 sudo reboot 重启系统,之前配置的静态 IP 就会丢失,网络配置恢复为 DHCP 自动获取。
根本原因
问题出在 cloud-init 这个云环境初始化服务上。Ubuntu 22.04 默认集成了 cloud-init,它的网络管理模块会在每次系统启动时,根据自身配置文件重新生成网络配置,并覆盖掉 Netplan 的设置。
Netplan 官方配置文件中其实已经注明了这一行为,推荐的解决方案就是禁用 cloud-init 的网络管理功能。
解决方案
第一步:创建禁用配置文件
执行以下命令,新建一个 cloud-init 的配置片段:
bash
sudo vim /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg第二步:写入配置内容
在文件中粘贴以下内容:
yaml
network: {config: disabled}保存并退出(:wq)。
原理说明:
cloud-init按数字顺序加载/etc/cloud/cloud.cfg.d/目录下的配置文件,99-前缀确保该配置优先生效,从而禁用其网络管理模块。
第三步:清理缓存并重启
bash
sudo cloud-init clean
sudo reboot第四步:重新应用 Netplan 配置(如需要)
重启后,cloud-init 不再干预网络配置。此时按标准方式配置 Netplan 即可:
bash
sudo vim /etc/netplan/01-netcfg.yaml # 编辑配置文件
sudo netplan apply # 应用配置配置 Netplan 的注意事项
重新配置静态 IP 时,请注意以下几点:
| 要点 | 说明 |
|---|---|
| 确认网卡名称 | 执行 ip addr 或 ls /sys/class/net/,确认实际网卡名(如 eth0、ens33) |
| YAML 缩进 | Netplan 使用 YAML 格式,对缩进极其敏感,请使用空格而非 Tab |
| 避免文件冲突 | /etc/netplan/ 下只能有一个文件定义同一网卡,建议保留一个配置文件 |
| DNS 配置 | 静态 IP 建议同时指定 nameservers,避免 DNS 解析问题 |
Netplan 配置示例
yaml
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114备选方案(不推荐)
除了上述方法,也可以在 /etc/cloud/cloud.cfg.d/90-installer-network.cfg 中直接修改 IP 地址。但这样做存在两个问题:
- 治标不治本:
cloud-init的配置覆盖机制依然存在,未来仍可能引发问题 - 可维护性差:网络配置分散在两处,容易造成混淆,不利于运维管理
因此,强烈推荐直接禁用 cloud-init 的网络管理功能,统一使用 Netplan 管理网络。
进阶提示
后续执行 sudo apt upgrade 升级系统包时,即使 cloud-init 有更新,我们创建的 99-disable-network-config.cfg 文件也不会被覆盖,解决方案具有持久性。
