简介:这份资料面向在 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 写 YAML,systemd-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 / nmtui,netplan 仍可生成 | | 后端服务 | systemd-networkd | NetworkManager | | 动态切换 | 弱,偏声明式 | 强,连接可 up/down | | 命令工具 | netplan apply | nmcli con add/mod/up | | 持久化位置 | YAML 文件 | /etc/NetworkManager/system-connections/ | | 适合场景 | 固定网络、云镜像初始化 | 多网卡、桥接、批量脚本 |
2.2 安装 network-manager 并修改 managed=true
安装包:
sudo apt update sudo apt install -y network-managerapt update刷新软件源索引,-y自动确认。装完先别急着重启服务,Ubuntu Server 默认NetworkManager.conf里[main] managed=false,表示 NetworkManager 不管理任何接口。编辑:
sudo cp /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf.bak sudo vim /etc/NetworkManager/NetworkManager.conf将[main]下的managed=false改为managed=true。如果文件里没有这一行,手动补上。managed是全局开关,true 后 NetworkManager 才会接管网卡。[ifupdown]段的managed=false只影响/etc/network/interfaces里的接口,和 netplan 无关,不要混淆。
注意:改
managed=true之前先备份配置文件,远程操作时保留一个已登录的 SSH 会话,避免服务重启后新连接进不来。
2.3 改写 netplan YAML 指向 NetworkManager
netplan 是 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,再重启 NetworkManager:
sudo netplan generate # 只生成后端配置,不立即应用 sudo netplan apply # 应用 netplan 并触发后端重载 sudo systemctl restart NetworkManager sudo systemctl enable NetworkManager # 确保开机自启netplan generate用于检查 YAML 能否被解析,报错会直接指出行号。netplan apply会读取 renderer,通知 NetworkManager 重新加载连接。systemctl restart NetworkManager确保服务以新的managed=true状态运行。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 章检查managed=true和 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] managed=true没有被其他 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] dns=default rc-manager=filedns=default让 NetworkManager 自己管理 DNS,rc-manager=file直接写/etc/resolv.conf。改完重启 NetworkManager。表格里列出 DNS 后端选项的差别。
| 配置 | 行为 | 适用 | | dns=default | NetworkManager 管理 DNS | 不用 systemd-resolved | | dns=systemd-resolved | 推给 systemd-resolved | 默认,有本地存根 | | rc-manager=file | 直接写 resolv.conf | 需要传统解析文件 | | rc-manager=symlink | 维护符号链接 | 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 "$IFACE"set -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,停用 NetworkManager:
sudo 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停用 NetworkManager,enable --now systemd-networkd恢复默认后端。回滚后执行networkctl status ens33和ip route show,确认地址与默认路由由 networkd 接管。若之前用 nmcli 在/etc/NetworkManager/system-connections/建了连接,NetworkManager 停用后这些文件不生效,但会保留;下次再启用 NetworkManager 时优先加载。确认nmcli device status中目标网卡状态为connected且CONNECTION列指向新建连接,即完成接管后的连接回滚验证。
本文还有配套的精品资源,点击获取