`01-network-manager-all.yml` 导致 NetworkManager 覆盖 systemd-networkd 配置怎么办?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
薄荷白开水 2026-02-27 21:37关注```html一、现象识别:从表象切入诊断网络接管权失衡
典型症状包括:
systemctl status systemd-networkd显示inactive (dead);networkctl list中所有接口标注为NetworkManager;ip a输出中缺失预设静态地址或 bond/team 设备未创建;journalctl -u systemd-networkd无启动日志。这些非错误日志的“静默失效”正是 Netplan renderer 排他机制的直接体现——高优先级 YAML 文件锁定了唯一渲染器。二、机制剖析:Netplan 渲染器仲裁与文件名排序规则
Netplan 按字典序加载
/etc/netplan/*.yml,01-network-manager-all.yml因前缀01-具有最高优先级。其核心约束在于:同一 Netplan 配置集仅允许一个renderer生效(见 Netplan 官方参考)。一旦任一文件声明renderer: NetworkManager,其余文件中renderer: systemd-networkd将被忽略,且systemd-networkd服务会被自动屏蔽(通过systemd的WantedBy=关系链中断)。三、风险评估:禁用 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-rr systemd-networkd 原生支持 mode=802.3ad、lacp_rate、xmit_hash_policy 等内核级参数 四、安全禁用路径:四阶渐进式操作方案
- 阶段一:隔离验证 —— 重命名
/etc/netplan/01-network-manager-all.yml为01-network-manager-all.yml.disabled,执行sudo netplan generate && sudo netplan apply,观察systemd-networkd是否激活 - 阶段二:配置迁移 —— 将原 NM 管理的静态 IP/DHCP 配置,按
/etc/systemd/network/10-eth0.network格式重构(含[Match],[Network],[Address]等节) - 阶段三:服务解耦 —— 执行
sudo systemctl stop NetworkManager && sudo systemctl disable NetworkManager,并屏蔽其 socket:sudo systemctl mask NetworkManager-wait-online.service - 阶段四:持久加固 —— 在
/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```本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 阶段一:隔离验证 —— 重命名