12.8. Migration en direct d'une machine virtuelle avec une fonction virtuelle Mellanox attachée
En tant qu'aperçu technologique, vous pouvez migrer en direct une machine virtuelle (VM) avec une fonction virtuelle (VF) attachée à un dispositif de mise en réseau Mellanox. Actuellement, cela n'est possible qu'en utilisant un dispositif de mise en réseau Mellanox CX-7. Le VF sur le périphérique de mise en réseau Mellanox CX-7 utilise un nouveau pilote mlx5_vfio_pci
, qui ajoute des fonctionnalités nécessaires à la migration en direct, et libvirt
lie automatiquement le nouveau pilote au VF.
Limites
Actuellement, certaines fonctions de virtualisation ne peuvent pas être utilisées lors de la migration en direct d'une VM à laquelle est attachée une fonction virtuelle Mellanox :
- Calcul du taux de génération de pages de mémoire sale de la VM.
- Utilisation d'une migration post-copie en direct.
- Utilisation d'une unité virtuelle de gestion de la mémoire d'E/S (vIOMMU) dans la VM.
Cette fonctionnalité n'est incluse dans RHEL 9 qu'en tant qu'aperçu technologique, ce qui signifie qu'elle n'est pas prise en charge.
Conditions préalables
Vous avez un périphérique réseau Mellanox CX-7 dont la version du micrologiciel est égale ou supérieure à 28.36.1010.
Reportez-vous à la documentation de Mellanox pour plus de détails sur les versions du micrologiciel.
Le paquetage
mstflint
est installé à la fois sur l'hôte source et sur l'hôte de destination :# dnf install mstflint
Le périphérique de mise en réseau Mellanox CX-7 a pour adresse
VF_MIGRATION_MODE
MIGRATION_ENABLED
:# mstconfig -d <device_pci_address> query | grep -i VF_migration VF_MIGRATION_MODE MIGRATION_ENABLED(2)
Vous pouvez remplacer
VF_MIGRATION_MODE
parMIGRATION_ENABLED
à l'aide de la commande suivante :# mstconfig -d <device_pci_address> set VF_MIGRATION_MODE=2
Le paquetage
openvswitch
est installé à la fois sur l'hôte source et sur l'hôte de destination :# dnf install openvswitch
L'unité centrale et le micrologiciel de votre hôte prennent en charge l'unité de gestion de la mémoire d'E/S (IOMMU).
- Si vous utilisez un processeur Intel, il doit supporter la technologie de virtualisation Intel pour Directed I/O (VT-d).
- Si vous utilisez un processeur AMD, il doit prendre en charge la fonction AMD-Vi.
Le système hôte utilise le service de contrôle d'accès (ACS) pour assurer l'isolation de l'accès direct à la mémoire (DMA) pour la topologie PCIe. Vérifiez ce point auprès du fournisseur du système.
Pour plus d'informations, voir Considérations matérielles pour l'implémentation du SR-IOV.
L'interface réseau hôte que vous souhaitez utiliser pour créer des VF est en cours d'exécution. Par exemple, pour activer l'interface eth1 et vérifier qu'elle fonctionne, utilisez les commandes suivantes :
# 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
Pour que l'attribution de périphériques SR-IOV fonctionne, la fonction IOMMU doit être activée dans le BIOS et le noyau de l'hôte. Pour ce faire, il faut
Sur un hôte Intel, activez la technologie de virtualisation Intel pour Directed I/O (VT-d) :
Régénérer la configuration GRUB avec les paramètres
intel_iommu=on
etiommu=pt
:# grubby --args="intel_iommu=on iommu=pt" --update-kernel=ALL
- Redémarrer l'hôte.
Sur un hôte AMD, activez AMD-Vi :
Régénérer la configuration GRUB avec le paramètre
iommu=pt
:# grubby --args="iommu=pt" --update-kernel=ALL
- Redémarrer l'hôte.
- L'hôte source et l'hôte de destination utilisent tous deux l'hyperviseur KVM.
-
L'hôte source et l'hôte de destination sont en mesure de se joindre l'un l'autre sur le réseau. Utilisez l'utilitaire
ping
pour le vérifier. Les ports suivants sont ouverts sur l'hôte de destination.
- Le port 22 est nécessaire pour se connecter à l'hôte de destination en utilisant SSH.
- Le port 16509 est nécessaire pour se connecter à l'hôte de destination en utilisant TLS.
- Le port 16514 est nécessaire pour se connecter à l'hôte de destination en utilisant TCP.
- Les ports 49152-49215 sont nécessaires à QEMU pour transférer les données de migration de la mémoire et du disque.
- L'hôte source et l'hôte de destination utilisent des systèmes d'exploitation et des types de machines qui autorisent la migration. Pour s'en assurer, voir Hôtes pris en charge pour la migration des machines virtuelles.
- La machine virtuelle doit être compatible avec les caractéristiques du processeur de l'hôte de destination. Pour s'en assurer, voir Vérification de la compatibilité du CPU de l'hôte pour la migration de la machine virtuelle.
Les images de disque des machines virtuelles qui seront migrées sont situées sur un emplacement réseau distinct accessible à la fois à l'hôte source et à l'hôte de destination. Cette opération est facultative pour la migration hors ligne, mais obligatoire pour la migration d'une VM en cours d'exécution.
Pour obtenir des instructions sur la configuration d'un tel stockage partagé de VM, voir Partage d'images de disques de machines virtuelles avec d'autres hôtes.
- Lors de la migration d'une VM en cours d'exécution, la bande passante de votre réseau doit être supérieure à la vitesse à laquelle la VM génère des pages de mémoire sale.
Une prise réseau virtuelle correspondant au protocole de connexion est activée.
When performing a VM migration, the
virsh
client on the source host can use one of several protocols to connect to the libvirt daemon on the destination host. Examples in the following procedure use an SSH connection, but you can choose a different one. ** If you want libvirt to use an SSH connection, ensure that thevirtqemud
socket is enabled and running on the destination host.# systemctl enable --now virtqemud.socket
Si vous souhaitez que libvirt utilise une connexion TLS, assurez-vous que le socket
virtproxyd-tls
est activé et fonctionne sur l'hôte de destination.# systemctl enable --now virtproxyd-tls.socket
Si vous souhaitez que libvirt utilise une connexion TCP, assurez-vous que le socket
virtproxyd-tcp
est activé et fonctionne sur l'hôte de destination.# systemctl enable --now virtproxyd-tcp.socket
Procédure
Sur l'hôte source, configurez le périphérique réseau Mellanox en mode
switchdev
.# devlink dev eswitch set pci/<device_pci_address> mode switchdev
Sur l'hôte source, créez une fonction virtuelle sur le dispositif Mellanox.
# echo 1 > /sys/bus/pci/devices/0000\:e1\:00.0/sriov_numvfs
La partie
/0000\:e1\:00.0/
du chemin d'accès au fichier est basée sur l'adresse PCI de l'appareil. Dans l'exemple, il s'agit de :0000:e1:00.0
Sur l'hôte source, détachez le VF de son pilote.
# virsh nodedev-detach <vf_pci_address> --driver pci-stub
Vous pouvez afficher l'adresse PCI du VF à l'aide de la commande suivante :
# 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
Sur l'hôte source, activez la fonction de migration du VF.
# devlink port function set pci/0000:e1:00.0/1 migratable enable
Dans cet exemple,
pci/0000:e1:00.0/1
fait référence au premier VF sur le périphérique Mellanox avec l'adresse PCI donnée.Sur l'hôte source, configurez Open vSwitch (OVS) pour la migration du VF. Si le périphérique Mellanox est en mode
switchdev
, il ne peut pas transférer de données sur le réseau.Assurez-vous que le service
openvswitch
est en cours d'exécution.# systemctl start openvswitch
Activer le délestage matériel pour améliorer les performances du réseau.
# ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
Augmentez la durée maximale d'inactivité pour vous assurer que les connexions réseau restent ouvertes pendant la migration.
# ovs-vsctl set Open_vSwitch . other_config:max-idle=300000
Créer un nouveau pont dans l'instance OVS.
# ovs-vsctl add-br <bridge_name>
Redémarrez le service
openvswitch
.# systemctl restart openvswitch
Ajoutez l'appareil physique Mellanox au pont OVS.
# ovs-vsctl add-port <bridge_name> enp225s0np0
Dans cet exemple,
<bridge_name>
est le nom du pont que vous avez créé à l'étape d etenp225s0np0
est le nom de l'interface réseau du périphérique Mellanox.Ajouter le VF de l'appareil Mellanox au pont OVS.
# ovs-vsctl add-port <bridge_name> enp225s0npf0vf0
Dans cet exemple,
<bridge_name>
est le nom du pont que vous avez créé à l'étape d etenp225s0npf0vf0
est le nom de l'interface réseau du VF.
- Répétez les étapes 1 à 5 sur le site destination host.
Sur l'hôte source, ouvrez un nouveau fichier, tel que
mlx_vf.xml
, et ajoutez la configuration XML suivante du VF :<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>
Cet exemple configure un passage du VF en tant qu'interface réseau pour la VM. Assurez-vous que l'adresse MAC est unique et utilisez l'adresse PCI du VF sur l'hôte source.
Sur l'hôte source, attachez le fichier XML VF à la VM.
# virsh attach-device <vm_name> mlx_vf.xml --live --config
Dans cet exemple,
mlx_vf.xml
est le nom du fichier XML contenant la configuration du VF. Utilisez l'option--live
pour attacher le périphérique à une VM en cours d'exécution.Sur l'hôte source, démarrez la migration en direct de la VM en cours d'exécution avec le VF joint.
# virsh migrate --live --domain <vm_name> --desturi qemu ssh://<destination_host_ip_address>/system
Vérification
Dans la VM migrée, affichez le nom de l'interface réseau du VF Mellanox.
# 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
Dans la VM migrée, vérifiez que le VF Mellanox fonctionne, par exemple :
# 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