侧边栏壁纸
博主头像
winson的blog博主等级

行动起来,活在当下

  • 累计撰写 31 篇文章
  • 累计创建 37 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

systemd-networkd 服务实现流程

winson
2025-01-16 / 0 评论 / 0 点赞 / 17 阅读 / 12122 字

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 启动流程

  1. systemd 启动系统时,激活 systemd-networkd.service
  2. systemd-networkd 守护进程启动
  3. 读取配置文件目录中的网络配置
  4. 初始化网络设备管理器
  5. 开始监听 udev 事件

4.2 网络配置处理流程

  1. 检测到网络设备
  2. 读取对应的 .network 配置文件
  3. 应用网络配置(IP地址、路由等)
  4. 启动网络接口
  5. 监控网络状态变化

5. 配置文件类型

  1. .network 文件:定义网络接口配置
  2. .netdev 文件:定义虚拟网络设备
  3. .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. 故障排查流程

  1. 检查服务状态:systemctl status systemd-networkd
  2. 查看日志:journalctl -u systemd-networkd
  3. 验证配置文件语法
  4. 检查网络接口状态:networkctl
  5. 测试网络连接

9. 最佳实践

  1. 使用版本控制管理配置文件
  2. 配置文件命名使用数字前缀确保加载顺序
  3. 保持配置文件简洁明了
  4. 定期备份网络配置
  5. 记录配置变更

10. Netplan 与 systemd-networkd 的关系

10.1 Netplan 简介

Netplan 是 Ubuntu 引入的网络配置抽象层,它使用 YAML 格式的配置文件来描述网络接口配置。Netplan 可以生成适用于不同网络管理后端(如 systemd-networkd 或 NetworkManager)的配置。

