La virtualisation facile sur Linux avec Virtmanager et Qemu/KVM

Avoir plusieurs systèmes d’exploitation sur une même machine a longtemps été un peu galère, il fallait faire un multiboot et si par malheur on devait réinstaller windows, celui-ci écrasait le loader permettant de sélectionner le système au démarrage (souvent Grub ou Lilo)  et il fallait le réinstaller à la main, mais cette époque est maintenant révolue grâce à la virtualisation.

Avec les nouveaux processeurs pourvus d’instruction dédiées à la virtualisation, la surcharge (overhead) est devenu minime, de plus comme la virtualisation a clairement le vent en poupe les constructeurs de processeurs ajoutent sans cesse des nouvelles technologies permettant d’optimiser les performances des systèmes virtualisés et minimiser l’impact sur les systèmes hôtes.

Prérequis

– Avoir un système Linux à jour.

– Avoir un processeur ayant des instructions de virtualisation. Pour savoir si c’est le cas il y a deux solutions : Aller voir sur le site du constructeur de votre CPU si votre modèle dispose de la technologie (Virtualization Technology (VT-x) pour Intel et AMD Virtualization (AMD-V™) pour AMD). Ou lancer dans un terminal la commande

lscpu

Qui doit répondre quelque chose comme

Architecture :                          x86_64
Mode(s) opératoire(s) des processeurs : 32-bit, 64-bit
Boutisme :                              Little Endian
Tailles des adresses:                   43 bits physical, 48 bits virtual
Processeur(s) :                         16
Liste de processeur(s) en ligne :       0-15
Thread(s) par cœur :                    2
Cœur(s) par socket :                    8
Socket(s) :                             1
Nœud(s) NUMA :                          1
Identifiant constructeur :              AuthenticAMD
Famille de processeur :                 23
Modèle :                                1
Nom de modèle :                         AMD Ryzen 7 1700X Eight-Core Processor
Révision :                              1
Vitesse du processeur en MHz :          2194.500
Vitesse maximale du processeur en MHz : 3775,0000
Vitesse minimale du processeur en MHz : 2200,0000
BogoMIPS :                              7535.57
Virtualisation :                        AMD-V
Cache L1d :                             32K
Cache L1i :                             64K
Cache L2 :                              512K
Cache L3 :                              8192K
Nœud NUMA 0 de processeur(s) :          0-15
Drapaux :                               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate sme ssbd sev ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca

Là soit on regarde la section « Virtualisation » soit on regarde la section « Drapaux » (oui il manque un « e » ce sera sûrement corrigé dans une prochaine version de lscpu 🙂 ) le drapeau indiquant la présence d’instruction de virtualisation est vmx pour Intel et svm pour AMD.

– Ensuite il faut que la fonction de virtualisation soit activée dans le BIOS/EFI car ce n’est souvent pas le cas par défaut. Donc il faut aller vérifier, voici 2 exemples pour donner une idée de à quoi cela peut ressembler :

Activation de la virtualisation AMD

 

Activation de la virtualisation Intel

Installation

Une fois que tout est opérationnel au niveau du matériel, passons au logiciel. Ici nous allons nous intéresser à KVM, le système de virtualisation basé sur la petite perle logicielle nommée Qemu.

Sur Debian (et ses dérivés) le plus simple est d’installer directement le paquet virt-manager il installera KVM/Qemu et toutes les dépendances qu’il faut

sudo apt install virt-manager

Utilisation

Lancement de virt-manager

Pour le lancer on peut soit le trouver dans le menu, chez moi c’est dans les outils système.

virt-manager via le menu

Soit faire Alt+F2 puis entrer « virt- » et choisir « Gestionnaire de machines virtuelles » comme sur l’image ci-dessous.

Virt-manager via le lanceur Alt+F2

Vous entrez votre mot de passe sudo (vous devez être sudoer) et vous vous retrouvez sur la magnifiquement minimaliste interface suivante (et encore chez vous il ne devrait même pas y avoir de VM)

interface virt-manager

Ici on voit que j’ai une machine virtuelle (VM) nommée « comptible » et qui est actuellement éteinte

