systemd-networkd | 配置文件应用顺序
First | 序
此篇将从以下方面详析 systemd-networkd 配置文件
- 定义及用途
- 配置文件读取、优先级、处理顺序
- 接口匹配和应用顺序
- Drop-in 文件和配置合并顺序
📦
本篇所使用到的操作系统&软件版本(配置)如下所示
1. 定义及用途
systemd.network 文件(以 .network 为扩展名)是一种纯 ini 风格的文本文件
其主要作用是为匹配的网络接口编码网络配置,并由 systemd-networkd 服务使用
👩🏫
注意: 并非所有配置都可以使用
.network文件完成,在处理物理和虚拟设备时,则需要借助systemd.link和systemd.netdev2. 读取和排序
2.1. 读取路径
.network 配置文件从多个系统目录中读取
- 系统网络目录
/usr/lib/systemd/network和/usr/local/lib/systemd/network - 运行时网络目录(易失):
/run/systemd/network - 本地管理网络目录:
/etc/systemd/network
👩🏫
注意:如果
/usr/local/ 是一个独立分区,在系统早期引导阶段可能不可用,因此不应在此处放置配置2.2. 优先级
如果多个目录中存在同名的文件,它们会相互替换(覆盖)
• /etc/ 中的文件具有最高优先级。
• /run/ 中的文件优先于 /usr/ 中同名的文件
2.3. 处理顺序
所有收集到的配置文件,无论它们位于哪个目录中,都会进行字母数字顺序排序和处理
👩🏫
推荐做法: 建议文件名使用小于 "70" 的数字作为前缀(例如 10-ens33.network),以确保用户配置文件的优先级高于默认或由 systemd-network-generator.service 生成的文件
3. 匹配和应用顺序
在文件被排序后,systemd-networkd 按照这个排序顺序依次检查每个文件
并执行严格的首次匹配应用规则
3.1. 匹配机制
- 每个 .network 文件包含一个 [Match] 配置段,用于确定该文件是否可以应用于特定的网络接口
- 当文件中的 [Match] 部分指定的所有条件都满足时,该文件被认为匹配该接口
- 如果一个文件不包含有效的 [Match] 设置,它将匹配所有接口,systemd-networkd 会发出警告
3.2. 应用规则
- 对于给定的接口,第一个(按字母数字顺序)匹配该接口的 .network 文件将被应用
- 所有后续匹配该接口的文件都将被忽略,即使它们同样满足匹配条件
- 这意味着文件排序(即文件名)对于决定哪个配置生效至关重要
3.3. 排除机制
如果网络接口设置了 ID_NET_MANAGED_BY= udev 属性,除非该属性的值是 "io.systemd.Network",否则 systemd-networkd 永远不会匹配该接口。这个机制用于确保并发的网络管理工具不会争夺设备的管理权
👩🏫
注意: 接口udev属性可以使用命令
udevadm info 查看4. Drop-in 文件和配置合并顺序
除了主 .network 文件外,还可以使用插入(Drop-in)目录来修改或添加配置
这会影响最终的有效配置
4.1. Drop-in 目录结构
• 伴随主文件 foo.network,可以存在一个名为 foo.network.d/ 的目录。
• 该目录中所有后缀为 .conf 的文件将被用于配置合并
4.2. Drop-in 文件的合并和优先级
- Drop-in 文件(位于
foo.network.d/中)首先按字母数字顺序合并。 - 然后,它们在主文件
foo.network解析之后进行解析和合并。 - Drop-in 文件中的设置具有更高的优先级,可以覆盖主配置文件的设置。
- Drop-in 文件的目录优先级遵循与主文件相同的规则:
/etc/中的 Drop-in 文件优先级高于/run/,后者又高于/usr/lib/中的 Drop-in 文件
5. 总结
- 收集和排序:读取所有配置目录中的
.network文件,并按字母数字顺序(例如10-foo.network, 20-bar.network)排列。 - 首次匹配原则:对于每个接口,使用排序后的列表,选择第一个匹配该接口的
.network文件。 - 配置叠加:如果存在与该主文件关联的
Drop-in 目录 (foo.network.d/),则将Drop-in文件中的配置设置合并进来,Drop-in文件中的设置会覆盖主文件中的冲突设置。 - 应用配置:将最终合并(或未合并)的配置应用到匹配的网络接口上。
Thanks & Copy
systemd.network(5) — Arch manual pages
systemd.network - Network configuration
systemd-networkd - Arch Linux 中文维基
