networkd-dispatcher
嗯,用户让我总结一下这篇文章的内容,控制在一百个字以内。首先,我需要通读整篇文章,抓住主要点。 文章讲的是networkd-dispatcher这个工具。它主要是为systemd-networkd提供钩子功能,也就是在特定的网络状态变化时执行脚本。痛点是systemd-networkd本身太简洁,不支持复杂的脚本执行,所以networkd-dispatcher就应运而生了。 接下来,文章详细介绍了它是如何工作的,通过D-Bus监听网络状态变化,然后触发相应的脚本。脚本存放在特定的目录结构里,比如routable.d、carrier.d这些文件夹里。 生产环境注意事项提到了阻塞问题、环境变量差异和权限问题,这些都是使用时需要注意的地方。安装部分介绍了不同发行版的安装方法,还提到了和Netplan的关系,说明它们通过systemd-networkd间接协作。 最后总结了这个工具的作用和适用场景。 现在我要把这些要点浓缩到100字以内。要涵盖工具的作用、痛点、工作原理、脚本存放、注意事项以及它和Netplan的关系。 可能的结构是:networkd-dispatcher为systemd-networkd提供钩子,在网络状态变化时执行脚本。解决了systemd-networkd缺乏动态操作的问题。通过D-Bus监听状态变化,并触发预设脚本。适用于需要自动化任务的场景。 </think> networkd-dispatcher 是一个为 systemd-networkd 提供钩子功能的工具,在网络状态变化时自动执行预设脚本。它解决了 systemd-networkd 缺乏动态操作能力的问题,并通过 D-Bus 监听网络事件以触发相应任务。适用于需要自动化网络操作的场景。 2026-4-28 08:24:56 Author: dyrnq.com(查看原文) 阅读量:12 收藏

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-Bussystemd-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 事件推送(极少数情况下)。
  • 冲突风险:如果你当前系统使用的是 NetworkManagernetworkd-dispatcher 是无法直接“接管” NetworkManager 的事件的。它专门服务于 systemd-networkd。在混合环境下请务必确认你的主网络管理器到底是哪一个。

和Netplan的关系

可以把它们看作是一个生产流水线上的不同工位。networkd-dispatcherNetplan 之间并不直接对话,它们通过“中间人”——systemd-networkd 来串联。

我们把整个网络配置和管理过程拆解成三个阶段:

角色 组件 职责 身份
规划阶段 Netplan 定义网络架构,生成 YAML 配置文件。 配置前端 (Frontend)
执行阶段 systemd-networkd 读取配置,执行 IP 分配、路由设置、接口拉起。 后端引擎 (Backend)
自动化阶段 networkd-dispatcher 监控 networkd 的状态变更,执行脚本钩子。 自动化工具 (Hook/Automation)

它们是如何“间接协作”的?

虽然 networkd-dispatcher 不会读 Netplan 的配置文件,但如果你在 Netplan 中修改了网络配置,会导致 systemd-networkd 的状态发生改变,从而触发 networkd-dispatcher

完整的工作流如下:

  1. 用户操作:你修改了 /etc/netplan/01-netcfg.yaml
  2. 应用配置:执行 sudo netplan apply
    • Netplan 将 YAML 转换为 systemd-networkd 能理解的 .network 格式文件。
    • Netplan 通知 systemd-networkd 重新加载配置。
  3. 系统状态变更systemd-networkd 识别到新配置,将网卡状态从 configuring 变为 routable(已获得 IP,可以联网)。
  4. 事件广播systemd-networkd 通过 D-Bus 发送一个“网络状态变为 routable”的信号。
  5. 自动化触发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 并不是一个像 systemdgrep 那样的“Linux 标配”工具。它高度依赖于你所选择的网络栈。

以下是其在主要发行版中的默认状态:

发行版 默认包含/预装 备注
Ubuntu (Server/Cloud) 是 (Default) 在使用 netplan + systemd-networkd 作为默认网络配置的镜像中,它是核心依赖之一。
Debian 官方仓库提供,但不是默认安装。需用户手动安装并配置。
Arch Linux 存在于社区仓库 (Community),用户需根据需求手动安装。
Fedora / RHEL / CentOS 这些发行版默认使用 NetworkManager 作为网络后端,它们使用配套的 NetworkManager-dispatcher,而不是 networkd-dispatcher
openEuler / SUSE 类似 RHEL 系列,通常偏好使用 NetworkManagerwicked (旧版 SUSE)。

总结

networkd-dispatcher 就像是 NetworkManager 体系中的 dispatcher 的轻量级、模块化替代方案,专门服务于使用 systemd-networkd 的高性能服务器环境。

  • Netplan 是“图纸”:它告诉系统“我想要什么样的网络”。
  • systemd-networkd 是“施工队”:它根据图纸把网卡拉起来。
  • networkd-dispatcher 是“监控员”:它看着施工队,一旦施工完成(状态变更),它就按照你预设的指令去执行额外工作(如启动 VPN、更新 DNS 等)。

它们没有直接的耦合,但如果你的网络栈基于 systemd-networkd,它们就是铁三角。


文章来源: https://dyrnq.com/networkd-dispatcher/
如有侵权请联系:admin#unsafe.sh