跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

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-networkdNetworkManager
设计目标轻量级基础网络全功能网络管理
资源占用⭐ 很低⭐⭐ 中等
配置难度⭐⭐ 中等⭐ 简单
配置文件/run/systemd/network/*.network/etc/NetworkManager/system-connections/*.nmconnection
命令行工具networkctlnmcli
图形界面❌ 不支持✅ 支持
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-networkdNetworkManager
一句话描述轻量级服务器网络管理全功能网络管理套件
最佳场景稳定服务器、容器桌面、动态环境
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 的区别,并做出适合自己场景的选择。如有疑问,欢迎交流讨论!

作者

老丹

关注我
其他文章
上一个

Tailscale 客户端完全操作手册:从安装到连接自建 Headscale 的日常命令大全

下一个

深入理解 Docker Macvlan:让容器“插上”物理网线

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Ubuntu 防火墙迁移指南:从 UFW 到 firewalld 的完整实践 2026年9月12日
  • Nano 编辑器完全操作指南:从入门到熟练 2026年9月12日
  • SSCG:让自签名证书不再“危险”的生成工具 2026年9月12日
  • Ubuntu Samba 服务安装与配置完全指南 2026年9月12日
  • 从零开始:用 Docker 部署 Jellyfin 并启用英特尔核显硬件加速 2026年9月11日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (17)
  • Linux服务配置 (50)
  • Linux系统 (16)
  • OpenWrt路由 (3)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 未分类 (1)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 音视频技术 (5)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号