wiki:virtualisation_et_emulation:qemu

QEMU, l'émulateur multi-processeurs qui permet d'exécuter des OS pour toute sorte d'Ordinateur

Logo de l'émulateur QEMU :

Sites sur QEMU

QEMU (Quick Emulator) est un émulateur de type multiplate-forme, qui est compatible avec les 3/4 des OS comme Linux, Windows, macOS, tous les BSD actuels et les systèmes UNIX en général mais encore d'autres OS. Il est installable sur ses OS étant en autres, sous architecture processeur de type x86, x64, PPC, Sparc, MIPS ou encore ARM. Par défaut QEMU est un logiciel en ligne de commande mais il existe de nombreuses interface graphique tel que AQEMU, Virt-Manager, GNOME Boxes,…, il existe aussi des interfaces Web.

QEMU permet d'émuler les jeux d'instructions de processeurs suivants : x86 , x86-64 (nommé aussi AMD64), MIPS (MIPS 32 bits ou 64 bits), ARMv7 (ARM 32 bits) , ARMv8 (ARM64 aussi appelé AArch64), PowerPC (PowerPC 32 bits ou 64 bits) RISC-V (RISC-V 32 bits ou 64 bits), SPARC (SPARC 32 bits ou 64 bits), ETRAX CRIS, MicroBlaze, AVR (Atmel AVR), Xtensa, s390x, SH-4(SuperH), OpenRISC et il y aussi les architectures du passé tel que M68k (famille Motorala 68000), Alpha, HPPA (PA-RISC), Z80, et d'autres.

QEMU n'est pas seulement un émulateur mais permet d'agir comme un logiciel de virtualisation (back-end), par exemple avec l'hyperviseur par défaut de Linux nommé KVM (Kernel-based Virtual Machine) mais il peut aussi servir de back-end pour les hyperviseurs comme Xen, HVF d'Apple, WHPX de Windows ou NVMM de NetBSD. Niveau virtualisation, QEMU peut virtualiser des environnements invités (machines virtuelles) x86, ARM, PowerPC, MIPS (32 bits seulement), Sparc, ColdFire (Motorola M68K), S3903,… Par contre, pour permettre de virtualiser un OS invité, il faut qu'il soit de la même architecture processeur que l'OS de l'ordinateur hôte, par exemple pour virtualiser un OS pour processeur de type AMD64, il faut que votre OS Hôte soit aussi un OS de type AMD64.

À l'origine QEMU a été développé par Fabrice Bellard en 2003, puis en 2006, la fondation QEMU a été créée pour pousuivre le développement avec de nombreux contributeurs externes. C'est dans les années 2008 que QEMU a été adopté par l'hyperviseur de Linux, KVM. La dernière version stable de QEMU est QEMU 9.2.0, sortie le 10 décembre 2024, QEMU est sous licence GNU GPLv2.

QEMU est un logiciel de type émulateur et virtualiseur associé à un hyperviseur comme KVM, de base, en ligne de commande. QEMU intègre différents composants en mode texte qui permettent une gestion complète de l'émulateur, ses composants sont les suivants :

  • qemu-utils qui se compose de :
    • qemu-img qui permet de manipuler les fichier de types images de média de stockage. Cet utilitaire permet en autres de créer, modifier, convertir, redimensionner, faire des snapshots des images de disque. Le format par défaut des images de disque de QEMU est .qcow2 mais il est également possible de manipuler les images de disque .vdi de VirtualBox, .vmdk de VMWare, .vhd de l'hyperviseur nommé Hyper-V de Microsoft mais aussi de simple image .img.
    • qemu-io qui permet de tester et de déboguer les opérations d'entrée/sortie (I/O) des systèmes émulés.
    • qemu-nbd permet de gérer les images de disque avec le protocole réseau nommé NBD (Network Block device). qemu-nbd permet en autres de monter des images disques via la réseau NBD.
  • qemu-efi permet d'émuler le firmware (micrologiciel) UEFI (Unified Extensible Firmware Interface) qui a remplacé le firmware traditionnel du nom de BIOS (Basic Input Output System) sur la plupart des compatibles PC et ordinateurs à base de processeur de type ARM64. Donc cet utilitaire permet de booter son OS invité en mode EFI ou UEFI qui est devenu le fimware de démarrage qui est le standard sur nos ordinateurs récents
  • qemu-system-misc comprend les émulateurs spécifique à des architectures processeur spécifiques, en autres, comme :
    • qemu-system-x86_64 pour émuler les OS invités à processeur de type x86_64 (AMD64) et x86.
    • qemu-system-aarch64 pour émuler les OS invités à processeur de type ARM64 (AArch64) ou ARMv7 (32 bits).
    • qemu-system-m68k pour émuler les OS invités à processeur de type M68k (famille Motorola 68000).
    • qemu-system-sparc64 pour émuler les OS invités à processeur de type SPARC V9 (64 bits).
    • qemu-system-sparc pour émuler les OS invités à processeur de type SPARC V7 et SPARC V8 (32 bits).
    • qemu-system-ppc64 pour émuler les OS invités à processeur de type PowerPC aussi bien 64 bits que 32 bits.
    • Voilà pour les plus courants, il y a encore une multitude de processeurs pris en charge.

Si vous sohaitez créer un disque virtuelle au format par défaut .qcow2, voici la commande :

qemu-img create -f qcow2 image_file.qcow2 4G

créée une image disque d'une taille de 4G, au format .qcow2 (vous n'êtes pas obligé de mettre .qcow2 à la fin de l'image). Puis pour avoir des infos sur l'image disque créée, tapez :

qemu-img info image_file.qcow2

vous affiche les détails de l'image disque :