Créer une nouvelle VM

Pour cet exemple on va faire une machine virtuelle avec une distribution Linux que j’aime bien : Linux Mint. Donc on télécharge une image iso sur leur site puis on clic sur la première icône à gauche puis on sélectionne image ISO

Type d’installation

L’écran suivant est celui dans lequel on gère les pools, c’est à dire tout simplement des chemins dans lesquels vous serez amené à aller souvent pour chercher des fichiers. Alors à ce stade, soit vous décidez de créer un pool soit vous faîtes « Parcourir en local » pour sélectionner l’ISO que vous voulez installer.

Volumes de stockage virt-manager

Ensuite on sélectionne l’image précédemment téléchargée et on choisi le système, si celui n’est pas détecté automatiquement vous pouvez mettre Generic

Choix de l’ISO et de l’OS

Puis il faut sélectionner la quantité de mémoire RAM et le nombre de CPU qui seront alloués à la VM. Dans mon cas c’est juste un test donc je mets des petites valeurs, mais si vous projetez de jouer ou utiliser des logiciels gourmands dans la machine virtuelle alors là il faut augmenter les valeurs. Par contre il faut toujours laisser un peu de RAM et au moins 1 CPU pour le système hôte, c’est à dire il ne faut pas mettre les valeurs maximum.

Sélection de la RAM et des CPU

Création du pool et du volume de stockage

Puis vient la création de l’espace de stockage (communément appelé disque dur). Par défaut virt-manager propose un « disque » de 20Go qui sera localisé à l’emplacement /var/lib/libvirt/images personnellement je préfère avoir mes disques virtuels dans un répertoire de mon home. Du coup on va personnaliser cela

Sélection du disque virtuel

Là nous nous retrouvons avec la fenêtre de gestion des pools, et on en crée un nouveau.

Création d’un nouveau pool

Ensuite on sélectionne le répertoire dans lequel sera stockée la VM. Attention ce répertoire doit exister, il faut le créer au préalable.

Sélection du répertoire du pool

Maintenant on va créer un disque virtuel dans le tout nouveau pool

Création d’un disque virtuel

Là on nome on laisse le format qcow2 qui est très performant et on donne la taille maximum qu’aura le disque

Nouveau volume

On valide, on sélectionne le nouveau volume, et c’est tout bon pour la partie stockage.

Finalisation

On y est presque il ne reste plus qu’à donner un nom à la future machine virtuelle. Si vous installez (comme dan cet exemple) un système Linux je conseil tout de cocher « Personnaliser la configuration avant l’installation » pour aller modifier un petit paramètre.

Finalisation de la création de la VM

Si vous avez coché « Personnaliser la configuration avant l’installation » vous devez arriver sur cette fenêtre qui regroupe tous les paramètres de la machine virtuelle.

Pour bénéficier d’un maximum de performances passez le disque et le réseau en virtio (attention ça ne marche pas avec windows, il faut laisser par défaut)

Disque virtuel en virtio

 

Sélection d’une carte type virtio

À ce stade on peut lancer l’installation.

Comme l’iso de Linux Mint est une Live (qu’on peut utiliser sans installer) donc le système démarre et on peut à loisir l’utiliser, le tester ou lancer l’installation. (Je ne développerias pas ici l’installation de linux Mint).

Live linux Mint dans virt-manager

Utilisation

L’utilisation ce fait aussi simplement que si le système était installé « en dur » sur le PC. Notons quelques particularités intéressantes.

La sauvegarde

Quand vous utiliser une VM il est possible de l’éteindre en sauvegardant son état, c’est particulièrement utile quand vous avez plein de logiciels ouvert et divers travaux en cours, vous pouvez redémarrer exactement dans le même état (pensez tout de même à sauvegarder les divers projets ouvert avant d’éteindre la VM)

Sauvegarde de l’état d’une VM

Le plein écran

Il est possible de mettre le système virtualisé en plein écran en cliquant sur l’icone tout à droite

Passage en plein écran de la VM

