Virtualisation QEMU

Updated 24 Janvier 2020

Kernel-based Virtual Machine (KVM) est une solution de virtualisation logicielle qui prend en charge la virtualisation matérielle basée sur Intel VT (Virtualization Technology) ou AMD SVM (Secure Virtual Machine).

QEMU est un émulateur logiciel libre pour différentes plates-formes qui peut aussi fonctionner sans KVM, mais l'utilisation de la virtualisation matérielle accélère considérablement les systèmes guest. L'utilisation de KVM avec QEMU (enable-kvm) est donc la meilleure option.

A l'origine, il était développé dans le cadre du projet Linux KVM (Kernel-based Virtual Machine), qui, outre KVM lui-même (prise en charge des technologies de virtualisation matérielle des processeurs compatibles x86 au niveau du noyau Linux), consistait à développer des correctifs pour QEMU, permettant ainsi à ce dernier de bénéficier des fonctionnalités de KVM. Cependant, les développeurs de QEMU, en coopération avec leurs confrères de KVM, ont décidé d'intégrer la prise en charge de KVM dans la version principale de QEMU.

KVM vous permet de faire tourner plusieurs machines virtuelles sans avoir à modifier l'image Linux ou Windows existantes. Chaque machine virtuelle a son propre environnement privé dans lequel elle fonctionne, y compris une carte réseau, un lecteur, une carte vidéo, etc.

Ce noyau Linux supporte KVM depuis la version 2.6.20.

libvirt est une interface et un démon qui assure la gestion de diverses machines virtuelles (qemu/kvm, xen, virtualbox). Il permet de configurer et de contrôler sans effort une machine virtuelle. Elle fournit également une variété d'outils de gestion tiers, d'interfaces web, etc. Ainsi, nous recommandons virt-manager, une interface graphique de gestion de machines virtuelles.

virt-manager

Installer les paquets nécessaires

Par défaut, QEMU prend en charge les architectures i386 et x86_64. Modifiez les drapeaux pour en supporter d'autres. Par exemple, si vous avez besoin que arm soit pris en charge :

/etc/portage/make.conf/custom
QEMU_SOFTMMU_TARGETS="arm i386 x86_64"

Installez QEMU et libvirt :

emerge -a app-emulation/qemu app-emulation/libvirt

Configurer QEMU

Modifiez le fichier de configuration :

/etc/libvirt/qemu.conf
# Allows VNC to listen everywhere
vnc_listen = "0.0.0.0"

# Disable TLS (if virtual machines are not being used for testing, to enable and setup TLS is preferable)
vnc_tls = 0

# Default password for VNC, to be used if the virtual machine has no password of its own
vnc_password = "XYZ12345"

# User that will start QEMU
user = "root"

# Group that will start QEMU
group = "root"

# Saving and dumping format. Using gzip or other compression will reduce the space required for images, but also increase the time needed to save them.
save_image_format = "gzip"
dump_image_format = "gzip"

Lancez le démon libvirt et ajoutez-le au démarrage automatique :

/etc/init.d/libvirtd start

rc-update add libvirtd

Vous aurez également besoin des modules tun et vhost_net pour le réseau virtuel. Chargez les modules nécessaires :

modprobe -a tun vhost_net

...et mettez-les sur la liste de démarrage automatique :

/etc/modules-load.d/qemu.conf
tun
vhost_net

Créer une machine virtuelle

Commencez par créer une image sur votre disque dur. Par défaut, c'est à échelonnement dynamique :

qemu-img create -f qcow2 /var/calculate/vbox/hdd.qcow2 20G

Si vous affectez tout l'espace à un seul volume, la machine virtuelle fonctionnera plus rapidement, car elle n'aura pas besoin de passer d'un espace à l'autre au moment de l'opération. Créez cette image en exécutant :

qemu-img create -f qcow2 -o preallocation=metadata hdd.qcow2 20G

Voici donc un exemple de configuration :

testkvm.xml
<domain type='kvm' id='1'>
  <features><acpi/></features>
  <name>testkvm</name>
  <description>Description of server</description>
  <memory unit='KiB'>1048576</memory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-1.3'>hvm</type>
    <boot dev='cdrom' />
    <boot dev='hd' />
    <bootmenu enable='yes'/>
  </os>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
      <source file='/var/calculate/vbox/hdd.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/var/calculate/linux/css-18.12-x86_64.iso '/>
      <target dev='vdd' bus='virtio'/>
      <readonly/>
    </disk>
    <interface type='network'>
      <source network='default'/>
    </interface>
    <graphics type='vnc' port='5910' autoport='no'>
      <listen type='address'/>
    </graphics>
  </devices>