10.2 工作原理

  1. Netplan 读取 /etc/netplan/*.yaml 配置文件
  2. 根据配置文件中指定的 renderer(networkd 或 NetworkManager)
  3. 生成对应后端的配置文件
  4. 对于 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 配置流程

  1. 创建或编辑 /etc/netplan/*.yaml 文件
  2. 使用 netplan generate 生成后端配置
  3. 使用 netplan apply 应用配置
  4. systemd-networkd 接收新配置并重新配置网络接口

10.6 Netplan 与 systemd-networkd 的优势

  1. Netplan 提供了更简单的 YAML 配置语法
  2. 支持多个后端渲染器
  3. 配置验证和错误检查
  4. 向后兼容性
  5. 集中化的网络配置管理

10.7 故障排查

  1. 检查 YAML 语法:netplan generate --debug
  2. 验证配置:netplan try
  3. 查看 Netplan 日志:journalctl -xe
  4. 检查生成的 systemd-networkd 配置

11. 传统 Linux 网络管理方式

11.1 ifupdown 工具

传统 Linux 系统(如早期的 Debian/Ubuntu)使用 ifupdown 包进行网络管理:

  1. 配置文件:/etc/network/interfaces
  2. 命令工具:ifupifdown
  3. 配置示例:
# /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 系统使用网络脚本:

  1. 配置目录:/etc/sysconfig/network-scripts/
  2. 接口配置文件:ifcfg-<interface_name>
  3. 配置示例:
# /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 手动配置命令

最基础的网络配置方式,使用命令行工具:

  1. ifconfig/ip 命令:配置网络接口
  2. route 命令:配置路由表
  3. 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 之前的现代替代方案:

  1. 图形化配置工具
  2. 命令行工具:nmclinmtui
  3. 配置示例:
# 使用 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 各种方案的比较

  1. 手动配置

    • 优点:灵活,适用所有 Linux 系统
    • 缺点:配置不持久,重启后需重新配置
  2. ifupdown

    • 优点:配置简单,易于理解
    • 缺点:功能相对有限,不支持高级网络特性
  3. 网络脚本

    • 优点:配置持久化,支持启动时自动配置
    • 缺点:配置分散,不同发行版配置方式不同
  4. NetworkManager

    • 优点:图形界面,易用性好,功能强大
    • 缺点:资源占用较多,某些服务器场景可能过重

11.6 最佳实践建议

  1. 服务器环境

    • 小型服务器:使用 ifupdown 或网络脚本
    • 大型部署:考虑使用配置管理工具(如 Ansible)
  2. 桌面环境

    • 推荐使用 NetworkManager
    • 提供图形界面,便于普通用户使用
  3. 嵌入式系统

    • 使用手动配置或简单的网络脚本
    • 注重轻量级和可靠性

12. systemd 与 System V init 简介

12.1 System V init (sysvinit)

传统的 Linux 初始化系统:

  1. 特点

    • 顺序启动进程
    • 使用运行级别(runlevels)概念
    • 基于 Shell 脚本
    • PID 1 进程
  2. 运行级别说明

    • 0:关机
    • 1:单用户模式
    • 2:多用户模式(无网络)
    • 3:多用户模式(有网络)
    • 4:用户自定义
    • 5:图形界面模式
    • 6:重启
  3. 配置位置

    • 启动脚本:/etc/init.d/
    • 运行级别目录:/etc/rc[0-6].d/
    • 配置文件:/etc/inittab

12.2 systemd 简介

现代 Linux 系统的初始化系统和服务管理器:

  1. 核心特性

    • 并行启动服务
    • 按需启动守护进程
    • 服务依赖关系管理
    • 系统状态快照
    • 日志管理(journald)
  2. 核心概念

    • Unit:systemd 管理的基本单位
    • Target:替代运行级别的概念
    • Service:服务单元
    • Socket:套接字单元
    • Timer:定时器单元
  3. 配置位置

    • 系统单元文件:/lib/systemd/system/
    • 用户单元文件:/etc/systemd/system/
    • 运行时单元:/run/systemd/system/

12.3 systemd 与 sysvinit 的对比

  1. 启动过程

    • sysvinit:串行启动,按顺序执行
    • systemd:并行启动,基于依赖关系
  2. 服务管理

    • sysvinit:基于 Shell 脚本,service 命令
    • systemd:基于单元文件,systemctl 命令
  3. 日志管理

    • sysvinit:依赖 syslog
    • systemd:集成 journald
  4. 资源控制

    • sysvinit:依赖外部工具
    • systemd:内置 cgroups 支持

12.4 兼容性和迁移

  1. systemd 对 sysvinit 的兼容

    • 支持运行 init.d 脚本
    • 自动生成 unit 文件
    • 保留 service 命令支持
  2. 服务迁移步骤

# 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 常用管理命令

  1. systemd 命令
# 查看系统状态
systemctl status

# 查看所有服务
systemctl list-units --type=service

# 管理服务
systemctl start|stop|restart|enable|disable service-name

# 查看日志
journalctl -u service-name
  1. sysvinit 命令
# 切换运行级别
init 3

# 服务管理
service network start|stop|restart

# 查看服务状态
service --status-all

12.6 最佳实践建议

  1. 新系统部署

    • 优先使用 systemd
    • 利用现代特性(如 socket 激活)
    • 使用原生单元文件
  2. 旧系统维护

    • 保持 sysvinit 脚本
    • 逐步迁移到 systemd
    • 保留兼容性支持
  3. 混合环境

    • 使用兼容层
    • 记录服务管理方式
    • 规划迁移路径

13. Netplan 启动机制

13.1 开机自启动流程

  1. systemd 启动时会自动启动 netplan-wpa@.servicesystemd-networkd.service
  2. netplan 配置通过以下方式生效:
    • systemd 触发 netplan.service 单元
    • 该服务读取 /etc/netplan/*.yaml 配置
    • 生成对应后端(networkd/NetworkManager)的配置
    • 重启网络服务使配置生效

13.2 相关的 systemd 服务

# Netplan 相关的 systemd 单元
- netplan-wpa@.service    # 处理无线网络配置
- netplan.service         # 主服务,负责应用网络配置
- systemd-networkd.service # 网络管理后端服务

13.3 手动控制启动

  1. 检查服务状态
# 查看 netplan 服务状态
systemctl status netplan.service

# 查看 networkd 状态
systemctl status systemd-networkd
  1. 启动/停止服务
# 重启 netplan 服务
sudo systemctl restart netplan.service

# 启用开机自启
sudo systemctl enable netplan.service

13.4 故障排查

  1. 开机启动问题
# 检查服务是否启用
systemctl is-enabled netplan.service
systemctl is-enabled systemd-networkd.service

# 查看启动日志
journalctl -u netplan.service
journalctl -u systemd-networkd.service -b
  1. 常见问题解决
    • 配置文件权限:确保 yaml 文件权限正确(644)
    • 服务依赖:检查 networkd/NetworkManager 是否正确安装和启动
    • 配置语法:使用 netplan generate --debug 验证配置
0

评论区