Une fois cela fait si vous voulez quitter le mode plein écran si faut mettre la sourie en haut et au milieu de l’écran un petit menu composé de deux icônes apparaît, il faut cliquer sur celle de gauche. Si vous voulez changer de bureau virtuel (sur l’hôte pas dans la VM) il faut juste mettre le curseur de la sourie sur ce petit menu et faire votre raccourci clavier pour changer de bureau, cela permet d’avoir un bureau virtuel (de l’hôte) entièrement destiné à la machine virtuelle

Menu pour sortir du plein écran

Normalement tous les systèmes modernes gère la sourie dynamiquement, c’est à dire que la sourie passe de l’hôte à la VM de manière transparente. Mais si votre système virtualisé ne gère pas cela et que la sourie est « prisonnière » dans la VM il faut appuyer sur Alt+Ctrl pour la faire sortir.

Pour les curieux (avancés)

Si vous voulez savoir comment virt-manager lance votre machine virtuelle il faut entrer la commande

ps aux |grep qemu

qui doit retourner quelque chose comme

libvirt+  6268  9.1 10.4 5420676 1712100 ?     Sl   10:54   0:55 /usr/bin/qemu-system-x86_64 -name guest=Linux_Mint_19,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-1-Linux_Mint_19/master-key.aes -machine pc-i440fx-3.1,accel=kvm,usb=off,vmport=off,dump-guest-core=off -cpu EPYC-IBPB,x2apic=on,tsc-deadline=on,hypervisor=on,tsc_adjust=on,cmp_legacy=on,perfctr_core=on,virt-ssbd=on,monitor=off -m 4096 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 73d93384-2933-410a-8bd0-9b43bc010109 -no-user-config -nodefaults -chardev socket,id=charmonitor,fd=25,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-reboot -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 -drive file=/home/olivier/Machines_virtuelles/Mint_19.qcow2,format=qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2 -drive file=/home/olivier/Téléchargements/linuxmint-19.1-mate-64bit.iso,format=raw,if=none,id=drive-ide0-0-1,readonly=on -device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,bootindex=1 -netdev tap,fd=27,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:6a:dd:bf,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device usb-tablet,id=input0,bus=usb.0,port=1 -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=2 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=3 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny -msg timestamp=on

Alors oui ça peut faire peur vu comme ça mais il s’agit de tous les paramètres utilisés pour lancer votre VM, je vous conseil de coller tout ça dans un fichier texte et de faire des retours à la ligne aux endroits où il y à un espace et un tiret comme cela on peut étudier les options de lancement.

Un petit exemple simple

Dans ma sortie ci-dessus il y a la définition du disque que nous avons crées lors de l’installation :

-drive file=/home/olivier/Machines_virtuelles/Mint_19.qcow2,format=qcow2,if=none,id=drive-virtio-disk0
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2

on voit qu’il est défini un ‘drive’ (un périphérique logique, un fichier dans notre cas) nommé drive-virtio-disk0 et qui est passé à la VM sous forme de ‘device’ (periphérique virtualisé).

Conclusion

Les concepts abordés ici sont élémentaires et s’applique à tout type de système d’exploitation, parfois certains systèmes nécessitent des ajustement particuliers, mais c’est du cas par cas et tout de même assez rare. Grâce à la virtualisation et des outils comme virt-manager il est maintenant possible d’installer, tester ou supprimer des système d’exploitation en quelques minutes, ce qui offre une souplesse particulièrement intéressante pour une multitude d’usages.

 

Olivier Munier

Depuis ma plus tendre enfance j'ai toujours été attiré par les appareils électroniques et techniques. Très vite je me suis intéressé à l'informatique et j'ai eu mon premier PC en 1992. Au début des années 2000, j'ai découvert Linux et le monde des logiciels libres et open source. Assez vite j'ai décidé de me spécialiser sur ce vaste monde afin de devenir un expert. Titulaire d'un master en Informatique, mes compétences couvrent un très large éventail, notamment l'administration système et réseau Linux, la virtualisation et la programmation C, Shell et surtout Python. Sur ce site je partage mes connaissances, réalisations et avis sur tout un tas de domaines mais particulièrement l'informatique, l'électronique et la geekitude.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *