普通网友 2026-02-27 21:30 采纳率: 98.9%
浏览 1
已采纳

`01-network-manager-all.yml` 导致 NetworkManager 覆盖 systemd-networkd 配置怎么办?

在基于 Netplan 的 Ubuntu/Debian 系统中,若存在 `/etc/netplan/01-network-manager-all.yml`(常见于桌面版或云镜像),其内容通常将所有接口交由 NetworkManager 管理(如 `renderer: NetworkManager`)。这会导致 systemd-networkd 被静默禁用——即使 `/etc/systemd/network/*.network` 文件存在且配置正确,systemd-networkd 也不会接管网络,进而引发静态 IP 失效、bond/team 接口不启动、DHCP 冲突或 cloud-init 网络初始化异常等问题。根本原因是 Netplan 仅允许一个 renderer 激活,且 `01-network-manager-all.yml` 的高优先级(文件名排序靠前)会覆盖用户自定义的 `renderer: systemd-networkd` 配置。典型现象包括:`systemctl status systemd-networkd` 显示 inactive,`networkctl list` 中接口显示 managed by NetworkManager,而 `ip a` 显示地址与预期不符。如何安全禁用该文件影响、保留 systemd-networkd 主控权,同时避免 NetworkManager 干扰,是运维和云环境部署中的高频痛点。
  • 写回答

1条回答 默认 最新

  • 薄荷白开水 2026-02-27 21:37
    关注
    ```html

    一、现象识别:从表象切入诊断网络接管权失衡

    典型症状包括:systemctl status systemd-networkd 显示 inactive (dead)networkctl list 中所有接口标注为 NetworkManagerip a 输出中缺失预设静态地址或 bond/team 设备未创建;journalctl -u systemd-networkd 无启动日志。这些非错误日志的“静默失效”正是 Netplan renderer 排他机制的直接体现——高优先级 YAML 文件锁定了唯一渲染器。

    二、机制剖析:Netplan 渲染器仲裁与文件名排序规则

    Netplan 按字典序加载 /etc/netplan/*.yml01-network-manager-all.yml 因前缀 01- 具有最高优先级。其核心约束在于:同一 Netplan 配置集仅允许一个 renderer 生效(见 Netplan 官方参考)。一旦任一文件声明 renderer: NetworkManager,其余文件中 renderer: systemd-networkd 将被忽略,且 systemd-networkd 服务会被自动屏蔽(通过 systemdWantedBy= 关系链中断)。

    三、风险评估:禁用 NetworkManager 的隐性代价矩阵

    场景NetworkManager 启用时风险systemd-networkd 主控时优势
    云镜像(如 AWS EC2、Azure Ubuntu)cloud-init 可能因 NM 与 systemd-networkd 竞争 DHCP 而超时失败cloud-init 可通过 network: {config: ...} 直接生成 systemd-networkd 配置,原子性更强
    物理服务器 Bond/Team 接口NM 对 LACP、802.3ad 支持有限,bonding 模式常降级为 balance-rrsystemd-networkd 原生支持 mode=802.3ad、lacp_rate、xmit_hash_policy 等内核级参数

    四、安全禁用路径:四阶渐进式操作方案

    1. 阶段一:隔离验证 —— 重命名 /etc/netplan/01-network-manager-all.yml01-network-manager-all.yml.disabled,执行 sudo netplan generate && sudo netplan apply,观察 systemd-networkd 是否激活
    2. 阶段二:配置迁移 —— 将原 NM 管理的静态 IP/DHCP 配置,按 /etc/systemd/network/10-eth0.network 格式重构(含 [Match], [Network], [Address] 等节)
    3. 阶段三:服务解耦 —— 执行 sudo systemctl stop NetworkManager && sudo systemctl disable NetworkManager,并屏蔽其 socket:sudo systemctl mask NetworkManager-wait-online.service
    4. 阶段四:持久加固 —— 在 /etc/default/grub 中添加 net.ifnames=0 biosdevname=0(可选),避免 udev 命名干扰;运行 sudo update-grub && sudo reboot

    五、验证闭环:状态检查与故障注入测试

    执行以下命令组合验证主控权移交完整性:

    systemctl is-active systemd-networkd          # 应返回 'active'
    networkctl status eth0                         # 应显示 'Configured by: systemd-networkd'
    ip link show bond0                             # 若配置 bond,应存在且 UP
    systemctl list-dependencies --reverse systemd-networkd | grep NetworkManager  # 应无输出
    

    六、云环境特例:cloud-init 配置适配指南

    在使用 cloud-init 的环境中,需修改 /etc/cloud/cloud.cfg.d/99-disable-network-manager.cfg,添加:

    network:
      config: disabled
    

    并在 /etc/cloud/cloud.cfg.d/90_network_config.cfg 中显式定义 network config(YAML 格式),确保 cloud-init 调用 netplan apply 时仅渲染 systemd-networkd 配置,规避 NM 插入。

    七、高级防护:systemd-networkd 与 NetworkManager 共存策略(双栈模式)

    若必须保留 NM(如桌面 GUI 需要 Wi-Fi 管理),可启用「分工共存」模式:通过 /etc/NetworkManager/conf.d/10-globally-managed-devices.conf 设置:

    [keyfile]
    unmanaged-devices=interface-name:eth0;interface-name:bond0;interface-name:enp0s3
    

    再配合 /etc/systemd/network/20-eth0.network 精确匹配设备,实现 NM 管理无线/蓝牙,systemd-networkd 管理有线/Bond/IPv6 RA。

    八、自动化运维:Ansible Playbook 片段示例

    - name: Disable NM-controlled Netplan and enable systemd-networkd
      hosts: servers
      become: true
      tasks:
        - file:
            path: /etc/netplan/01-network-manager-all.yml
            state: absent
          notify: Apply netplan and restart networkd
    
        - template:
            src: systemd-networkd-config.j2
            dest: /etc/systemd/network/10-{{ ansible_default_ipv4.interface }}.network
    
        - systemd:
            name: systemd-networkd
            state: restarted
            enabled: true
    
      handlers:
        - name: Apply netplan and restart networkd
          command: bash -c "netplan generate && netplan apply && systemctl restart systemd-networkd"
    

    九、故障回滚:原子化快照与配置版本控制

    建议在操作前执行:

    sudo cp -a /etc/netplan /etc/netplan.backup.$(date +%s)
    sudo cp -a /etc/systemd/network /etc/systemd/network.backup.$(date +%s)
    git -C /etc init && git -C /etc add netplan systemd/network && git -C /etc commit -m "Pre-systemd-networkd-migration"
    

    回滚命令:sudo cp -a /etc/netplan.backup.* /etc/netplan && sudo netplan apply,保障变更可逆性。

    十、原理图解:Netplan renderer 决策流(Mermaid)

    graph TD A[Netplan 加载 /etc/netplan/*.yml] --> B{按文件名排序} B --> C[解析 01-network-manager-all.yml] C --> D{是否含 renderer: NetworkManager?} D -->|是| E[全局锁定 renderer = NetworkManager] D -->|否| F[继续解析下一文件] E --> G[忽略所有 renderer: systemd-networkd] E --> H[systemd-networkd 服务被 masked] G --> I[NetworkManager 启动并接管所有接口] H --> I
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 2月28日
  • 创建了问题 2月27日