我在用于虚拟化的服务器上运行 Ubuntu 16.04。它使用 qemu-kvm 软件运行多个 Ubuntu 16.04 客户机进行虚拟化。服务器使用 libvirt 来管理客户机(自动启动、启动/停止等),并且我已将所有客户机设置为在主机启动时自动启动。
主机启动时一切似乎都很正常,没有任何错误,互联网也正常工作。但是当我在主机仍在启动时打开与任何主机的 VNC 连接时,我可以看到网络失败(无法启动提升网络接口)。这只发生在冷启动时。我的意思是,它只发生在我启动服务器并且主机在线后客户机自动启动时。当这种情况发生时,我只需手动重启主机,它就会正常工作而不会出现任何问题。我也可以只重启特定的接口(ifdown -f eth0 && ifup eth0)以使互联网再次工作。
大多数客户机只有一个接口 (eth0),并向路由器请求静态 IPv4 和静态 IPv6 地址。我注意到的一件事是 IPv6 路由上有“过期 x 秒”选项,而 IPv4 没有。这导致客户机在路由过期时无法通过 IPv6 访问。这是因为启动时 Raise 网络接口失败而导致过期吗?
我正在尝试找出为什么所有来宾在冷启动时都无法使界面正常工作。必须手动(重新)启动所有来宾,这非常烦人。主机的系统日志未显示与网络服务相关的任何错误,而来宾只有此错误:“RTNETLINK 回答:文件存在”,没有任何其他错误。
答案1
Ubuntu 中的网络服务正在设置客户机上的接口。链接快速建立,但实际接口初始化尚未完成。这导致网络服务接受邻居和路由器通告。
如果您的接口文件中有网关规则,当接口完全初始化并且在此之前已接受路由器通告时,这可能会导致问题。服务正在尝试根据您的网关规则添加默认路由,但通过 RA(路由器通告)为该特定网关分配了现有的默认路由。
为了解决这个问题,我简单地从接口文件中删除了网关,因为网关是通过 RA 自动分配的。另一个修复方法是使用以下命令禁用在此特定接口、默认值或所有接口上接受 RA:
pre-up net.ipv6.conf.device.accept_ra=0
其中“设备”是“all”、“default”或实际设备名称(eth0、em0 等)。