image: image_file.qcow2
file format: qcow2
virtual size: 4 GiB (4294967296 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false
Avec les images disque de type .qcow2 vous pouvez, tout comme les .vdi de VirtualBox, avoir une image disque de 32 Go qui n'est pas fixe, c'est à dire, qui ne prenne que 2 Go (la taille de l'OS après installation) sur le média de stockage de votre ordinateur et qui ne grossisse qu'au fur et à mesure que vous installez des logiciels ou ajouter des fichiers à votre image disque.

L'émulation consite à simuler un OS qui n'a absolument pas la même architecture processeur que l'OS Hôte, comme par exemple émuler un OS à processeur de type ARM sur un OS Hôte à processeur de type Intel x86_64, pour se faire, sous QEMU vous utiliserez qemu-system-aarch64 et là vous émulerez la totalité du matériels (processeur (CPU), mémoire vive (RAM), carte graphique (GPU), carte réseau,…etc) de la VM (Virtual Machine et machine virtuelle en français) de l'OS invité sur votre hôte à processeur de type x86_64. En définitive vous pourez émuler toute les VM qui n'ont aucun lien avec le processeur de votre ordinateur hôte mais avec des performances médiocre comparées à la virtualisation sous QEMU grâce à KVM.

QEMU permet d'émuler les architectures processeur suivantes : x86 , x86-64 (nommé aussi AMD64), MIPS (MIPS 32 bits ou 64 bits), ARMv7 (ARM 32 bits) , ARMv8 (ARM64 aussi appelé AArch64), PowerPC (PowerPC 32 bits ou 64 bits) RISC-V (RISC-V 32 bits ou 64 bits), SPARC (SPARC 32 bits ou 64 bits), ETRAX CRIS, MicroBlaze, AVR (Atmel AVR), Xtensa, s390x, SH-4(SuperH), OpenRISC, M68k (famille Motorala 68000), Alpha, HPPA (PA-RISC), Z80, et d'autres.

Exemple d'exécution de SunOS 4.1.4 sur processeur de type Sun Sparc via ordinateur hôte avec OS sous processeur de type Intel x86-64 :

qemu-system-sparc -monitor tcp::4444,server,nowait -bios ss5.bin -m 32 -nographic -hda SunOS-4.1.4.qcow2 -net nic,id=tap0 -net tap,ifname=tap0,script=no,downscript=no

pour décortiquer la commande, qemu-system-sparc appelle l'émulateur de type SPARC (Sun4m), la option de commande -monitor permet de se connecter avec telnet via le port réseau 4444, -bios permet de spécifier le bios pour le démarrage, -m 32 alloue 32 Mo de RAM, -nographic affiche dirextement d'OS dans le terminal (ou console), -hda SunOS-4.1.4.qcow2 spécifie l'image disque sur laquelle est installé l'OS, -net nic,id=tap0 -net tap,ifname=tap0,script=no,downscript=no permet de choisir le mode de connexion (en l'occurence avec l'interface réseau tap0 qui est une interface de type bridge nommé aussi pont réseau).

QEMU a aussi le rôle de virtualiseur lorsque l'on l'associe avec l'hyperviseur nommé KVM (d'autres hyperviseurs sont compatibles avec QEMU) qui est directement intégré au noyau Linux, donc vous n'avez rien à faire sous Linux, pour utiliser le mode de virtualisation de QEMU, le seul prérequis est que l'architecture processeur simulée soit la même que celui de l'ordinateur hôte. Ainsi QEMU utilise directement le CPU, RAM, GPU,…,donc les ressrouces de l'ordinateur hôte ce qui n'est plus une émulation du matériels mais une virtualisation et de se fait les performances sont quasiment natives.
Nous allons prendre l'exemple d'un hôte linux avec processeur de type Intel x86_64 qui virtualise un OS pour Intel x86_64 ou même un Intel x86 :

qemu-system-x86_64 -m 128 -cpu 486 -hda openserver-5.0.7-x86_2003_2G.qcow2 -cdrom SCO_OpenServer_5.0.7.iso -net nic,model=pcnet,id=br0 -net user -rtc base=localtime -boot c -k fr &

l'option -boot c permet de booter l'image disque de l'OS (-boot d permettrait de booter sur le CD), -cpu 486 spécifie le processeur Intel 80486, vous pouvez également utilisez cette commande:

kvm -m 128 -cpu 486 -hda openserver-5.0.7-x86_2003_2G.qcow2 -cdrom SCO_OpenServer_5.0.7.iso -net nic,model=pcnet,id=br0 -net user -rtc base=localtime -boot c -k fr &

qui est exactement la même commande car kvm n'est qu'un lien symbolique vers qemu-system-x86_64 sur les hôte de type Intel 64 bits.

QEMU peut également être utiliser via des interfaces graphiques tel que :

  • Virt-Manager qui permet d'utiliser QEMU comme émulateur mais surtout comme hyperviseur, il fonctionne également avec les conteneurs nommé LXC mais aussi les hyperviseurs comme Xen, Bhyve,…
  • AQEMU qui utilise l'émulateur QEMU et hyperviseur KVM.
  • et encore d'autres.
Sachez que QEMU a servi de base et d'inspiration à VirtualBox, Xen-HVM, KVM, Win4Lin Pro Desktop, SerialICE, WinUAE, Unicorn, Limbo x86 PC Emulator et d'autres projet d'émulation ou virtualisation.

Vous trouverez une large documentation sur l'émulateur, dans les tutoriels sur QEMU

  • wiki/virtualisation_et_emulation/qemu.txt
  • Dernière modification : 2025/01/13 11:00
  • de Thibault Seguin