</domain>

La configuration suivante est utilisée dans l'exemple ci-dessus :

  • 1Go de mémoire vive
  • processeur à un coeur
  • système 64 bits
  • Calculate Scratch Server 18.12 à installer
  • un serveur VNC sur le port 5910

Pour plus d'informations sur le fichier de configuration de la machine virtuelle, voir [ici] (http://libvirt.org/formatdomain.html).

Ajouter une machine, en fonction de la configuration :

virsh define testkvm.xml

Pour lancer la machine, exécutez la commande suivante :

virsh start testkvm

Pour arrêter l'ordinateur, faites ceci :

virsh destroy testkvm

C'est un arrêt d'urgence, comme si on coupait l'électricité.

La prise en charge de l'ACPI doit être réalisée sur la machine guest pour permettre un arrêt et un redémarrage normaux. Si vous utilisez un système Calculate Linux en tant que machine guest, vous pouvez procéder comme suit :

emerge -a sys-power/acpid

rc-update add acpid boot

Pour activer le démarrage automatique de la machine guest au démarrage du démon libvirt, exécutez :

virsh autostart testkvm

Pour désactiver le mode de démarrage automatique, exécutez :

virsh autostart --disable testkvm

Pour démarrer une machine virtuelle sans libvirt, exécutez :

qemu-system-x86_64 -name calculate -cpu host -smp 4 -enable-kvm -localtime -m 2048 -no-fd-bootchk -net nic,model=virtio,vlan=0 -net user,vlan=0 -drive file=hdd.img,index=0,media=disk,if=virtio -drive file=/mnt/iso/cldx-20150224-i686.iso,media=cdrom -monitor telnet:0.0.0.0:4008,server,nowait -spice port=5901,disable-ticketing -vga qxl -usb

Travailler avec un dispositif Virtio

Si un lecteur virtuel et une carte réseau classiques sont utilisés, le système fonctionne comme décrit ci-dessous. Le système guest est fourni avec des copies d'équipement réels. Sur le système guest, les pilotes de périphériques convertissent les requêtes de haut niveau en requêtes de bas niveau, le système virtuel les intercepte, les reconvertit en requêtes de haut niveau pour les transmettre aux pilotes du système hôte. L'utilisation de dispositifs Virtio permet de raccourcir la chaîne. Les pilotes Virtio n'effectuent aucune conversion, ils ne font que transmettre des requêtes de haut niveau directement au système hôte, ce qui contribue à accélérer la machine virtuelle.

Commandes de changement de disque

Syntaxe générale :

change-media [HTML_REMOVED] [HTML_REMOVED] [[HTML_REMOVED]] [--eject] [--insert] [--update] [--current] [--live] [--config] [--force]

Pour "insérer" l'image disc.iso dans le lecteur virtuel, exécutez :

change-media guest01 vdd disc.iso

Pour supprimer l'image du disque virtuel, exécutez :

change-media guest01 vdd --eject

Configuration réseau

Les paramètres de base correspondent par défaut à un réseau virtuel qui n'est pas accessible de l'extérieur. L'accès par IP peut être obtenu sur un ordinateur équipé de QEMU. De l'intérieur, l'accès se fait par NAT.

Voici les configurations réseau possibles :

  • L'option par défaut est "NAT Based". Un réseau interne fournit un accès à un réseau externe avec NAT appliqué automatiquement. L'exemple de configuration ci-dessus repose sur cette option.
  • Routed est similaire au cas précédent, puisqu'il s'agit d'un réseau interne qui fournit un accès au réseau externe, mais sans NAT. Il implique qu'une configuration supplémentaire des tables de routage soit effectuée dans le réseau externe.
  • Réseau IPv4/IPv6 isolé.
  • Une connexion en pont. Elle permet de mettre en œuvre diverses configurations, y compris pour attribuer des adresses IP dans un réseau réel.
  • Une carte réseau PCI redirigée de la machine hôte vers la machine invitée.

Pour de plus amples informations sur la configuration du réseau, n'hésitez pas à consulter les liens suivants :