如何在使用systemd-networkd的系统中配置重启网络后仍生效的持久化IP路由
如何在使用systemd-networkd的系统中配置重启网络后仍生效的持久化IP路由
我来帮你解决这个持久化路由的问题,你遇到的情况我之前也碰到过,咱们一步步来梳理正确的配置方式:
先处理Cloud-init的干扰问题
你当前的50-cloud-init.yaml文件头部明确说了修改后重启会被覆盖,因为cloud-init会从OpenStack的数据源重新生成网络配置。所以第一步必须先禁用cloud-init的网络配置功能,不然任何手动修改的netplan文件都会被重置:
- 创建禁用配置文件:
sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg <<EOF network: {config: disabled} EOF
- 重启系统(重启更稳妥),确保cloud-init不再接管网络配置。
方法一:用Netplan配置持久化路由
现在可以安全地修改netplan文件了,建议你复制原有的50-cloud-init.yaml到一个新文件(比如60-custom-routes.yaml),这样优先级更高,不会被后续可能的cloud-init残留覆盖:
- 复制并编辑新的netplan文件:
sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/60-custom-routes.yaml sudo nano /etc/netplan/60-custom-routes.yaml
- 在
ethernets下的ens3部分添加你的路由配置,注意YAML对缩进敏感,必须严格对齐:
network: version: 2 ethernets: ens3: # 保留原有的ens3基础配置(比如dhcp4: true之类的内容) routes: - to: {NETWORK/MASK} via: {GATEWAYIP} on-link: true # 如需添加多条路由,按同样格式继续添加即可 - to: {另一个NETWORK/MASK} via: {另一个GATEWAYIP} on-link: true
- 应用配置并验证:
sudo netplan generate sudo netplan apply # 检查路由是否生效 ip route show
这样配置后,重启系统或者重启networkd服务,路由都会保留。
方法二:用systemd-networkd直接配置
如果你不想用netplan,直接用systemd-networkd的配置文件也可以,但要注意cloud-init生成的配置文件优先级可能比你自定义的高,所以最好先完成上面的禁用cloud-init网络配置步骤,然后:
- 重命名cloud-init生成的临时配置,避免覆盖你的自定义配置:
sudo mv /run/systemd/network/10-netplan-ens3.network /run/systemd/network/10-netplan-ens3.network.bak
- 在
/etc/systemd/network/下创建(或修改)你的ens3.network文件,确保格式正确:
[Match] Name=ens3 [Network] # 这里要保留必要的基础网络配置,比如启用DHCP(如果之前用的是DHCP) DHCP=ipv4 # 如果是静态IP,就填写Address=... Gateway=...等对应配置 [Route] Destination={NETWORK/MASK} Gateway={GATEWAYIP} GatewayOnlink=yes [Route] Destination={另一个NETWORK/MASK} Gateway={另一个GATEWAYIP} GatewayOnlink=yes
- 重启systemd-networkd服务并验证:
sudo systemctl restart systemd-networkd # 检查服务状态和日志 sudo systemctl status systemd-networkd sudo journalctl -u systemd-networkd -f # 检查路由是否生效 ip route show
为什么你之前的配置没生效?
- 对于netplan:因为没禁用cloud-init,修改的
50-cloud-init.yaml重启后被覆盖了,而且可能存在YAML缩进格式错误,导致配置不生效。 - 对于systemd-networkd:cloud-init生成的
10-netplan-ens3.network优先级更高(数字越小优先级越高),你的自定义配置被覆盖了,同时[Network]部分缺少必要的基础配置,导致networkd没有正确应用路由规则。
备注:内容来源于stack exchange,提问作者Xaver




