Journal Machines virtuelles ARM 64bits et CentOS 7

Posté par . Licence CC by-sa
Tags :
38
3
août
2016

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

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 :

  • # Merci de ce retour d'experience

    Posté par . É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 . Évalué à 4. Dernière modification le 03/08/16 à 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

      $ qemu-system-aarch64 -machine virt -cpu cortex-a57 ...
      

      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)

      $ sudo apt-get install qemu-system-arm
      $ wget http://people.linaro.org/~alex.bennee/images/aarch64-linux-3.15rc2-buildroot.img
      $ qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -m 512 -kernel aarch64-linux-3.15rc2-buildroot.img  --append "console=ttyAMA0"
      
      ...
      ...
      [    2.190103] Freeing unused kernel memory: 16540K (ffffffc0005cf000 - ffffffc0015f6000)
      Starting logging: OK
      Initializing random number generator... [    2.753972] random: dd urandom read with 1 bits of entropy available
      done.
      Starting network...
      
      Welcome to Buildroot
      buildroot login: root
      # uname -m
      aarch64
      
      (pour quitter QEMU)
      Ctrl-A x
      # QEMU: Terminated
      
      

      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 à ceux qui les ont postés. Nous n'en sommes pas responsables.