DataWizardess 2025-11-16 01:25 采纳率: 99.1%
浏览 20
已采纳

Ubuntu 24网卡配置时50-cloud-init不可修改

在Ubuntu 24.04系统中,使用`netplan`配置网络时,用户常遇到`50-cloud-init.yaml`文件无法修改的问题。该文件由`cloud-init`自动生成并锁定,任何手动更改均会在重启后被还原,导致自定义网卡配置失效。此机制旨在保障云环境网络一致性,但在本地或物理机部署时带来困扰。常见问题表现为:用户编辑该文件设置静态IP后,应用`netplan apply`无生效或配置回滚。根本原因在于`cloud-init`仍处于活跃状态并控制网络配置权限。解决需先判断是否为云实例,若非云环境可安全禁用`cloud-init`的网络管理功能,通过修改`/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg`文件禁用其网络模块,再创建独立的Netplan配置文件(如`01-netcfg.yaml`)进行自定义配置,从而绕过`50-cloud-init.yaml`不可变限制。
  • 写回答

1条回答 默认 最新

  • 火星没有北极熊 2025-11-16 09:11
    关注

    1. 问题背景与现象描述

    在Ubuntu 24.04系统中,使用netplan进行网络配置已成为标准做法。然而,许多用户在尝试修改/etc/netplan/50-cloud-init.yaml文件以设置静态IP地址时,发现其更改无法持久化。

    常见表现为:用户手动编辑该文件并执行sudo netplan apply后,网络可能短暂生效,但在系统重启后配置被自动还原,恢复为DHCP模式或原始云初始化状态。

    此行为的根本原因在于cloud-init服务的存在与激活状态。该服务在系统启动期间自动生成50-cloud-init.yaml文件,并锁定其控制权,防止外部干预,确保云环境中的网络一致性。

    2. 技术机制剖析:cloud-init 与 Netplan 的协作逻辑

    cloud-init是云实例首次启动时用于初始化系统的服务,包括主机名、SSH密钥、用户账户及网络配置等。它通过读取元数据服务(如AWS EC2、OpenStack)动态生成配置。

    在Ubuntu 24.04中,默认启用了cloud-init的网络管理模块,这意味着Netplan的配置来源被设定为cloud-init输出,而非用户自定义文件。

    Netplan本身是一个声明式网络配置抽象层,实际由systemd-networkdNetworkManager执行。但当cloud-init处于活跃状态时,它会在每次启动时重写50-cloud-init.yaml,覆盖任何手动修改。

    3. 判断是否为云实例:关键前置步骤

    在决定是否禁用cloud-init前,必须确认当前系统是否运行于云环境中。以下命令可用于检测:

    cloud-init status
    systemctl is-active cloud-init
    ls /sys/class/dmi/id/product_uuid | grep -i ec2\|gce\|azure
        

    此外,可通过检查是否存在云平台特征目录来辅助判断:

    云平台特征路径检测命令示例
    AWS/sys/hypervisor/uuidgrep -i ec2 /sys/hypervisor/uuid
    Google Cloud/sys/class/dmi/id/product_namecat /sys/class/dmi/id/product_name | grep Google
    Azure/sys/class/dmi/id/sys_vendorcat /sys/class/dmi/id/sys_vendor | grep Microsoft
    本地/物理机无上述路径或内容为空

    4. 解决方案流程图:从诊断到配置落地

    graph TD A[开始] --> B{是否为云实例?} B -- 是 --> C[保留cloud-init网络管理] B -- 否 --> D[禁用cloud-init网络模块] D --> E[创建99-disable-network-config.cfg] E --> F[创建独立Netplan配置文件] F --> G[应用netplan配置] G --> H[验证网络连通性] H --> I[完成]

    5. 实施步骤详解

    1. 确认cloud-init状态
      sudo cloud-init status 应显示status: runningdone
    2. 创建禁用配置文件
      新建文件/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg,内容如下:
    # 禁用cloud-init的网络配置功能
    network: {config: disabled}
        

    此配置告诉cloud-init不再生成或修改网络相关YAML文件。

    1. 重新加载cloud-init配置
      sudo cloud-init clean --logs 清除缓存,重启服务:
      sudo systemctl restart cloud-init
    2. 创建自定义Netplan配置
      新建/etc/netplan/01-netcfg.yaml,示例如下:
    network:
      version: 2
      ethernets:
        enp0s3:
          dhcp4: no
          addresses:
            - 192.168.1.100/24
          gateway4: 192.168.1.1
          nameservers:
            addresses: [8.8.8.8, 1.1.1.1]
        

    注意:文件名需按字典序优先于50-cloud-init.yaml,且不被cloud-init覆盖。

    6. 验证与调试策略

    执行以下命令验证配置有效性:

    • sudo netplan generate --debug:生成配置并输出调试信息
    • sudo netplan apply:应用新配置
    • ip aip route:检查IP和路由是否正确
    • systemd-resolve --status:验证DNS设置

    若出现错误,可查看日志:

    journalctl -u netplan-apply.service
    journalctl -u cloud-init
        
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月17日
  • 创建了问题 11月16日