Linux 网络管理之争:systemd-networkd vs NetworkManager
引言
在 Linux 系统中,网络配置管理是一个基础且重要的议题。Ubuntu 从 17.10 版本开始引入 Netplan 作为统一的网络配置工具,而 Netplan 背后支持两种渲染器(Renderer):systemd-networkd 和 NetworkManager。理解两者的区别,对于系统管理员和运维人员来说至关重要。
本文将深入剖析这两种网络管理工具的设计理念、适用场景、优缺点,并通过实际案例帮助你做出正确的选择。
一、Netplan:统一的配置入口
1.1 什么是 Netplan?
Netplan 是 Ubuntu 推出的网络配置抽象层工具,它使用 YAML 格式的配置文件(位于 /etc/netplan/ 目录),将这些高级配置转换为底层网络管理工具的具体配置文件。
核心思想:用户只需要写一份 YAML 配置,Netplan 负责将其翻译成 systemd-networkd 或 NetworkManager 能理解的格式。

1.2 Netplan 配置文件示例
network:
version: 2
renderer: networkd # 或 NetworkManager
ethernets:
eth0:
dhcp4: true
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
二、systemd-networkd:轻量级的系统网络管理
2.1 概述
systemd-networkd 是 systemd 生态的一部分,是一个轻量级的网络管理守护进程。它设计简洁、资源占用少,非常适合服务器环境。
2.2 核心特点
| 特点 | 说明 |
|---|---|
| 轻量级 | 内存占用小,无额外依赖 |
| 配置简单 | 基于 .network 配置文件 |
| 稳定可靠 | 专注于基础网络功能 |
| 无图形界面 | 纯命令行管理 |
| 启动早 | 系统启动早期即可加载 |
2.3 配置示例
Netplan 配置 systemd-networkd 时,会生成类似 /run/systemd/network/10-netplan-eth0.network 的文件:
[Match]
Name=eth0
[Network]
DHCP=ipv4
[Address]
Address=192.168.1.100/24
[Route]
Destination=0.0.0.0/0
Gateway=192.168.1.1
2.4 常用命令
# 查看网络状态
networkctl status
networkctl status eth0
# 查看链路状态
networkctl list
# 重启网络
sudo systemctl restart systemd-networkd
2.5 适用场景
- ✅ 服务器(配置固定,不需要频繁改动)
- ✅ 容器环境(Docker、LXC 等)
- ✅ 嵌入式系统(资源受限)
- ✅ 最小化安装(不需要图形界面)
- ✅ 需要最大稳定性的生产环境
三、NetworkManager:全功能的网络管理
3.1 概述
NetworkManager 是一个功能丰富的网络管理守护进程,最初为桌面环境设计,现已广泛应用于服务器领域。它提供了强大的网络管理能力,支持各种网络类型。
3.2 核心特点
| 特点 | 说明 |
|---|---|
| 功能丰富 | 支持 WiFi、VPN、蓝牙、移动宽带等 |
| 自动切换 | 自动检测并切换网络连接 |
| GUI 支持 | 提供图形界面和 Web 管理 |
| 命令行工具 | nmcli 功能强大 |
| 多种管理方式 | GUI、CLI、API、Web |
3.3 配置方式
NetworkManager 支持多种配置方式:
方式一:命令行(nmcli)
# 创建连接
nmcli con add type ethernet ifname eth0 con-name eth0
# 设置静态IP
nmcli con mod eth0 ipv4.addresses 192.168.1.100/24
nmcli con mod eth0 ipv4.gateway 192.168.1.1
nmcli con mod eth0 ipv4.dns "8.8.8.8 1.1.1.1"
nmcli con mod eth0 ipv4.method manual
# 激活连接
nmcli con up eth0
方式二:文本界面(nmtui)
nmtui
方式三:Web 界面(Cockpit)
通过 Cockpit 的 Web 界面管理网络。
方式四:图形界面(GNOME Settings)
3.4 常用命令
# 查看设备状态
nmcli dev status
# 查看连接
nmcli con show
nmcli con show eth0 --active
# 查看详细信息
nmcli dev show eth0
# 重启网络
sudo systemctl restart NetworkManager
3.5 适用场景
- ✅ 桌面环境(需要管理 WiFi、VPN 等)
- ✅ 笔记本(需要切换不同网络)
- ✅ 使用 Cockpit 管理的服务器
- ✅ 需要 Web 界面管理网络的场景
- ✅ 需要 VPN、WiFi 等功能的环境
- ✅ 动态网络环境(频繁变动)
四、详细对比表
| 对比维度 | systemd-networkd | NetworkManager |
|---|---|---|
| 设计目标 | 轻量级基础网络 | 全功能网络管理 |
| 资源占用 | ⭐ 很低 | ⭐⭐ 中等 |
| 配置难度 | ⭐⭐ 中等 | ⭐ 简单 |
| 配置文件 | /run/systemd/network/*.network | /etc/NetworkManager/system-connections/*.nmconnection |
| 命令行工具 | networkctl | nmcli |
| 图形界面 | ❌ 不支持 | ✅ 支持 |
| Web 管理 | ❌ 不支持 | ✅ 支持(Cockpit) |
| WiFi 支持 | ⚠️ 有限 | ✅ 完善 |
| VPN 支持 | ❌ 不支持 | ✅ 支持 |
| 自动切换 | ❌ 不支持 | ✅ 支持 |
| 动态检测 | ⚠️ 有限 | ✅ 完善 |
| Cockpit 管理 | ⚠️ 只读(未管理) | ✅ 可读写(已管理) |
| 启动速度 | ⭐⭐⭐ 最快 | ⭐⭐ 中等 |
| 适用场景 | 服务器、容器 | 桌面、动态环境 |
五、通过 Netplan 切换渲染器
5.1 查看当前渲染器
# 查看完整状态
sudo netplan status --all
# 输出示例(systemd-networkd)
# eth0: UP (networkd: eth0)
# 输出示例(NetworkManager)
# eth0: UP (NetworkManager: eth0)
5.2 切换到 systemd-networkd
network:
version: 2
# 不指定 renderer 或指定为 networkd
renderer: networkd
ethernets:
eth0:
dhcp4: true
5.3 切换到 NetworkManager
network:
version: 2
renderer: NetworkManager # 关键区别
ethernets:
eth0:
dhcp4: true
5.4 切换后的影响
# 切换前 - systemd-networkd
sudo netplan apply
# 配置写入 /run/systemd/network/
# systemd-networkd 负责管理
# 切换后 - NetworkManager
sudo netplan apply
# 配置写入 NetworkManager 连接
# NetworkManager 负责管理
六、实际场景选择指南
6.1 选择 systemd-networkd 的场景
场景一:生产服务器(固定IP)
├── 配置稳定,不需要频繁更改
├── 资源优化,节省内存
└── 使用命令行管理即可
场景二:Docker/Kubernetes 节点
├── 网络配置简单
├── 减少依赖,提高稳定性
└── 容器网络由 Docker/K8s 管理
场景三:嵌入式/IoT 设备
├── 资源限制严格
├── 功能需求简单
└── 启动速度快
6.2 选择 NetworkManager 的场景
场景一:使用 Cockpit 管理
├── 需要 Web 界面配置网络
├── 方便远程管理
└── 可视化操作降低错误
场景二:桌面/笔记本
├── 需要连接 WiFi
├── 经常切换网络(办公/家庭/咖啡厅)
└── 需要 VPN 支持
场景三:开发测试环境
├── 频繁修改网络配置
├── 需要快速调整
└── 用户体验优先
6.3 决策流程图
开始
│
▼
是否使用 Cockpit 等 Web 工具管理?
│
├─── 是 ──→ 使用 NetworkManager
│
▼
是否经常变更网络配置?
│
├─── 是 ──→ 使用 NetworkManager
│
▼
是否需要 WiFi/VPN 等功能?
│
├─── 是 ──→ 使用 NetworkManager
│
▼
是否对资源占用敏感?
│
├─── 是 ──→ 使用 systemd-networkd
│
▼
是否为生产服务器?
│
├─── 是 ──→ 使用 systemd-networkd(推荐)
│
▼
使用 systemd-networkd
七、实战案例:从 systemd-networkd 切换到 NetworkManager
7.1 初始状态
$ cat /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: true
match:
macaddress: 52:54:00:c4:86:b2
set-name: eth0
$ sudo netplan status --all
● 2: eth0 ethernet UP (networkd: eth0)
7.2 执行切换
# 1. 修改配置
sudo vi /etc/netplan/50-cloud-init.yaml
# 添加 renderer: NetworkManager
# 2. 修复权限
sudo chmod 600 /etc/netplan/50-cloud-init.yaml
# 3. 应用配置
sudo netplan apply
# 4. 重启 NetworkManager
sudo systemctl restart NetworkManager
7.3 验证结果
$ sudo netplan status --all
● 2: eth0 ethernet UP (NetworkManager: eth0)
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected netplan-eth0
lo loopback unmanaged --
docker0 bridge unmanaged --
7.4 Cockpit 界面变化
| 切换前(systemd-networkd) | 切换后(NetworkManager) |
|---|---|
| 显示”未管理的接口” | 显示”已管理” |
| 只能查看网络信息 | 可以修改 IP、DNS、网关 |
| 灰色不可点击 | 可点击进入配置界面 |
| 无法在 Web 修改 | 完全 Web 可配置 |
八、常见问题解答
Q1:可以同时使用两者吗?
不建议。同时使用会导致网络配置冲突,可能出现网络不稳定。应该选择其一作为主要管理工具。
Q2:切换后会丢失 IP 吗?
切换过程中可能短暂断网,但 netplan apply 会平滑迁移。建议在本地操作,避免远程切换导致连接中断。
Q3:如何完全禁用 NetworkManager?
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
sudo systemctl mask NetworkManager
Q4:如何恢复使用 systemd-networkd?
# 移除 renderer: NetworkManager
sudo vi /etc/netplan/*.yaml
# 删除 renderer 行或改为 networkd
sudo netplan apply
sudo systemctl restart systemd-networkd
Q5:两者可以共存但管理不同接口吗?
可以,但不推荐。例如让 NetworkManager 管理 WiFi,systemd-networkd 管理有线网。但配置复杂,容易出错。
九、最佳实践建议
生产环境
- 推荐:systemd-networkd
- 原因:稳定、轻量、资源占用少
- 配置方式:Netplan YAML 配置
使用 Cockpit 的环境
- 推荐:NetworkManager
- 原因:Web 界面管理网络
- 配置方式:Cockpit + Netplan
开发测试环境
- 推荐:NetworkManager
- 原因:灵活方便
- 配置方式:nmcli / Cockpit
十、总结
| systemd-networkd | NetworkManager | |
|---|---|---|
| 一句话描述 | 轻量级服务器网络管理 | 全功能网络管理套件 |
| 最佳场景 | 稳定服务器、容器 | 桌面、动态环境 |
| Cockpit 管理 | 只读 | 完全控制 |
| 推荐选择 | 生产服务器 | 使用 Web 管理的服务器 |
附录:常用命令速查
systemd-networkd
networkctl status # 查看所有接口
networkctl status eth0 # 查看特定接口
networkctl list # 列出所有接口
sudo systemctl restart systemd-networkd # 重启服务
NetworkManager
nmcli dev status # 设备状态
nmcli con show # 所有连接
nmcli con show eth0 # 特定连接
nmcli dev show eth0 # 设备详情
sudo systemctl restart NetworkManager # 重启服务
希望这篇文章能帮助你理解 systemd-networkd 和 NetworkManager 的区别,并做出适合自己场景的选择。如有疑问,欢迎交流讨论!