伺服器遷移後 macvtap libvirt 來賓沒有網路連接
我有兩台由 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
)在配置中替換eno1
為enp3s0f0
,並做了一個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% 相同的,除了替換
enp3s0f0
為eno1
.
我通過以下故障排除過程解決了這個問題:
- 我使用我較新的 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 。它位於物理硬體和來賓之間的轉換層的深處。