我有两台由 OVH 托管的专用服务器,一台 SP-128 和一台 MG-512。硬件类似(它们都是基于 Supermicro 的版本),但 SP-128 配有 Xeon E5 Ivy Bridge 和 1 Gbps 以太网;MG-512 配有双 Xeon E5 Haswell 和 10 Gbps 以太网。
我正在将所有内容从旧服务器 (SP-128) 迁移到新服务器 (MG-512)。以下是我目前所做的工作:
- 在新盒子上设置分区
- 使用以下命令将数据和操作系统(整个 ZFS 存储池,全部包含)从旧设备复制到新设备
zfs send | ... ssh "zfs recv"
- 重新安装 GRUB
- 新的服务器有一个新的公共 IP,因此我在 中对其进行了更改
/etc/network/interfaces
,并且它的主以太网适配器有一个新的“名称”,因此我更新了配置(旧:eno1
;新:enp3s0f0
) - 我还更新了 libvirt 网络适配器
macvtap0
(在 libvirt 中标记macvtap-net
),在配置中将其替换eno1
为enp3s0f0
,并执行了virsh destroy macvtap-net; virsh start macvtap-net
确保更改生效。 - 新服务器启动并可通过网络访问!
现在,我有一堆 LXD 和 libvirt/KVM 客户机。它们每个都有一个或多个静态 IP,它们从我拥有的两个公共 /27 子网之一中声明。OVH 已将两个 /27 迁移到我的新服务器(应我的要求)。以下是网络设置的更多详细信息:
- LXD 容器使用 macvlan 连接。网络正常运行。我的所有 LXD 容器都可以访问公共互联网(并可被公共互联网访问)。
- KVM 客户机使用 macvtap 连接。网络不起作用。
- LXD 和 KVM 客户机使用的默认网关和子网完全相同;唯一不同的是每个客户机/容器使用的 MAC 地址以及 /27 内的特定 IP。我没有更改客户的 IP 配置,因为它不需要更改。
我的问题如上:KVM 客户端的网络无法正常工作。“无法正常工作”是指客户端无法放像以前一样使用静态 IP,但完全无法访问。访客无法 ping 其默认网关或任何其他 IP(无论是公共 IP 还是私有 IP)。
我同时运行着新旧服务器,因此我已仔细检查了它们之间的配置是否相同。例如,旧服务器才不是为主以太网适配器启用混杂模式,为 macvtap0 也启用混杂模式。新服务器也没有。
大多数其他配置内容不可能改变因为构成操作系统配置的文件是从旧服务器逐位复制到新服务器的。例如,libvirt/KVM 配置在服务器之间没有被修改或重新创建;它是完全相同的配置作为文件系统级数据传输的一部分进行复制zfs send / zfs recv
。
因此,在我看来,起作用的变量是:
- 物理机箱本身的“主”公共 IPv4 地址从旧服务器更改为新服务器。
- 以太网适配器的型号从英特尔千兆以太网变为10G。
- 这姓名以太网适配器的更改,从
eno1
到enp3s0f0
。 - 默认网关对于物理盒子已更改,但 /27s 的默认网关仍然可路由和使用(它在 LXD 中与 macvlan 一起工作)。
我已经三次检查了 KVM virtio-net 适配器的 MAC 地址是否正确,因为 OVH 执行 MAC 地址过滤(主要是为了防止意外配置错误,而不是作为安全措施)并为我正在使用的每个 IP 分配了特定的 MAC 地址。
所以我很困惑。为什么我的 KVM 客户机(我有一个 Linux 和一个 Windows)无法访问新机器上的网络,而基本上所有东西都是一样的,唯一合法的更改已经发生了变化?
哦,我还更改了每个 libvirt 中的网络适配器客人的配置(并重新启动客户机)。现在看起来是这样的:
<interface type='direct'>
<mac address='re:da:ct:ed'/>
<source dev='enp3s0f0' mode='bridge'/>
<target dev='macvtap0'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
通知enp3s0f0
也在那里(曾经是eno1
)。
以下是一些额外的故障排除内容:
ip -d link macvtap0 show
在新盒子上:
18: macvtap0@enp3s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 500
link/ether re:da:ct:ed brd ff:ff:ff:ff:ff:ff promiscuity 0
macvtap mode bridge addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
enp3s0f0
在旧盒子上,除了替换为之外,输出 100%相同eno1
。
答案1
我按照以下故障排除过程解决了这个问题:
- 我使用我的一台较新的 Ubuntu 18.04 虚拟机尝试了无法正常工作的 Windows VM 的 MAC 地址和 macvtap 适配器。有效。怎么回事?那么现在一些KVM 客户机可以与 macvtap 配合使用,但其他客户机却不能吗?
- 我对我的(正在运行的)Ubuntu VM 和 libvirt 中的 Windows 2k16 VM 的 XML 进行了逐行比较(
virsh edit xxx
)以找出可能存在的区别。 - 我发现的主要区别是:
Ubuntu 18.04(适用于 macvtap):
<type arch='x86_64' machine='pc-i440fx-bionic'>hvm</type>
<type arch='x86_64' machine='pc-i440fx-yakkety'>hvm</type>
根据我对 Ubuntu 版本名称的了解,我记得 Yakkety 比 Bionic 更老。因此,出于各种想法,我随意决定将 Windows VM 的机器类型“升级”为 bionic,并将 Ubuntu VM 切换回 NAT(它不需要公共 IP)。
有效!
因此,这里学到的教训非常明显。经常升级您的 KVM 机器类型,尤其是在操作系统发布新版本或硬件升级时。在这种情况下,机器yakkety
类型与 Ivy Bridge 硬件和 1 Gbps 以太网适配器配合使用,但bionic
机器类型需要与 Haswell 物理 CPU 和ixgbe
(10 Gbps) 物理 NIC 配合使用。
顺便说一句,我之前曾尝试在客户机中模拟 e1000 适配器,但问题并没有得到解决,所以这不是 virtio本身。它位于物理硬件和客户机之间的转换层深处。