Skip to content

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

Ubuntu 20.04/22.04 服务器环境初始化示意图

排错实录:解决 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 addrls /sys/class/net/,确认实际网卡名(如 eth0ens33
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 文件也不会被覆盖,解决方案具有持久性。

最后更新2026/06/21 03:41
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal