可以在不中断线上业务的前提下,用 systemd-networkd 搭建轻量、可复用的网卡管理框架,核心是先并行接管、再逐步切换、全程状态可控:通过配置隔离与服务协同实现平滑过渡,停用旧工具对目标网卡的管理后,仅启用对应.network文件的接口,其余网卡不受影响;最小配置仅需10-.link、20-.network、30-dns.network三文件;支持热加载与实时验证,无需重启;结合模板与CI/CD可实现自动化、可追溯的批量部署。

可以在不中断线上业务的前提下,用 systemd-networkd 搭建轻量、可复用的网卡管理框架。核心思路是:**先并行接管、再逐步切换、全程状态可控**。它不依赖重启或停服,靠配置隔离与服务协同实现平滑过渡。
1. 并行运行,避免冲突
systemd-networkd 不能和 NetworkManager 或 ifupdown 同时管理同一物理接口。但可以分阶段接管:
- 先停用旧工具对目标网卡的管理(如注释掉 /etc/network/interfaces 中对应 iface,或禁用 NetworkManager 对该接口的控制)
- 确保 仅该网卡**未被其他服务声明管理**,其余网卡照常工作
- 启用 systemd-networkd 后,默认只处理有对应 .network 文件的接口,没配的接口完全不受影响
2. 极简配置结构:三文件起步
真正生效的最小配置只需三个文件,全部放在 /etc/systemd/network/ 下:
- 10-eth0.link:固定接口命名(可选,但推荐)。例如设置 MAC 地址绑定或 MTU,避免因 udev 规则变动导致配置错位
-
20-eth0.network:主网络行为。最简内容如下:
[Match]
Name=eth0
[Network]
DHCP=yes
# 或静态配置:
# Address=192.168.1.100/24
# Gateway=192.168.1.1
# DNS=8.8.8.8 -
30-dns.network(全局 DNS):统一指定解析策略,不影响单接口配置
[Match]
Name=*
[Network]
DNS=1.1.1.1 8.8.4.4
Domains=local
3. 热加载 + 实时验证,零停机上线
配置写完后无需重启网络或机器:
- 执行 sudo systemctl restart systemd-networkd —— 它会自动 re-read 所有 .network/.link 文件
- 立刻用 networkctl status eth0 查看新配置是否已生效、链路是否 UP、地址是否获取成功
- 用 networkctl list 确认只有目标接口状态变更,其他接口 remain 'configured' 或 'routable',无抖动
- 配合 ip -br a s eth0 和 ping -c3 网关 快速验证连通性
4. 自动化扩展:模板+变量注入
真正实现“自动化管理”,关键不是手写每个文件,而是用脚本生成:
- 准备 Jinja2 或 shell 模板(如 ethX.network.j2),含变量如
{{ ip_addr }}、{{ gateway }} - 用 Ansible / bash + envsubst 批量渲染出各节点的 .network 文件
- 所有生成文件按数字前缀排序(如 10-, 20-, 30-),保证加载顺序清晰、无覆盖风险
- 把模板和变量存入 Git,每次变更只需提交配置,CI/CD 触发部署,比改脚本更安全可追溯
整套框架不到 10 行有效配置、一次 reload 完成生效、全程业务无感知。难点不在技术,而在明确“谁管哪个口”的边界——只要旧工具退让一步,systemd-networkd 就能立刻稳稳接住。

















