networkd-dispatcher 是一个非常精巧的工具,它的作用是 为 systemd-networkd 提供“挂钩”功能(Hooks)。
如果你把 systemd-networkd 比作系统底层的“网络管家”,那么 networkd-dispatcher 就是管家旁边的“执行秘书”。
为什么需要它?(痛点分析)
systemd-networkd 的设计哲学是 “极简” 和 “静态”。它的核心任务就是读取配置文件,然后把网卡拉起来,分配 IP。它刻意不包含复杂的脚本执行功能(因为它想保持作为 init 系统组件的简洁与高可用)。
但现实的运维场景中,仅仅把网卡拉起来是不够的,你往往需要做“触发式操作”:
* 网卡 eth0 获得了 IP 地址(routable 状态)后,自动启动 VPN。
* 网卡断开连接(off 状态)后,自动清除防火墙规则。
* 网络状态切换时,发送一个通知到 Slack 或 Prometheus Gateway。
由于 systemd-networkd 本身不提供这些“当网卡状态改变时执行 X 脚本”的功能,networkd-dispatcher 出现了,它补齐了这个短板。
它是如何工作的?
它是一个运行在用户空间的守护进程(Daemon),通过 D-Bus 与 systemd-networkd 保持同步。
- 监听:它实时监控
systemd-networkd通过 D-Bus 发出的网络状态变更信号。 - 分发:一旦监听到特定的状态变更(例如:网络已就绪),它会根据状态去扫描预定义的文件夹。
脚本存放目录结构
networkd-dispatcher 会自动扫描 /etc/networkd-dispatcher/ 下的子目录。每个子目录对应一个网络状态:
/etc/networkd-dispatcher/routable.d/:当接口获得路由(即有 IP 且连通)时执行。/etc/networkd-dispatcher/carrier.d/:当检测到物理信号(网线已插上)时执行。/etc/networkd-dispatcher/off.d/:当接口关闭时执行。/etc/networkd-dispatcher/no-carrier.d/:当检测到网线被拔掉时执行。
只要把你的脚本放进对应的文件夹,并赋予可执行权限,networkd-dispatcher 就会在事件发生时自动帮你运行。
生产环境的注意事项(避坑指南)
阻塞问题:networkd-dispatcher 运行脚本时是同步阻塞的。如果你的脚本(比如一个 VPN 启动脚本)卡住了,它会阻塞 Dispatcher 对其他网卡事件的处理。建议在脚本中加入超时处理或使用 & 后台执行。
环境差异:Dispatcher 执行脚本时,环境变量与你手动登录终端时完全不同(通常是很干净的 PATH)。一定要在脚本中使用绝对路径(例如 /usr/bin/ip 而不是 ip),否则脚本极大概率会报错。
权限:该守护进程通常以 root 权限运行,所以你的脚本拥有系统最高权限。请严格限制脚本的读写权限,避免安全风险。
安装 networkd-dispatcher
#### Ubuntu / Debian 及衍生版
sudo apt update
sudo apt install networkd-dispatcher
#### Fedora / RHEL / CentOS / openEuler
# 在 CentOS/RHEL 上可能需要先安装 EPEL 仓库
# sudo dnf install epel-release
sudo dnf install networkd-dispatcher
#### Arch Linux
sudo pacman -S networkd-dispatcher
安装完成后,该服务不会自动处于运行状态(或者需要手动确认),你需要启用它并确保它在系统引导时自动加载:
启用并立即启动服务:
sudo systemctl enable --now networkd-dispatcher
检查服务运行状态:
systemctl status networkd-dispatcher
如果输出显示 Active: active (running),说明安装成功。
建议检查一下它的配置目录是否已正确创建。这是你未来存放自动化脚本的地方:
ls -ld /etc/networkd-dispatcher/
如果该目录不存在,手动创建它:
sudo mkdir -p /etc/networkd-dispatcher/{routable.d,off.d,no-carrier.d,carrier.d}
- 云镜像/容器环境:如果你使用的是某些极端裁剪的 Docker 容器或云主机镜像,它们可能没有包含
networkd-dispatcher。如果你在使用systemd-networkd进行网络管理,但发现安装后没有生效,请检查是否是因为你的系统内核不支持相关的 D-Bus 事件推送(极少数情况下)。 - 冲突风险:如果你当前系统使用的是
NetworkManager,networkd-dispatcher是无法直接“接管” NetworkManager 的事件的。它专门服务于systemd-networkd。在混合环境下请务必确认你的主网络管理器到底是哪一个。
和Netplan的关系
可以把它们看作是一个生产流水线上的不同工位。networkd-dispatcher 和 Netplan 之间并不直接对话,它们通过“中间人”——systemd-networkd 来串联。
我们把整个网络配置和管理过程拆解成三个阶段:
| 角色 | 组件 | 职责 | 身份 |
|---|---|---|---|
| 规划阶段 | Netplan | 定义网络架构,生成 YAML 配置文件。 | 配置前端 (Frontend) |
| 执行阶段 | systemd-networkd | 读取配置,执行 IP 分配、路由设置、接口拉起。 | 后端引擎 (Backend) |
| 自动化阶段 | networkd-dispatcher | 监控 networkd 的状态变更,执行脚本钩子。 |
自动化工具 (Hook/Automation) |
它们是如何“间接协作”的?
虽然 networkd-dispatcher 不会读 Netplan 的配置文件,但如果你在 Netplan 中修改了网络配置,会导致 systemd-networkd 的状态发生改变,从而触发 networkd-dispatcher。
完整的工作流如下:
- 用户操作:你修改了
/etc/netplan/01-netcfg.yaml。 - 应用配置:执行
sudo netplan apply。- Netplan 将 YAML 转换为
systemd-networkd能理解的.network格式文件。 - Netplan 通知
systemd-networkd重新加载配置。
- Netplan 将 YAML 转换为
- 系统状态变更:
systemd-networkd识别到新配置,将网卡状态从configuring变为routable(已获得 IP,可以联网)。 - 事件广播:
systemd-networkd通过 D-Bus 发送一个“网络状态变为 routable”的信号。 - 自动化触发:
networkd-dispatcher监听到该 D-Bus 信号,查看/etc/networkd-dispatcher/routable.d/目录下是否有脚本,如果有,立即执行它们。
- 如果 Netplan 的后端是
networkd:那么networkd-dispatcher有用。 - 如果 Netplan 的后端是
NetworkManager:那么networkd-dispatcher完全没用。
在 Ubuntu 等系统中,你可以在 Netplan 中指定后端:
network:
version: 2
renderer: networkd # 此时 systemd-networkd 工作,networkd-dispatcher 生效
# 或者
renderer: NetworkManager # 此时 networkd-dispatcher 不会收到任何信号
如果你的 Netplan 配置中使用了 renderer: NetworkManager,即使你安装了 networkd-dispatcher,它也会因为监听不到 D-Bus 信号而一直处于“空转”状态。此时,你应该使用 NetworkManager 自带的 dispatcher 脚本功能 (/etc/NetworkManager/dispatcher.d/)。
在 Linux 发行版中的分布情况
networkd-dispatcher 的原作者是 Clayton Craft。
他是 Canonical 公司(Ubuntu 的母公司)的一名资深工程师。这个工具的设计初衷就是为了填补 systemd-networkd 缺乏脚本自动触发机制的空白,从而让 Ubuntu 的网络管理栈(结合 Netplan)能够实现与传统 NetworkManager 相似的灵活性。
networkd-dispatcher 并不是一个像 systemd 或 grep 那样的“Linux 标配”工具。它高度依赖于你所选择的网络栈。
以下是其在主要发行版中的默认状态:
| 发行版 | 默认包含/预装 | 备注 |
|---|---|---|
| Ubuntu (Server/Cloud) | 是 (Default) | 在使用 netplan + systemd-networkd 作为默认网络配置的镜像中,它是核心依赖之一。 |
| Debian | 否 | 官方仓库提供,但不是默认安装。需用户手动安装并配置。 |
| Arch Linux | 否 | 存在于社区仓库 (Community),用户需根据需求手动安装。 |
| Fedora / RHEL / CentOS | 否 | 这些发行版默认使用 NetworkManager 作为网络后端,它们使用配套的 NetworkManager-dispatcher,而不是 networkd-dispatcher。 |
| openEuler / SUSE | 否 | 类似 RHEL 系列,通常偏好使用 NetworkManager 或 wicked (旧版 SUSE)。 |
总结
networkd-dispatcher 就像是 NetworkManager 体系中的 dispatcher 的轻量级、模块化替代方案,专门服务于使用 systemd-networkd 的高性能服务器环境。
- Netplan 是“图纸”:它告诉系统“我想要什么样的网络”。
systemd-networkd是“施工队”:它根据图纸把网卡拉起来。networkd-dispatcher是“监控员”:它看着施工队,一旦施工完成(状态变更),它就按照你预设的指令去执行额外工作(如启动 VPN、更新 DNS 等)。
它们没有直接的耦合,但如果你的网络栈基于 systemd-networkd,它们就是铁三角。
- 标签 netplan