升级Ubuntu 22.04 LTS到23.10后网络配置失效,如何适配新系统的网络配置?
我来帮你一步步解决这个问题——毕竟OpenVZ的venet虚拟网卡在systemd版本迭代时确实容易踩坑,加上Ubuntu 23.10对systemd组件的拆分调整,咱们得把原来的配置完全迁移到新的systemd网络栈上:
第一步:补全缺失的systemd网络组件
你提到resolvectl移到了单独包,这是核心问题之一。先在chroot环境里把所有需要的systemd网络相关组件装全:
apt update && apt install systemd-networkd systemd-resolved systemd-sysv
其中systemd-sysv是用来确保系统默认用systemd作为初始化系统,避免和传统init系统产生冲突。
第二步:停用传统网络服务,备份旧配置
原来的/etc/network/interfaces是给传统networking服务用的,现在咱们要切换到systemd-networkd,所以先把旧配置备份并停用传统服务:
mv /etc/network/interfaces /etc/network/interfaces.backup systemctl disable --now networking.service
第三步:创建systemd-networkd的venet0配置文件
OpenVZ的venet设备是无链路的虚拟网卡,咱们需要在/etc/systemd/network/目录下创建专属配置文件(这个目录之前是空的,正好用来存放新配置),比如命名为10-venet0.network:
[Match] # 匹配你的venet0网卡 Name=venet0 [Network] # 对应原配置里venet0的127.0.0.1/32地址 Address=127.0.0.1/32 # 对应原venet0:0的公网IP地址,替换成你的实际IP Address=w.x.y.z/32 # 对应原配置里的IPv6地址,替换成你的实际地址 Address=xxxx:yyyy:zzzz:wwww:xxxx:yyyy:zzzz:wwww/128 # 启用默认路由,替代原来的`up route add default dev venet0` DefaultRoute=yes
如果DefaultRoute=yes偶尔不生效,可以把这一行换成两个Route小节:
[Route] Destination=0.0.0.0/0 Interface=venet0 [Route] Destination=::/0 Interface=venet0
第四步:迁移DNS配置到systemd-resolved
原来的DNS配置在resolved.conf里,推荐用drop-in文件来修改(比直接修改主文件更稳妥,系统升级时不会被覆盖),创建/etc/systemd/resolved.conf.d/custom-dns.conf:
[Resolve] DNS=81.169.163.106 85.214.7.22 Domains=my-domain.tld my-second-domain.tld
然后确保系统的resolv.conf指向systemd-resolved的stub文件:
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
第五步:启用并验证服务配置
现在启动相关服务并设置开机自启:
systemctl enable --now systemd-networkd.service systemd-resolved.service
接着在chroot环境里验证配置是否生效:
# 查看venet0的网络状态 networkctl status venet0 # 检查IP地址是否正确配置 ip addr show venet0 # 检查路由表 ip route show ip -6 route show # 测试DNS解析 resolvectl query example.com
最后一步:重启系统测试
退出chroot环境,通过服务商的WebUI重启服务器,之后应该就能正常通过SSH连接了。
失效原因总结
- Ubuntu 23.10拆分了systemd组件,
systemd-resolved和systemd-networkd从主systemd包中分离,升级过程中未自动安装; - 旧的
/etc/network/interfaces配置依赖传统networking服务,但新系统默认倾向于使用systemd-networkd,两者冲突导致网络未正确初始化; - OpenVZ的venet虚拟网卡需要专门的systemd-networkd配置才能被正确识别和配置。
备注:内容来源于stack exchange,提问作者user2690527

