Ubuntu 20.04 NetworkManager接管netplan配置

发布时间:2026/9/18 1:27:22
Ubuntu 20.04 NetworkManager接管netplan配置 简介这份资料面向在 Ubuntu Server 20.04 上需要更灵活网络管理方式的 Linux 运维人员与服务器管理员聚焦于用 Network Manager 接管 netplan 默认网络管理这一常见需求。内容围绕安装 network-manager、将 managed 改为 true、调整 netplan 的 renderer 为 NetworkManager、应用配置并重启服务等环节展开并补充 nmcli 查看设备状态、列出与激活连接等命令用法帮助读者理解静态 IP、DHCP、无线及虚拟网络等场景下的配置与排错思路。资源包共 1 个 PDF 文件约 25KB篇幅紧凑适合作为动手操作时的速查文档或命令行参考。目前已有 5251 人学习对习惯动态网络配置或希望摆脱纯 netplan 写法的运维人员具有一定实用性。1. 从 netplan 到 NetworkManager为什么要在 Ubuntu Server 20.04 上换接管层Ubuntu Server 20.04 装完默认是 netplan 写 YAMLsystemd-networkd 做后端。改个静态 IP 要编辑/etc/netplan/00-installer-config.yaml再netplan apply远程一失手 SSH 就断。有些运维场景更想要 NetworkManager 的动态连接能力多网卡按优先级切换、桥接和 bond 的脚本化创建、DHCP 与静态地址并存、用nmcli一条命令改 DNS 和路由。服务器版没启用 NetworkManager但仓库里有network-manager包。让它接管网络不是把 netplan 删掉而是把 netplan 的 renderer 从 networkd 换成 NetworkManager由 NetworkManager 作为后端管理接口。这样做适合需要频繁调整网络、用 Ansible 批量下发连接配置、或者桌面与服务器统一用 nmcli 的团队。代价是多了服务依赖排查路径从 netplan 一层变成 netplan 与 NetworkManager 两层。2. NetworkManager 接管前的环境检查与 netplan renderer 切换2.1 确认网卡命名与当前网络后端先看接口名。Ubuntu Server 20.04 常见 ens33、ens160、enp0s3云主机可能 eth0。执行ip -br addr show # 简洁列出接口与地址 ip route show # 查看默认路由 cat /etc/netplan/*.yaml # 查看当前 netplan 配置 systemctl is-active systemd-networkd # 判断后端是否在运行 networkctl status ens33 # 查看 networkd 对指定接口的管理状态ip -br addr的-br是 brief 输出适合快速确认接口名和 UP/DOWN。ip route show看默认网关是否由当前后端下发。cat /etc/netplan/*.yaml重点看renderer字段缺省时 Ubuntu 20.04 会走 networkd。systemctl is-active systemd-networkd返回 active 说明后端还在工作。networkctl status ens33能看到 networkd 是否把接口标记为 managed。表格里把两种后端的关键差异列清楚选型时先对照当前环境。| 维度 | netplan systemd-networkd | netplan NetworkManager | | 配置入口 | /etc/netplan/*.yaml | nmcli / nmtuinetplan 仍可生成 | | 后端服务 | systemd-networkd | NetworkManager | | 动态切换 | 弱偏声明式 | 强连接可 up/down | | 命令工具 | netplan apply | nmcli con add/mod/up | | 持久化位置 | YAML 文件 | /etc/NetworkManager/system-connections/ | | 适合场景 | 固定网络、云镜像初始化 | 多网卡、桥接、批量脚本 |2.2 安装 network-manager 并修改 managedtrue安装包sudo apt update sudo apt install -y network-managerapt update刷新软件源索引-y自动确认。装完先别急着重启服务Ubuntu Server 默认NetworkManager.conf里[main] managedfalse表示 NetworkManager 不管理任何接口。编辑sudo cp /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf.bak sudo vim /etc/NetworkManager/NetworkManager.conf将[main]下的managedfalse改为managedtrue。如果文件里没有这一行手动补上。managed是全局开关true 后 NetworkManager 才会接管网卡。[ifupdown]段的managedfalse只影响/etc/network/interfaces里的接口和 netplan 无关不要混淆。注意改managedtrue之前先备份配置文件远程操作时保留一个已登录的 SSH 会话避免服务重启后新连接进不来。2.3 改写 netplan YAML 指向 NetworkManagernetplan 是 Ubuntu 20.04 的顶层网络描述renderer 决定谁去执行。编辑/etc/netplan/下的 YAML常见文件名00-installer-config.yaml或01-netcfg.yaml。先备份sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak sudo vim /etc/netplan/00-installer-config.yaml把内容改成network: version: 2 renderer: NetworkManagerversion: 2是 netplan 的配置版本20.04 固定写 2。renderer: NetworkManager告诉 netplan 把接口交给 NetworkManager 后端而不是 systemd-networkd。如果原来有ethernets段和静态地址可以暂时保留但 renderer 必须先切过来后续用 nmcli 创建连接会更灵活。多个 YAML 文件按文件名字典序合并确保没有另一个文件还写着renderer: networkd。| renderer 取值 | 后端服务 | 典型命令 | | networkd | systemd-networkd | netplan apply, networkctl | | NetworkManager | NetworkManager | netplan apply, nmcli |2.4 netplan apply 与 systemctl restart 的先后顺序应用顺序建议先 netplan再重启 NetworkManagersudo netplan generate # 只生成后端配置不立即应用 sudo netplan apply # 应用 netplan 并触发后端重载 sudo systemctl restart NetworkManager sudo systemctl enable NetworkManager # 确保开机自启netplan generate用于检查 YAML 能否被解析报错会直接指出行号。netplan apply会读取 renderer通知 NetworkManager 重新加载连接。systemctl restart NetworkManager确保服务以新的managedtrue状态运行。systemctl enable NetworkManager让服务开机启动否则重启后可能回到 networkd 管理。执行完用nmcli device status看接口是否从unmanaged变成disconnected或connected。提示远程 SSH 执行netplan apply可能瞬间断连建议用tmux或screen挂起会话或者写一个at定时任务在 5 分钟后回滚 YAML 备份。3. nmcli 连接管理从 device status 到静态 IP 的完整命令3.1 nmcli device status 与 connection show 的判读接管后第一组命令是查看设备与连接nmcli device status # 设备、类型、状态、当前连接 nmcli connection show # 所有连接配置 nmcli connection show --active # 仅活动连接 nmcli device show ens33 # 指定设备的详细地址、路由、DNSnmcli device status输出四列DEVICE、TYPE、STATE、CONNECTION。STATE 常见connected、disconnected、unmanaged。若仍是unmanaged回到第 2 章检查managedtrue和 renderer。nmcli connection show列出连接名、UUID、类型、设备。--active只看已激活的。nmcli device show ens33能确认 IP、网关、DNS 是否按预期生效。| 对象 | 动作 | 示例 | | device | status/show | nmcli device status | | connection | show/up/down | nmcli connection up eth0-static | | connection | add/mod/del | nmcli connection add type ethernet | | general | status | nmcli general status |3.2 用 nmcli con add 创建 DHCP 与静态地址连接先创建 DHCP 连接nmcli connection add type ethernet con-name eth0-dhcp ifname ens33 nmcli connection up eth0-dhcptype ethernet表示有线以太网。con-name是连接名后续 up/down/mod 都用它。ifname绑定物理接口。第二条命令激活连接DHCP 会自动获取地址。如果要静态地址用一条命令写全nmcli connection add type ethernet con-name eth0-static ifname ens33 \ ipv4.method manual \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 223.5.5.5 114.114.114.114 nmcli connection up eth0-staticipv4.method manual指定静态配置对应 DHCP 的auto。ipv4.addresses用 CIDR 写法多个地址用逗号分隔。ipv4.gateway是默认网关。ipv4.dns空格分隔多个 DNS加引号避免被 shell 拆分。创建后nmcli connection up激活nmcli connection show eth0-static能回看所有参数。3.3 nmcli con mod 修改 DNS、网关与路由连接建好后改参数不用删重建nmcli connection mod eth0-static ipv4.dns 119.29.29.29 8.8.8.8 nmcli connection mod eth0-static ipv4.ignore-auto-dns yes nmcli connection mod eth0-static ipv4.routes 10.0.0.0/8 192.168.1.254 nmcli connection mod eth0-static -ipv4.routes 10.0.0.0/8 192.168.1.254 nmcli connection down eth0-static nmcli connection up eth0-staticipv4.dns覆盖 DNS 列表。ipv4.ignore-auto-dns yes表示不接受 DHCP 下发的 DNS静态连接里常开。ipv4.routes追加一条路由-ipv4.routes删除同一条路由前缀和-是 nmcli 的增量语法。改完必须 down/up 或nmcli connection reload让配置生效。nmcli connection reload只重读磁盘配置不重启接口down再up会短暂断网。注意在 SSH 会话里对当前活动连接执行down会立刻断开建议用nmcli connection mod后nmcli connection up覆盖激活或者把回滚命令放在另一个会话里执行。3.4 连接配置文件持久化位置与 keyfile 权限nmcli 创建的连接默认保存在ls -l /etc/NetworkManager/system-connections/ sudo cat /etc/NetworkManager/system-connections/eth0-static.nmconnection文件是 keyfile 格式权限必须是 600属主 root。如果手动编辑过执行sudo chmod 600修正否则 NetworkManager 会拒绝加载。netplan 在 renderer 为 NetworkManager 时生成的连接可能放在/run/NetworkManager/system-connections/那是运行时目录重启后可能重新生成要持久化就用 nmcli 创建文件落在/etc/NetworkManager/system-connections/。| 路径 | 来源 | 是否持久 | | /etc/NetworkManager/system-connections/ | nmcli 创建、手动编辑 | 是 | | /run/NetworkManager/system-connections/ | netplan 运行时生成 | 否重启可能丢失 | | /etc/netplan/*.yaml | netplan 顶层描述 | 是但需 renderer 配合 |4. 排查 NetworkManager 接管失败的六类现象4.1 nmcli device 显示 unmanaged 的排查路径现象nmcli device status中目标网卡 STATE 为unmanaged。按顺序查grep -R managed /etc/NetworkManager/NetworkManager.conf /usr/lib/NetworkManager/conf.d/ 2/dev/null nmcli device set ens33 managed yes # 临时接管验证是否配置问题 journalctl -u NetworkManager -b --no-pager | tail -50先确认[main] managedtrue没有被其他 conf.d 文件覆盖。/usr/lib/NetworkManager/conf.d/下可能有默认配置优先级低于/etc/NetworkManager/conf.d/。nmcli device set ens33 managed yes是临时命令重启失效用来判断是全局配置还是单接口排除。journalctl看 NetworkManager 启动日志常见关键字unmanaged、not managed、keyfile。4.2 netplan apply 报错与 YAML 缩进netplan 对 YAML 缩进敏感必须用空格不能用 Tab。调试命令sudo netplan generate sudo netplan --debug apply sudo netplan trynetplan generate只做语法和后端配置生成报错会带文件名和行号。--debug apply输出详细执行过程能看出调用的是 networkd 还是 NetworkManager。netplan try应用后等待确认超时自动回滚适合远程改网络。常见错误Invalid YAML多为缩进或冒号后缺空格Renderer networkd is not available说明包或服务不完整A YAML file can not contain both表示多个文件冲突。| 报错片段 | 常见原因 | 处理 | | Invalid YAML | 缩进用了 Tab 或冒号后无空格 | 改成 2 空格缩进 | | unknown key | 字段拼写错误 | 对照 netplan 文档检查 | | renderer not available | 后端服务未安装 | 安装 network-manager 或 networkd | | permission denied | 文件属主或权限不对 | root 编辑权限 600 |4.3 NetworkManager 与 systemd-networkd 服务共存冲突Ubuntu Server 20.04 默认 systemd-networkd 在跑。切换到 NetworkManager 后两个服务同时管理接口会抢地址。检查systemctl status systemd-networkd --no-pager networkctl status ens33 nmcli device status如果networkctl status ens33仍显示State: routable且 NetworkManager 里接口是 unmanaged说明 networkd 还占着。常见做法是停用并禁止 systemd-networkd 开机启动sudo systemctl disable --now systemd-networkd sudo systemctl mask systemd-networkddisable --now立即停止并取消开机自启。mask把服务链接到 /dev/null防止被其他依赖拉起。确认 NetworkManager 已 enable再重启一次。提示云主机或托管环境可能由 cloud-init 驱动 netplan禁 systemd-networkd 前先看/etc/netplan/50-cloud-init.yaml是否还有 renderer: networkd 残留。4.4 DNS 解析异常与 resolv.conf 指向NetworkManager 接管后 DNS 可能不生效先看解析链路ls -l /etc/resolv.conf resolvectl status nmcli device show ens33 | grep -i dnsUbuntu 20.04 的/etc/resolv.conf通常软链到../run/systemd/resolve/stub-resolv.conf由 systemd-resolved 提供本地存根。NetworkManager 默认会把 DNS 推给 systemd-resolved。如果/etc/resolv.conf被改成普通文件或指向错误解析会失败。resolvectl status看每个接口的 DNS 服务器和当前解析器。nmcli device show ens33确认连接上配置的ipv4.dns是否下发。需要接管 resolv.conf 时可改NetworkManager.conf[main] dnsdefault rc-managerfilednsdefault让 NetworkManager 自己管理 DNSrc-managerfile直接写/etc/resolv.conf。改完重启 NetworkManager。表格里列出 DNS 后端选项的差别。| 配置 | 行为 | 适用 | | dnsdefault | NetworkManager 管理 DNS | 不用 systemd-resolved | | dnssystemd-resolved | 推给 systemd-resolved | 默认有本地存根 | | rc-managerfile | 直接写 resolv.conf | 需要传统解析文件 | | rc-managersymlink | 维护符号链接 | Ubuntu 默认 |5. 生产环境下的 nmcli 脚本化与连接回滚技巧5.1 批量创建连接与变量替换多台服务器下发同一套网络配置时把 nmcli 命令写成带变量的脚本#!/usr/bin/env bash set -euo pipefail IFACE${1:-ens33} CONN${2:-prod-static} IP${3:-192.168.1.100/24} GW${4:-192.168.1.1} DNS${5:-223.5.5.5 119.29.29.29} nmcli connection delete $CONN 2/dev/null || true nmcli connection add type ethernet con-name $CONN ifname $IFACE \ ipv4.method manual \ ipv4.addresses $IP \ ipv4.gateway $GW \ ipv4.dns $DNS \ ipv4.ignore-auto-dns yes nmcli connection up $CONN nmcli device status | grep $IFACEset -euo pipefail让脚本遇错退出${1:-默认值}提供默认参数。nmcli connection delete ... || true保证重复执行不报错。ipv4.ignore-auto-dns yes避免 DHCP 的 DNS 混入。最后用nmcli device status确认接口状态。这个脚本可以放进 Ansible 的 shell 模块或者用copy模块分发后执行。5.2 回滚到 netplan 原生 renderer 的检查点NetworkManager 接管后如果出现无法快速定位的连通性问题回滚路径要提前留好。保留原始 netplan 备份把 renderer 改回 networkd停用 NetworkManagersudo cp /etc/netplan/00-installer-config.yaml.bak /etc/netplan/00-installer-config.yaml sudo sed -i s/renderer: NetworkManager/renderer: networkd/ /etc/netplan/00-installer-config.yaml sudo netplan apply sudo systemctl disable --now NetworkManager sudo systemctl enable --now systemd-networkdsed只替换 renderer 行避免手改 YAML 缩进。netplan apply重新生成 networkd 配置。systemctl disable --now NetworkManager停用 NetworkManagerenable --now systemd-networkd恢复默认后端。回滚后执行networkctl status ens33和ip route show确认地址与默认路由由 networkd 接管。若之前用 nmcli 在/etc/NetworkManager/system-connections/建了连接NetworkManager 停用后这些文件不生效但会保留下次再启用 NetworkManager 时优先加载。确认nmcli device status中目标网卡状态为connected且CONNECTION列指向新建连接即完成接管后的连接回滚验证。本文还有配套的精品资源点击获取