NET_FAILOVER

概述

net_failover 驅動程式透過 API 提供自動故障轉移機制,用於建立和銷燬故障轉移主 netdev,並管理透過通用故障轉移基礎設施註冊的主和備用從 netdev。

故障轉移 netdev 充當主裝置並控制 2 個從裝置。 原始半虛擬化介面註冊為“備用”從 netdev,並且具有相同 MAC 的 passthru/vf 設備註冊為“主”從 netdev。“備用”和“故障轉移”netdev 都與相同的“pci”裝置相關聯。 使用者透過“故障轉移”netdev 訪問網路介面。 當“故障轉移”netdev 可用且鏈路啟動並執行時,它選擇“主”netdev 作為預設的傳輸裝置。

半虛擬化驅動程式可以使用此功能來啟用備用的低延遲資料路徑。 當 VF 被拔出時,它還可以透過故障轉移到半虛擬化資料路徑,從而實現虛擬機器直接連線 VF 的虛擬機器監控程式控制的即時遷移。

virtio-net 加速資料路徑:STANDBY 模式

net_failover 以透明的方式為啟用 virtio-net 的虛擬機器啟用虛擬機器監控程式控制的加速資料路徑,而無需/最小化訪客使用者空間更改。

為了支援這一點,虛擬機器監控程式需要在 virtio-net 介面上啟用 VIRTIO_NET_F_STANDBY 功能,並將相同的 MAC 地址分配給 virtio-net 和 VF 介面。

這是一個 libvirt XML 片段示例,顯示了此類配置

<interface type='network'>
  <mac address='52:54:00:00:12:53'/>
  <source network='enp66s0f0_br'/>
  <target dev='tap01'/>
  <model type='virtio'/>
  <driver name='vhost' queues='4'/>
  <link state='down'/>
  <teaming type='persistent'/>
  <alias name='ua-backup0'/>
</interface>
<interface type='hostdev' managed='yes'>
  <mac address='52:54:00:00:12:53'/>
  <source>
    <address type='pci' domain='0x0000' bus='0x42' slot='0x02' function='0x5'/>
  </source>
  <teaming type='transient' persistent='ua-backup0'/>
</interface>

在此配置中,第一個裝置定義用於 virtio-net 介面,它充當“持久”裝置,指示此介面將始終插入。 這是透過“teaming”標記指定的,該標記的必需屬性 type 具有值“persistent”。 virtio-net 裝置的鏈路狀態設定為“down”,以確保“故障轉移”netdev 首選 VF 直通裝置用於正常通訊。 virtio-net 裝置將在即時遷移期間啟動,以允許不間斷的通訊。

第二個裝置定義用於 VF 直通介面。 此處提供了帶有型別“transient”的“teaming”標記,指示該裝置可能會定期拔出。 提供了第二個屬性“persistent”,並指向為 virtio-net 裝置宣告的別名。

使用上述配置引導 VM 將導致在 VM 中建立以下 3 個介面

4: ens10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:00:12:53 brd ff:ff:ff:ff:ff:ff
    inet 192.168.12.53/24 brd 192.168.12.255 scope global dynamic ens10
       valid_lft 42482sec preferred_lft 42482sec
    inet6 fe80::97d8:db2:8c10:b6d6/64 scope link
       valid_lft forever preferred_lft forever
5: ens10nsby: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master ens10 state DOWN group default qlen 1000
    link/ether 52:54:00:00:12:53 brd ff:ff:ff:ff:ff:ff
7: ens11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ens10 state UP group default qlen 1000
    link/ether 52:54:00:00:12:53 brd ff:ff:ff:ff:ff:ff

在此,ens10 是“故障轉移”主介面,ens10nsby 是從屬“備用”virtio-net 介面,而 ens11 是從屬“主”VF 直通介面。

這裡要注意的一點是,一些使用者空間網路配置守護程式,如 systemd-networkd、ifupdown 等,不理解“net_failover”裝置; 並且在第一次啟動時,VM 最終可能會從 DHCP 伺服器獲得“故障轉移”裝置和 VF 的 IP 地址(相同或不同)。 這將導致與 VM 失去連線。 因此,可能需要對這些網路配置守護程式進行一些調整,以確保僅在“故障轉移”裝置上收到 IP。

以下是與 Debian 雲映像上找到的“cloud-ifupdown-helper”指令碼一起使用的補丁片段

::
@@ -27,6 +27,8 @@ do_setup() {

local working=”$cfgdir/.$INTERFACE” local final=”$cfgdir/$INTERFACE”

  • if [ -d “/sys/class/net/${INTERFACE}/master” ]; then exit 0; fi

  • if ifup --no-act “$INTERFACE” > /dev/null 2>&1; then

    # interface is already known to ifupdown, no need to generate cfg log “Skipping configuration generation for $INTERFACE”

具有 SR-IOV VF 和 virtio-net 的 VM 在 STANDBY 模式下的即時遷移

net_failover 還透過在 VF 拔出時自動故障轉移到半虛擬化資料路徑,從而支援虛擬機器監控程式控制的即時遷移到具有直接連線 SR-IOV VF 裝置的 VM。

這是一個示例指令碼,顯示了從源虛擬機器監控程式啟動即時遷移的步驟。 注意:假定 VM 連線到軟體橋“br0”,該橋具有連線到它的單個 VF 以及 VM 的 vnet 裝置。 這不是傳遞給 VM 的 VF(在 vf.xml 檔案中看到)。

# cat vf.xml
<interface type='hostdev' managed='yes'>
  <mac address='52:54:00:00:12:53'/>
  <source>
    <address type='pci' domain='0x0000' bus='0x42' slot='0x02' function='0x5'/>
  </source>
  <teaming type='transient' persistent='ua-backup0'/>
</interface>

# Source Hypervisor migrate.sh
#!/bin/bash

DOMAIN=vm-01
PF=ens6np0
VF=ens6v1             # VF attached to the bridge.
VF_NUM=1
TAP_IF=vmtap01        # virtio-net interface in the VM.
VF_XML=vf.xml

MAC=52:54:00:00:12:53
ZERO_MAC=00:00:00:00:00:00

# Set the virtio-net interface up.
virsh domif-setlink $DOMAIN $TAP_IF up

# Remove the VF that was passthrough'd to the VM.
virsh detach-device --live --config $DOMAIN $VF_XML

ip link set $PF vf $VF_NUM mac $ZERO_MAC

# Add FDB entry for traffic to continue going to the VM via
# the VF -> br0 -> vnet interface path.
bridge fdb add $MAC dev $VF
bridge fdb add $MAC dev $TAP_IF master

# Migrate the VM
virsh migrate --live --persistent $DOMAIN qemu+ssh://$REMOTE_HOST/system

# Clean up FDB entries after migration completes.
bridge fdb del $MAC dev $VF
bridge fdb del $MAC dev $TAP_IF master

在目標虛擬機器監控程式上,在遷移開始之前建立共享橋“br0”,並將來自目標 PF 的 VF 新增到該橋。 類似地,添加了適當的 FDB 條目。

以下指令碼在遷移完成後在目標虛擬機器監控程式上執行,它將 VF 重新連線到 VM 並關閉 virtio-net 介面。

::

# reattach-vf.sh #!/bin/bash

bridge fdb del 52:54:00:00:12:53 dev ens36v0 bridge fdb del 52:54:00:00:12:53 dev vmtap01 master virsh attach-device --config --live vm01 vf.xml virsh domif-setlink vm01 vmtap01 down