Kvm-Virtualization

伺服器遷移後 macvtap libvirt 來賓沒有網路連接

  • December 17, 2018

我有兩台由 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 send | ... ssh "zfs recv"
  • 重新安裝 GRUB
  • 新伺服器有一個新的公共 IP,所以我在 中更改了/etc/network/interfaces它,它的主乙太網適配器有一個新的“名稱”,所以我更新了配置(舊:eno1;新enp3s0f0:)
  • 我還更新了 libvirt 網路適配器,macvtap0(在 libvirt 中標記macvtap-net)在配置中替換eno1enp3s0f0,並做了一個virsh destroy macvtap-net; virsh start macvtap-net以確保更改生效。
  • 新伺服器啟動並可以通過網路訪問

現在,我有一堆 LXD 和 libvirt/KVM 來賓。他們每個人都有一個或多個靜態 IP,它們從我擁有的兩個公共 /27 子網之一中聲明。OVH 已將兩個 /27s 遷移到我的新伺服器(應我的要求)。以下是網路設置的更多詳細資訊:

  • LXD 容器使用 macvlan 連接。**網路工作。**我所有的 LXD 容器都可以訪問(並通過)公共 Internet。
  • KVM 來賓使用 macvtap 連接。網路不工作。
  • LXD 和 KVM guest 使用的預設網關和子網完全相同;唯一不同的是每個來賓/容器使用的 MAC 地址,以及 /27 中的特定 IP。我沒有更改訪客的 IP 配置,因為它不需要更改。

我的問題是上面的:KVM 來賓的網路不起作用。“不起作用”是指客人可以像以前一樣設置靜態IP,但它們完全無法訪問。客人無法 ping 他們的預設網關或任何其他 IP,無論是公共的還是私有的。

我有新舊伺服器同時執行,所以我已經相當徹底地檢查了它們之間的配置是否相同。例如,舊伺服器沒有為主乙太網適配器啟用混雜模式,也沒有為 macvtap0 啟用混雜模式。新伺服器也沒有。

大多數其他配置內容無法更改,因為構成作業系統配置的文件從舊伺服器逐位複製到新伺服器。例如,在伺服器之間沒有修改或重新創建 libvirt/KVM 配置;它實際上是作為文件系統級數據傳輸的一部分複制的相同配置zfs send / zfs recv

所以,在我看來,起作用的變數是:

  • 物理盒子本身的“主要”公共 IPv4 地址從舊伺服器更改為新伺服器。
  • 乙太網適配器的型號從英特爾千兆乙太網更改為 10G。
  • 乙太網適配器的名稱eno1從 更改為enp3s0f0
  • 物理盒的預設網關已更改,但 /27s 的預設網關仍然可路由且可用(它在帶有 macvlan 的 LXD 中工作)。

我已經三重檢查了 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

在舊盒子上,輸出是 100% 相同的,除了替換enp3s0f0eno1.

我通過以下故障排除過程解決了這個問題:

  • 我使用我較新的 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的機器類型“升級”為仿生,並將Ubuntu VM切換回NAT(它不需要公共IP)。

有效!

所以,這裡學到的教訓非常清楚。經常升級您的 KVM 機器類型,尤其是使用新版本的作業系統甚至硬體升級。在這種情況下,yakkety機器類型與 Ivy Bridge 硬體和 1 Gbps 乙太網適配器一起使用,但bionic機器類型需要與 Haswell 物理 CPU 和ixgbe(10 Gbps) 物理 NIC 一起使用。

順便說一句,我之前曾嘗試在客戶機中模擬 e1000 適配器,但這並沒有解決問題,所以它本身不是 virtio 。它位於物理硬體和來賓之間的轉換層的深處。

引用自:https://serverfault.com/questions/945567