12.8. Mellanox Virtual Function が割り当てられた仮想マシンのライブマイグレーション
テクノロジープレビューとして、Mellanox ネットワークデバイスの Virtual Function (VF) が割り当てられた仮想マシン (VM) のライブマイグレーションを利用できます。現在、これは Mellanox CX-7 ネットワークデバイスを使用している場合にのみ可能です。Mellanox CX-7 ネットワークデバイス上の VF は、ライブマイグレーションに必要な機能を追加する新しい mlx5_vfio_pci
ドライバーを使用します。この新しいドライバーは、libvirt
によって VF に自動的にバインドされます。
制限事項
現在、Mellanox Virtual Function が割り当てられた仮想マシンをライブマイグレーションする場合、以下の仮想化機能を使用できません。
- 仮想マシンのダーティーメモリーページレート生成の計算
- コピー後のライブマイグレーションの使用
- 仮想マシンでの仮想 I/O Memory Management Unit (vIOMMU) デバイスの使用
この機能は RHEL 9 に テクノロジープレビュー のみの機能として組み込まれているため、サポート対象外です。
前提条件
ファームウェアバージョンが 28.36.1010 以上の Mellanox CX-7 ネットワークデバイスを使用している。
ファームウェアバージョンの詳細は、Mellanox のドキュメント を参照してください。
mstflint
パッケージが、ソースホストと宛先ホストの両方にインストールされている。# dnf install mstflint
Mellanox 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
ホストの CPU およびファームウェアは、IOMMU (I/O Memory Management Unit) に対応している。
- Intel CPU を使用している場合は、Intel VT-d (Virtualization Technology for Directed I/O) に対応する必要があります。
- AMD CPU を使用している場合は、AMD-Vi 機能に対応している必要があります。
ホストシステムが、アクセス制御サービス (ACS) を使用して PCIe トポロジーの DMA (Direct Memory Access) 分離を提供している。この点をシステムベンダーに確認してください。
詳細は、SR-IOV 実装に関するハードウェアの考慮事項 を参照してください。
VF の作成に使用するホストのネットワークインターフェイスが実行中である。たとえば、eth1 インターフェイスをアクティブにして実行中であることを確認するには、次のコマンドを使用します。
# ip link set eth1 up # ip link show eth1 8: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000 link/ether a0:36:9f:8f:3f:b8 brd ff:ff:ff:ff:ff:ff vf 0 MAC 00:00:00:00:00:00, spoof checking on, link-state auto vf 1 MAC 00:00:00:00:00:00, spoof checking on, link-state auto vf 2 MAC 00:00:00:00:00:00, spoof checking on, link-state auto vf 3 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
SR-IOV デバイス割り当てを有効にするには、ホスト BIOS およびカーネルで IOMMU 機能を有効にする必要があります。これを行うには、以下を行います。
Intel ホストで、Intel Virtualization Technology for Directed I/O (VT-d) を有効にします。
intel_iommu=on
およびiommu=pt
パラメーターを使用して GRUB 設定を再生成します。# grubby --args="intel_iommu=on iommu=pt" --update-kernel=ALL
- ホストを再起動します。
AMD ホストで、AMD-Vi を有効にします。
iommu=pt
パラメーターで GRUB 設定を再生成します。# grubby --args="iommu=pt" --update-kernel=ALL
- ホストを再起動します。
- 移行元ホストと移行先ホストはいずれも KVM ハイパーバイザーを使用します。
-
移行元ホストと移行先のホストは、ネットワーク経由で相互に通信できなければなりません。
ping
ユーティリティーを使用してこれを確認します。 宛先ホストで次のポートが開いている。
- ポート 22 は、SSH を使用して宛先ホストに接続するために必要です。
- ポート 16509 は、TLS を使用して宛先ホストに接続するために必要です。
- ポート 16514 は、TCP を使用して宛先ホストに接続するために必要です。
- ポート 49152 - 49215 は、QEMU がメモリーおよびディスク移行データを転送するために必要です。
- ソースホストと宛先ホストが、移行可能なオペレーティングシステムとマシンタイプを使用している。これを確認するには、Supported hosts for virtual machine migration を参照してください。
- 仮想マシンは、移行先ホストの CPU 機能と互換性がある必要があります。これを確認するには、仮想マシン移行のホスト CPU の互換性の確認 を参照してください。
移行する仮想マシンのディスクイメージが、ソースホストと宛先ホストの両方にアクセスできる別のネットワーク上の場所にある。オフラインマイグレーションの場合は任意ですが、実行中の仮想マシンの移行に必要になります。
このような仮想マシンの共有ストレージを設定する手順は、Sharing virtual machine disk images with other hosts を参照してください。
- 仮想マシンの実行中に移行する場合は、ネットワークの帯域幅が、仮想マシンがダーティーメモリーページを生成する速度を超える必要があります。
接続プロトコルに対応する仮想ネットワークソケットが有効になっている。
VM 移行を実行する場合、ソースホスト上の
virsh
クライアントは、いくつかのプロトコルの 1 つを使用して、宛先ホスト上の libvirt デーモンに接続できます。次の手順の例では SSH 接続を使用していますが、別の接続を選択することもできます。** libvirt で SSH 接続を使用する場合は、宛先ホストでvirtqemud
ソケットが有効になっていて実行中であることを確認してください。+
# systemctl enable --now virtqemud.socket
libvirt で TLS 接続を使用する場合は、
virtproxyd-tls
ソケットが有効になっていて、宛先ホストで実行していることを確認してください。# systemctl enable --now virtproxyd-tls.socket
libvirt で TCP 接続を使用する場合は、
virtproxyd-tcp
ソケットが有効になっていて、宛先ホストで実行していることを確認してください。# systemctl enable --now virtproxyd-tcp.socket
手順
ソースホストで、Mellanox ネットワークデバイスを
switchdev
モードに設定します。# devlink dev eswitch set pci/<device_pci_address> mode switchdev
ソースホストで、Mellanox デバイス上に Virtual Function を作成します。
# 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
この例では、
<bridge_name>
はステップ d で作成したブリッジの名前であり、enp225s0np0
は Mellanox デバイスのネットワークインターフェイス名です。Mellanox デバイスの VF を OVS ブリッジに追加します。
# ovs-vsctl add-port <bridge_name> enp225s0npf0vf0
この例では、
<bridge_name>
はステップ d で作成したブリッジの名前であり、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 のパススルーを仮想マシンのネットワークインターフェイスとして設定します。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