11.6. 实时迁移附加了 Mellanox 虚拟功能的虚拟机
您可以实时迁移连接了支持的 Mellanox 网络设备的虚拟功能(VF)的虚拟机(VM)。
红帽实现了实时迁移连接了 Mellanox 网络设备的 VF 的虚拟机的通用功能。但是,该功能取决于特定的 Mellanox 设备型号和固件版本。
目前,VF 迁移只支持 Mellanox CX-7 网络设备。
Mellanox CX-7 网络设备上的 VF 使用一个新的 mlx5_vfio_pci 驱动程序,它添加了实时迁移所需的功能,并且 libvirt 自动将新驱动程序绑定到 VF。
红帽仅直接支持包括了 mlx5_vfio_pci 驱动程序的 Mellanox VF 实时迁移。
限制:
当实时迁移连接了虚拟功能的虚拟机时,无法使用一些虚拟化功能:
计算虚拟机的脏内存页生成率。
目前,当迁移连接了 Mellanox VF 的虚拟机时,由
virsh domjobinfo和virsh domdirtyrate-calc命令提供的实时迁移数据和统计信息不准确,因为计算只统计客户机 RAM ,而不包括连接的 VF 的影响。- 使用复制后实时迁移。
- 在虚拟机中使用虚拟 I/O 内存管理单元(vIOMMU)设备。
特定于 Mellanox CX-7 网络设备的其他限制:
具有相同 Parameter-Set Identification (PSID)和相同固件版本的 CX-7 设备必须都在源和目标主机上使用。
您可以使用以下命令检查设备的 PSID:
# mstflint -d <device_pci_address> query | grep -i PSID PSID: MT_1090111019- 在一个 CX-7 物理功能上,您可以同时使用最多 4 个 VF 来进行实时迁移。例如,您可以迁移一个连接了 4 个 VF 的虚拟机,或迁移 4 个虚拟机,其中每个虚拟机连接了一个 VF 。
先决条件
您有一个 Mellanox CX-7 网络设备,其固件版本等于或大于 28.36.1010。
有关支持的固件版本的详情,请参考 Mellanox 文档,并确保您在使用最新版本的固件。
- 主机使用 Intel 64、AMD64 或 ARM 64 CPU 架构。
- 源主机上的 Mellanox 固件版本必须与目标主机上的一样。
mstflint软件包已安装在源和目标主机上:# dnf install mstflintMellanox CX-7 网络设备的
VF_MIGRATION_MODE设置为MIGRATION_ENABLED:# mstconfig -d <device_pci_address> query | grep -i VF_migration VF_MIGRATION_MODE MIGRATION_ENABLED(2)您可以使用以下命令将
VF_MIGRATION_MODE设置为MIGRATION_ENABLED:# mstconfig -d <device_pci_address> set VF_MIGRATION_MODE=2
openvswitch软件包已安装在源和目标主机上:# dnf install openvswitch- 所有常规 SR-IOV 设备的先决条件。详情请参阅 将 SR-IOV 网络设备连接到虚拟机
- 所有常规虚拟机迁移的先决条件。详情请参阅 使用命令行迁移虚拟机
流程
在源主机上,将 Mellanox 网络设备设置为
switchdev模式。# devlink dev eswitch set pci/<device_pci_address> mode switchdev在源主机上,在 Mellanox 设备上创建一个虚拟功能。
# echo 1 > /sys/bus/pci/devices/0000\:e1\:00.0/sriov_numvfs文件路径的
/0000\:e1\:00.0/部分基于设备的 PCI 地址。在示例中,其为:0000:e1:00.0在源主机上,将 VF 与其驱动程序解绑。
# virsh nodedev-detach <vf_pci_address> --driver pci-stub您可以使用以下命令查看 VF 的 PCI 地址:
# lshw -c network -businfo Bus info Device Class Description ============================================================================= pci@0000:e1:00.0 enp225s0np0 network MT2910 Family [ConnectX-7] pci@0000:e1:00.1 enp225s0v0 network ConnectX Family mlx5Gen Virtual Function在源主机上,启用 VF 的迁移功能。
# devlink port function set pci/0000:e1:00.0/1 migratable enable在本例中,
pci/0000:e1:00.0/1指向带有给定 PCI 地址的 Mellanox 设备上的第一个 VF。在源主机上,为 VF 的迁移配置 Open vSwitch (OVS)。如果 Mellanox 设备处于
switchdev模式,则无法通过网络传输数据。确保
openvswitch服务正在运行。# systemctl start openvswitch启用硬件卸载,以提高网络性能。
# ovs-vsctl set Open_vSwitch . other_config:hw-offload=true增加最大闲置时间,以确保网络连接在迁移过程中保持打开状态。
# ovs-vsctl set Open_vSwitch . other_config:max-idle=300000在 OVS 实例中创建一个新网桥。
# ovs-vsctl add-br <bridge_name>重新启动
openvswitch服务。# systemctl restart openvswitch将物理 Mellanox 设备添加到 OVS 网桥。
# ovs-vsctl add-port <bridge_name> enp225s0np0在本例中,
enp225s0np0是 Mellanox 设备的网络接口名称。将 Mellanox 设备的 VF 添加到 OVS 网桥。
# ovs-vsctl add-port <bridge_name> enp225s0npf0vf0在本例中,
enp225s0npf0vf0是 VF 的网络接口名称。
- 在 目标主机上 重复步骤 1-5。
在源主机上,打开一个新文件,如
mlx_vf.xml,并添加以下 VF 的 XML 配置:<interface type='hostdev' managed='yes'> <mac address='52:54:00:56:8c:f7'/> <source> <address type='pci' domain='0x0000' bus='0xe1' slot='0x00' function='0x1'/> </source> </interface>这个示例将 VF 的 pass-through 配置为虚拟机的网络接口。确保 MAC 地址是唯一的,并在源主机上使用 VF 的 PCI 地址。
在源主机上,将 VF XML 文件附加到虚拟机。
# virsh attach-device <vm_name> mlx_vf.xml --live --config在本例中,
mlx_vf.xml是带有 VF 配置的 XML 文件的名称。使用--live选项将设备附加到正在运行的虚拟机上。在源主机上,启动正在运行的带有附加 VF 的虚拟机的实时迁移。
# virsh migrate --live --domain <vm_name> --desturi qemu+ssh://<destination_host_ip_address>/system有关执行实时迁移的详情,请参阅 使用命令行迁移虚拟机。
验证
在迁移的虚拟机中,查看 Mellanox VF 的网络接口名称。
# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::a00:27ff:fe4e:66a1 prefixlen 64 scopeid 0x20<link> ether 08:00:27:4e:66:a1 txqueuelen 1000 (Ethernet) RX packets 100000 bytes 6543210 (6.5 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 100000 bytes 6543210 (6.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp4s0f0v0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.10 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::a00:27ff:fe4e:66c3 prefixlen 64 scopeid 0x20<link> ether 08:00:27:4e:66:c3 txqueuelen 1000 (Ethernet) RX packets 200000 bytes 12345678 (12.3 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 200000 bytes 12345678 (12.3 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0在迁移的虚拟机中,检查 Mellanox VF 是否正常工作,例如:
# ping -I <VF_interface_name> 8.8.8.8 PING 8.8.8.8 (8.8.8.8) from 192.168.3.10 <VF_interface_name>: 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=27.4 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=26.9 ms --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 26.944/27.046/27.148/0.102 ms