如何让systemd-networkd.service重启后自动执行/etc/rc.local以恢复静态路由?
针对你的Ubuntu 22.04环境,结合systemd-networkd和默认netplan配置的场景,我有两个实用的解决方案,帮你解决服务重启后路由丢失的问题:
方法一:给systemd-networkd添加Post-Exec钩子(直接复用/etc/rc.local)
这个方法会让systemd-networkd在启动完成后自动执行你的/etc/rc.local脚本,完美适配你已经写好路由命令的情况:
首先确保/etc/rc.local有可执行权限(如果还没设置的话):
sudo chmod +x /etc/rc.local同时要确认脚本开头有正确的shebang(比如
#!/bin/bash),并且结尾有exit 0,否则可能执行失败。创建systemd服务的drop-in配置目录(用于扩展原服务配置,不会被系统升级覆盖):
sudo mkdir -p /etc/systemd/system/systemd-networkd.service.d在该目录下创建一个自定义配置文件,比如
99-exec-rc-local.conf:sudo nano /etc/systemd/system/systemd-networkd.service.d/99-exec-rc-local.conf写入以下内容:
[Service] ExecStartPost=/etc/rc.local重新加载systemd配置并重启服务测试:
sudo systemctl daemon-reload sudo systemctl restart systemd-networkd之后你可以检查路由表,确认静态路由是否已经自动恢复。
方法二:用netplan原生配置静态路由(更推荐的长期方案)
其实systemd-networkd是netplan的后端,你可以直接在netplan配置里定义静态路由,这样服务重启时会自动加载路由规则,不需要依赖/etc/rc.local这种传统脚本:
找到你的netplan配置文件(通常在
/etc/netplan/目录下,比如00-installer-config.yaml):sudo nano /etc/netplan/00-installer-config.yaml在对应的网络接口下添加
routes配置段,比如:network: ethernets: enp0s3: # 替换成你的实际网卡名称 addresses: [192.168.1.10/24] gateway4: 192.168.1.1 routes: - to: 10.0.0.0/8 via: 192.168.1.254 - to: 172.16.0.0/12 via: 192.168.1.254 version: 2把上面的路由规则替换成你实际需要的静态路由。
应用netplan配置:
sudo netplan apply之后不管systemd-networkd怎么重启,netplan都会自动把路由规则同步给systemd-networkd,彻底解决路由丢失的问题。
两种方法各有优势:方法一适合快速复用现有脚本,方法二更贴合Ubuntu 22.04的网络管理生态,稳定性更强。你可以根据自己的需求选择。
备注:内容来源于stack exchange,提问作者Behzad

