$ lsinitramfs /boot/initrd.img-$(uname -r) | grep virtio
Il est possible de migrer des machines virtuelles (VM) créées dans un environnement VMware vers un environnement Openstack moyennant quelques contraintes et manipulations.
La principale contrainte repose sur les drivers "virtio" qui doivent être installés sur la VM lorsqu’elle se lance sous Openstack. Or l’installation de ces drivers peut différer d’un OS à l’autre. Ci dessous sont présentés quelques modes opératoires qui ont été testés, dans chaque cas le contexte est précisé. L’environnement d’origine est vSphere 7.0U2 et celui de destination Openstack Yoga/swift.
Dans tous les cas, il faut avoir les accès (id / mot de passe) au host esx où se trouve la VM pour pouvoir télécharger son fichier VMDK.
Liens utiles
StarWind V2V Converter : Utilitaire (Windows) de conversion de différents formats de fichiers de machines virtuelles
Drivers Virtio pour Windows (prendre le fichier ISO)
Cloudbase-init : outil d’initialisation d’une VM sous Windows (équivalent cloud-init)
S’assurer que les drivers virtio sont bien activés dans l’image de boot :
$ lsinitramfs /boot/initrd.img-$(uname -r) | grep virtio
Normalement sous Ubuntu , les drivers virtio sont déjà activés dans l’image de boot. A minima les lignes suivantes devraient être listées :
usr/lib/modules/5.15.0-43-generic/kernel/drivers/block/virtio_blk.ko
usr/lib/modules/5.15.0-43-generic/kernel/drivers/net/virtio_net.ko
usr/lib/modules/5.15.0-43-generic/kernel/drivers/scsi/virtio_scsi.ko
Arrêter la VM :
$ shutdown -h now
Télécharger le fichier VMDK de la VM depuis son datastore, soit directement avec l’interface du host esx , soit en scp si les accès ssh sont possible , ou encore avec un outil tel que Starwind V2V Converter
Convertir le fichier VMDK en fichier QCOW2 :
soit avec StarWind V2VConverter qui le fait nativement
soit sous Linux avec qemu-img :
$ qemu-img convert -p -f vmdk -O qcow2 myUbuntu.vmdk myUbuntu.qcow2
Depuis la CLI openstack , créer une image à partir du fichier qcow2
$ openstack image create --disk-format qcow2 --progress --file myUbuntu.qcow2 myUbuntu
Si la VM d’origine démarre en mode UEFI (au lieu de BIOS), ajouter l’option --property hw_firmware_type=uefi à la création de l’image (le type BIOS est la valeur par défaut).
Créer un volume bootable, ou lancer une instance directement sur l’image . Par exemple en CLI :
$ openstack volume create --bootable --size=10 --image myUbuntu myUbuntu-VOL
$ openstack server create --volume myUbuntu-VOL --network default --flavor m1.small MyUbuntuServer
La VM démarre normalement, on peut se connecter en console. Le configuration réseau doit être adaptée (voir /etc/netplan ).
(testé sous Almalinux 8.6)
Vérifier que le noyau supporte les drivers virtio. La commande :
$ grep -i virtio /boot/config-$(uname -r)
doit lister à minima : CONFIG_VIRTIO_BLK=m
Les drivers virtio ne sont pas activés dans l’image de boot. La commande :
$ lsinitrd /boot/initramfs-$(uname -r).img | grep -i virtio
ne retourne rien. Il faut alors reconstruire l’image de boot en incluant les drivers virtio :
$ mkinitrd -f --allow-missing --with=virtio_blk --preload=virtio_blk --with=virtio_net --preload=virtio_net --with=virtio_console --preload=virtio_console /boot/initramfs-$(uname -r).img $(uname -r)
La commande lsinitrd précédente doit retourner :
$ lsinitrd /boot/initramfs-$(uname -r).img | grep -i virtio
Arguments: -f --add-drivers ' virtio_blk virtio_blk virtio_net virtio_net virtio_console virtio_console
-rw-r--r-- 1 root root 9096 Apr 18 2022 usr/lib/modules/4.18.0-372.9.1.el8.x86_64/kernel/drivers/block/virtio_blk.ko.xz
-rw-r--r-- 1 root root 15008 Apr 18 2022 usr/lib/modules/4.18.0-372.9.1.el8.x86_64/kernel/drivers/char/virtio_console.ko.xz
-rw-r--r-- 1 root root 26160 Apr 18 2022 usr/lib/modules/4.18.0-372.9.1.el8.x86_64/kernel/drivers/net/virtio_net.ko.xz
Eteindre la VM :
$ shutdown -h now
Télécharger le fichier VMDK de la VM depuis son datastore, soit directement avec l’interface du host esx , soit en scp si les accès ssh sont possible , ou encore avec un outil tel que Starwind V2V converter (Windows).
Convertir le fichier VMDK en fichier QCOW2
soit avec StarWind V2VConverter qui le fait nativement
soit sous Linux avec qemu-img :
$ qemu-img convert -p -f vmdk -O qcow2 myRedhat.vmdk myRedhat.qcow2
Depuis le CLI openstack , créer une image à partir du fichier qcow2 :
$ openstack image create --disk-format qcow2 --progress --file myRedhat.qcow2 myRedhat
Si la VM d’origine démarre en mode UEFI (au lieu de BIOS), ajouter l’option --property hw_firmware_type=uefi à la création de l’image (le type BIOS est la valeur par défaut).
Lancer une instance directement à partir de l’image, ou à partir d’un nouveau volume. Par exemple en CLI :
$ openstack volume create --bootable --size=10 --image myRedhat myRedhat-VOL
$ openstack server create --volume myRedhat-VOL --network default --flavor m1.small MyRedhatServer
La VM démarre normalement, on peut se connecter en console. Le configuration réseau doit être adaptée (voir /etc/sysconfig/network-scripts ).
| Il peut être utile d’installer le package qemu-guest-agent une fois la VM transférée |
(testé sous Windows server 2019)
Avant d’être migrée sous Openstack, une VM Windows doit être "préparée". Pour cela les ressources suivantes sont nécessaires :
Les drivers Virtio pour windows sous forme d’un fichier ISO
L’utilitaire Cloudbase-init
| Avant toute modification de la VM d’origine, il est recommandé de faire une sauvegarde ou un clone de celle-ci. |
| L’étape sysprep recrée un profil Administrateur vierge , attention à sauvegarder les données de celui ci. |
Désinstaller les outils spécifiques à la platetforme d’origine (Zabbix, vmware-tools, puppet,..)
Télécharger et monter (dans notre exemple sur E:\) le fichier ISO des drivers Virtio
Via le gestionnaire de périphériques (devmgmt.msc) , installer les drivers virtio :
menu Action → add legacy hardware → manually install → parcourir le CD pour trouver la bonne version des drivers (par exemple NetKVM > 2k19 > amd64)
installer les drivers Balloon, NetKVM, qemupciserial, viorng, vioscsi, vioserial, et viostor
Il est aussi possible d’installer tous les drivers en mode silencieux avec la commande :
msiexec /i E:\virtio-win-gt-x64.msi /qr
Installer qemu-guest-agent :
E:\virtio-win-guest-tools.exe /install /quiet /norestart
Importer le fichier de registre soit par regedit, soit par la commande :
reg import virtio.reg
Installer Cloudbase-init :
laisser les options par défaut
dernière page : sélectionner Run Sysprep … et Shutdown when Sysprep terminates
Une fois la VM arrêtée, transférer son fichier VMDK et le convertir en QCOW2
Créer une image à partir du fichier QCOW2 en fixant les properties hw_disk_bus=virtio et hw_firmware_type=uefi (si non BIOS) :
$ openstack image create --progress --property hw_disk_bus=virtio --property hw_firmware_type=uefi --disk-format qcow2 --file myWindows.qcow2 myWindows
Créer un volume à partir de cette image, de type big et d’une taille au moins égale au disque d’origine (le format QCOW2 est compressé)
$ openstack volume create --type big --size 51 --image myWindows myWindows-VOL
Lancer une instance sur ce volume.
La première connexion à la console demande d’initialiser le mot de passe administrateur, un nouveau profil est créé. Mais les autres profils sont bien conservés.