systemd-networkd 服务实现流程
1. 简介
systemd-networkd 是 systemd 项目的一部分,是一个系统网络管理守护进程。它的主要职责是管理网络配置,包括检测和配置网络设备。
2. 核心组件
- systemd-networkd:网络管理守护进程
- systemd-resolved:DNS 解析服务
- networkctl:命令行工具,用于查询和管理网络状态
3. 配置文件位置
/etc/systemd/network/
:本地配置文件目录/run/systemd/network/
:运行时配置文件目录/lib/systemd/network/
:系统默认配置文件目录
4. 实现流程
4.1 启动流程
- systemd 启动系统时,激活 systemd-networkd.service
- systemd-networkd 守护进程启动
- 读取配置文件目录中的网络配置
- 初始化网络设备管理器
- 开始监听 udev 事件
4.2 网络配置处理流程
- 检测到网络设备
- 读取对应的 .network 配置文件
- 应用网络配置(IP地址、路由等)
- 启动网络接口
- 监控网络状态变化
5. 配置文件类型
- .network 文件:定义网络接口配置
- .netdev 文件:定义虚拟网络设备
- .link 文件:定义底层设备属性
6. 配置示例
6.1 基本的有线网络配置 (/etc/systemd/network/20-wired.network)
[Match]
Name=eth0
[Network]
DHCP=yes
6.2 静态IP配置示例
[Match]
Name=eth0
[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=8.8.8.8
7. 常用管理命令
# 启动服务
systemctl start systemd-networkd
# 查看网络状态
networkctl status
# 重新加载配置
systemctl restart systemd-networkd
8. 故障排查流程
- 检查服务状态:
systemctl status systemd-networkd
- 查看日志:
journalctl -u systemd-networkd
- 验证配置文件语法
- 检查网络接口状态:
networkctl
- 测试网络连接
9. 最佳实践
- 使用版本控制管理配置文件
- 配置文件命名使用数字前缀确保加载顺序
- 保持配置文件简洁明了
- 定期备份网络配置
- 记录配置变更
10. Netplan 与 systemd-networkd 的关系
10.1 Netplan 简介
Netplan 是 Ubuntu 引入的网络配置抽象层,它使用 YAML 格式的配置文件来描述网络接口配置。Netplan 可以生成适用于不同网络管理后端(如 systemd-networkd 或 NetworkManager)的配置。
10.2 工作原理
- Netplan 读取
/etc/netplan/*.yaml
配置文件 - 根据配置文件中指定的 renderer(networkd 或 NetworkManager)
- 生成对应后端的配置文件
- 对于 systemd-networkd,生成的配置文件位于
/run/systemd/network/
10.3 Netplan 配置示例
10.3.1 使用 DHCP 的配置
# /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: true
10.3.2 静态 IP 配置
# /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.10/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
10.4 Netplan 常用命令
# 生成配置
sudo netplan generate
# 应用配置
sudo netplan apply
# 尝试配置(不实际应用)
sudo netplan try
10.5 配置流程
- 创建或编辑
/etc/netplan/*.yaml
文件 - 使用
netplan generate
生成后端配置 - 使用
netplan apply
应用配置 - systemd-networkd 接收新配置并重新配置网络接口
10.6 Netplan 与 systemd-networkd 的优势
- Netplan 提供了更简单的 YAML 配置语法
- 支持多个后端渲染器
- 配置验证和错误检查
- 向后兼容性
- 集中化的网络配置管理
10.7 故障排查
- 检查 YAML 语法:
netplan generate --debug
- 验证配置:
netplan try
- 查看 Netplan 日志:
journalctl -xe
- 检查生成的 systemd-networkd 配置
11. 传统 Linux 网络管理方式
11.1 ifupdown 工具
传统 Linux 系统(如早期的 Debian/Ubuntu)使用 ifupdown 包进行网络管理:
- 配置文件:
/etc/network/interfaces
- 命令工具:
ifup
、ifdown
- 配置示例:
# /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8
11.2 网络脚本方式
早期的 Red Hat/CentOS 系统使用网络脚本:
- 配置目录:
/etc/sysconfig/network-scripts/
- 接口配置文件:
ifcfg-<interface_name>
- 配置示例:
# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
11.3 手动配置命令
最基础的网络配置方式,使用命令行工具:
ifconfig
/ip
命令:配置网络接口route
命令:配置路由表resolv.conf
:配置 DNS
# 配置IP地址
ifconfig eth0 192.168.1.10 netmask 255.255.255.0
# 或使用新版 ip 命令
ip addr add 192.168.1.10/24 dev eth0
# 配置默认网关
route add default gw 192.168.1.1
# 或使用新版 ip 命令
ip route add default via 192.168.1.1
# 配置DNS(编辑 /etc/resolv.conf)
nameserver 8.8.8.8
11.4 NetworkManager
在 systemd-networkd 之前的现代替代方案:
- 图形化配置工具
- 命令行工具:
nmcli
、nmtui
- 配置示例:
# 使用 nmcli 配置静态IP
nmcli con add type ethernet con-name "static-eth0" ifname eth0 ip4 192.168.1.10/24 gw4 192.168.1.1
nmcli con mod "static-eth0" ipv4.dns "8.8.8.8"
11.5 各种方案的比较
-
手动配置
- 优点:灵活,适用所有 Linux 系统
- 缺点:配置不持久,重启后需重新配置
-
ifupdown
- 优点:配置简单,易于理解
- 缺点:功能相对有限,不支持高级网络特性
-
网络脚本
- 优点:配置持久化,支持启动时自动配置
- 缺点:配置分散,不同发行版配置方式不同
-
NetworkManager
- 优点:图形界面,易用性好,功能强大
- 缺点:资源占用较多,某些服务器场景可能过重
11.6 最佳实践建议
-
服务器环境
- 小型服务器:使用 ifupdown 或网络脚本
- 大型部署:考虑使用配置管理工具(如 Ansible)
-
桌面环境
- 推荐使用 NetworkManager
- 提供图形界面,便于普通用户使用
-
嵌入式系统
- 使用手动配置或简单的网络脚本
- 注重轻量级和可靠性
12. systemd 与 System V init 简介
12.1 System V init (sysvinit)
传统的 Linux 初始化系统:
-
特点
- 顺序启动进程
- 使用运行级别(runlevels)概念
- 基于 Shell 脚本
- PID 1 进程
-
运行级别说明
- 0:关机
- 1:单用户模式
- 2:多用户模式(无网络)
- 3:多用户模式(有网络)
- 4:用户自定义
- 5:图形界面模式
- 6:重启
-
配置位置
- 启动脚本:
/etc/init.d/
- 运行级别目录:
/etc/rc[0-6].d/
- 配置文件:
/etc/inittab
- 启动脚本:
12.2 systemd 简介
现代 Linux 系统的初始化系统和服务管理器:
-
核心特性
- 并行启动服务
- 按需启动守护进程
- 服务依赖关系管理
- 系统状态快照
- 日志管理(journald)
-
核心概念
- Unit:systemd 管理的基本单位
- Target:替代运行级别的概念
- Service:服务单元
- Socket:套接字单元
- Timer:定时器单元
-
配置位置
- 系统单元文件:
/lib/systemd/system/
- 用户单元文件:
/etc/systemd/system/
- 运行时单元:
/run/systemd/system/
- 系统单元文件:
12.3 systemd 与 sysvinit 的对比
-
启动过程
- sysvinit:串行启动,按顺序执行
- systemd:并行启动,基于依赖关系
-
服务管理
- sysvinit:基于 Shell 脚本,
service
命令 - systemd:基于单元文件,
systemctl
命令
- sysvinit:基于 Shell 脚本,
-
日志管理
- sysvinit:依赖 syslog
- systemd:集成 journald
-
资源控制
- sysvinit:依赖外部工具
- systemd:内置 cgroups 支持
12.4 兼容性和迁移
-
systemd 对 sysvinit 的兼容
- 支持运行 init.d 脚本
- 自动生成 unit 文件
- 保留 service 命令支持
-
服务迁移步骤
# 1. 检查现有 init 脚本
ls /etc/init.d/
# 2. 创建对应的 systemd 服务文件
vim /etc/systemd/system/service-name.service
# 3. 停止旧服务
service old-service stop
# 4. 启动新服务
systemctl start new-service
# 5. 启用开机自启
systemctl enable new-service
12.5 常用管理命令
- systemd 命令
# 查看系统状态
systemctl status
# 查看所有服务
systemctl list-units --type=service
# 管理服务
systemctl start|stop|restart|enable|disable service-name
# 查看日志
journalctl -u service-name
- sysvinit 命令
# 切换运行级别
init 3
# 服务管理
service network start|stop|restart
# 查看服务状态
service --status-all
12.6 最佳实践建议
-
新系统部署
- 优先使用 systemd
- 利用现代特性(如 socket 激活)
- 使用原生单元文件
-
旧系统维护
- 保持 sysvinit 脚本
- 逐步迁移到 systemd
- 保留兼容性支持
-
混合环境
- 使用兼容层
- 记录服务管理方式
- 规划迁移路径
13. Netplan 启动机制
13.1 开机自启动流程
- systemd 启动时会自动启动
netplan-wpa@.service
和systemd-networkd.service
- netplan 配置通过以下方式生效:
- systemd 触发
netplan.service
单元 - 该服务读取
/etc/netplan/*.yaml
配置 - 生成对应后端(networkd/NetworkManager)的配置
- 重启网络服务使配置生效
- systemd 触发
13.2 相关的 systemd 服务
# Netplan 相关的 systemd 单元
- netplan-wpa@.service # 处理无线网络配置
- netplan.service # 主服务,负责应用网络配置
- systemd-networkd.service # 网络管理后端服务
13.3 手动控制启动
- 检查服务状态
# 查看 netplan 服务状态
systemctl status netplan.service
# 查看 networkd 状态
systemctl status systemd-networkd
- 启动/停止服务
# 重启 netplan 服务
sudo systemctl restart netplan.service
# 启用开机自启
sudo systemctl enable netplan.service
13.4 故障排查
- 开机启动问题
# 检查服务是否启用
systemctl is-enabled netplan.service
systemctl is-enabled systemd-networkd.service
# 查看启动日志
journalctl -u netplan.service
journalctl -u systemd-networkd.service -b
- 常见问题解决
- 配置文件权限:确保 yaml 文件权限正确(644)
- 服务依赖:检查 networkd/NetworkManager 是否正确安装和启动
- 配置语法:使用
netplan generate --debug
验证配置
评论区