Sommaire
Comme je n'avais pas trouvé mon bonheur en cherchant des informations sur le sujet, j'ai regroupé ici mes notes sur l'exécution de machines virtuelles KVM avec QEMU sur ARMv8 (64 bits) et CentOS 7.
On trouve majoritairement des infos pour travailler avec Ubuntu (principalement car Ubuntu proposait quelque chose qui fonctionnait sur ARM bien plus tôt que Redhat/CentOS). Mais ces docs n'étaient pas claires à mes yeux.
Il y 3 infos importantes à connaître :
- il faut utiliser UEFI
- certains devices ne se déclarent pas de la même façon
- et on ne croule pas sous les images disques toutes prêtes ;)
QEMU
QEMU supporte ARM v8 depuis déjà un bon moment. Des améliorations au support de l'architecture sont cependant ajoutées régulièrement.
Fedora fournit des RPMS (http://koji.fedoraproject.org/koji/packageinfo?packageID=3685) pour les versions récentes de QEMU. Ils sont (assez) facilement recompilables sur CentOS 7.
UEFI
Il est possible de démarrer des machines virtuelles ARMv8 en spécifiant directement un chemin pour un kernel et un initrd (-kernel
et -initrd
). Mais si vous souhaitez simplement utiliser une image disque avec GRUB et gérer le noyau dans le système, comme sur une machine physique, il est obligatoire d'utiliser UEFI. Des ROM UEFI pour ARMv8 sont développées et maintenues par le projet TianoCore à travers la plateforme EDK2.
kraxel fournit des RPMs de ces ROM recompilés régulièrement : https://www.kraxel.org/repos/jenkins/edk2/
Il y a 2 fichiers importants :
-
/usr/share/edk2.git/aarch64/QEMU_EFI.fd
: La ROM UEFI -
/usr/share/edk2.git/aarch64/QEMU_VARS.fd
: La configuration du BIOS.
Il faut noter que ces ROMs doivent faire exactement 64 Mo. Il est facile de les recopier dans un fichier plus grand (avec dd
par exemple). Le RPM fournit des versions préparées de ces fichiers :
/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw
/usr/share/edk2.git/aarch64/vars-template-pflash.raw
Image
CentOS fournit une image disque RAW bootable pour aarch64, mise à jour régulièrement. Malheureusement, elle n'est pas prévue pour un environnement cloud et n'utilise pas cloud-image. La documentation sur l'utilisation de l'image est dispo là : http://mirror.centos.org/altarch/7/isos/aarch64/ReadMe.txt
Exécution de QEMU
Machine KVM
En activant KVM, vous pourrez obtenir des performances bien meilleures qu'en mode émulation. Il faut utiliser la machine virt
(QEMU 2.6 ARM Virtual Machine)
qemu-system-aarch64 -enable-kvm -machine virt -cpu host
netdev
Il n'y a pas (encore?) de support de PCI pour ARMv8 dans QEMU. Pour utiliser une interface netdev, il faut la déclarer différemment que pour x86_64 :
-netdev user,id=hostnet0,hostfwd=tcp::2345-:22 -device virtio-net-device,netdev=hostnet0
UEFI
La machine virt
de QEMU aarch64 émule 2 devices pflash de 64Mo. Le premier sert à accéder à la ROM UEFI, le second sera utilisé pour enregistrer les paramètres UEFI. Ils peuvent être utilisés simplement avec l'option -pflash FILE
. Cette option configure le device en mode read/write, ce qui n'est pas souhaitable pour la partie firmware UEFI, et de plus QEMU n'aime pas avoir à autodétecter le type de fichier RAW. Il est donc préférable de lui donner tous les paramètres explicitement (spécifier le flag readonly permet d'utiliser directement le fichier UEFI dans /usr/share
. Sans ce flag, QEMU chercherait à ouvrir le fichier en écriture et n'aurait pas les permissions pour le faire).
Au préalable copiez le template dans un emplacement où vous pourrez le modifier :
$ cp /usr/share/edk2.git/aarch64/vars-template-pflash.raw ./qemu-my_vars.raw
Puis les options pour qemu :
-drive if=pflash,format=raw,readonly,file=/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw \
-drive if=pflash,format=raw,file=qemu-my_vars.raw
Premier boot: Configurer UEFI
Lors du premier démarrage, UEFI déroulera un compte à rebours et affichera un prompt. Il faut déclarer manuellement l'entrée dans EFI shell pour pouvoir booter sur l'image CentOS. Ceci n'est à faire qu'au premier démarrage. L'information sera sauvegardée dans la flash qemu-my_vars.raw
.
Shell> bcfg boot add 1 fs0:\EFI\centos\grubaa64.efi "CentOS (GRUB)"
Shell> exit
Au prochain reboot, Grub démarrera de suite.
Commande complète
Les autres options de QEMU réservent moins de surprise. Un exemple simple :
$ qemu-system-aarch64 -enable-kvm -machine virt -cpu host \
-netdev user,id=hostnet0,hostfwd=tcp::2345-:22 -device virtio-net-device,netdev=hostnet0 \
-drive if=pflash,format=raw,readonly,file=/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw \
-drive if=pflash,format=raw,file=qemu-my_vars.raw \
-drive file=CentOS-7-aarch64.img,if=virtio,format=raw,cache=none \
-m 512 -nographic
URLs
- https://wiki.ubuntu.com/ARM64/QEMU
- http://rzycki.blogspot.fr/2014/08/using-qemu-to-run-ubuntu-arm-64-bit.html
- https://wiki.archlinux.org/index.php/GRUB/EFI_examples
Contexte
Ces tests ont été réalisés dans l'environnement de R&D HPC du CEA. Ils prennent place dans le cadre de notre veille technologique. Pour en savoir plus sur ces activités :
- Développements systèmes : https://github.com/cea-hpc/
- Le HPC au CEA en général : http://www-hpc.cea.fr/
- Et on recrute ! http://www-hpc.cea.fr/fr/recrutements.htm (Informatique scientifique)
# Merci de ce retour d'experience
Posté par NeoX . Évalué à 7.
meme si je n'en ai pas encore l'utilité, c'est clair, precis.
ca donnerait presque envie d'essayer.
Merci
[^] # Re: Merci de ce retour d'experience
Posté par Degrémont Aurélien . Évalué à 4. Dernière modification le 03 août 2016 à 21:51.
Merci. Sous Fedora, ça devrait être presque plus simple.
Pour jouer avec, sur architecture x86_64, vous pouvez utiliser le mode émulation, il suffit d'utiliser
Avec Ubuntu (car pas mal de monde l'utilise :)) si c'est simplement pour jouer, j'ai trouvé cette image busybox toute prête (à utiliser avec parcimonie, on ne sait pas vraiment ce qu'il y a dedans)
Pour aller plus loin, je vous renvoie vers les docs qu'on trouve facilement sur Internet
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.