Guide de Base d'Installation et d'Utilisation de QEMU sous Ubuntu

Publié le : 17/01/24
Modifié le : 05/10/24 à 14h07

emoji_objects

Documentation officielle : link

Introduction


QEMU, qui signifie "Quick Emulator", est un émulateur open-source qui permet de virtualiser diverses architectures matérielles. Il est principalement utilisé pour émuler des systèmes informatiques complets, y compris des processeurs, des périphériques, et des systèmes d'exploitation, sur une machine hôte. QEMU offre une grande flexibilité en matière de virtualisation et prend en charge plusieurs types d'émulation, notamment :

  • Émulation de processeur : QEMU peut émuler différents types de processeurs, tels que x86, ARM, PowerPC, MIPS, et d'autres, ce qui permet d'exécuter des systèmes d'exploitation conçus pour ces architectures sur une machine hôte.
  • Virtualisation matérielle : QEMU peut également être utilisé en conjonction avec des technologies de virtualisation matérielle telles que KVM (Kernel-based Virtual Machine) pour offrir des performances améliorées lors de l'exécution de machines virtuelles.
  • Émulation de périphériques : Il offre la possibilité d'émuler divers périphériques matériels, tels que des disques durs, des cartes réseau, des cartes graphiques, des clés USB, etc., pour fournir un environnement virtuel complet.
  • Exécution de conteneurs : QEMU peut être utilisé pour exécuter des conteneurs, en émulant un noyau Linux sur lequel un conteneur peut fonctionner. Cela permet d'isoler les applications et de les exécuter de manière plus légère que les machines virtuelles traditionnelles.

Différences entre QEMU/LXC


QEMU et LXC sont deux technologies de virtualisation/containerisation qui ont des objectifs et des fonctionnalités différentes. Voici les principales différences entre les deux :

1- Type de virtualisation/containerisation :
  • QEMU : QEMU est un émulateur qui permet d'exécuter des machines virtuelles complètes, ce qui signifie qu'il peut émuler différents systèmes d'exploitation avec des noyaux séparés. Il offre une isolation plus forte entre les machines virtuelles, mais cela peut entraîner une surcharge en termes de ressources système.

  • LXC (Linux Containers) : LXC est une technologie de containerisation qui permet d'exécuter plusieurs conteneurs Linux sur une même machine hôte. Les conteneurs partagent le même noyau Linux, ce qui les rend plus légers en termes de ressources, mais ils offrent une isolation moindre que les machines virtuelles.
2- Templates de systèmes :
  • LXC : LXC offre la possibilité d'utiliser des templates (ou images) de systèmes préconfigurés, ce qui facilite le déploiement de conteneurs avec des configurations de base spécifiques. Vous pouvez utiliser des templates pour créer rapidement des conteneurs basés sur des distributions Linux populaires comme Ubuntu, CentOS, etc.

  • QEMU : QEMU est plus orienté vers l'émulation de machines virtuelles. Bien que vous puissiez créer des images de machines virtuelles préconfigurées, cela nécessite généralement plus de travail et de personnalisation que les templates LXC.

En résumé, si vous avez besoin d'isoler complètement des systèmes d'exploitation avec des noyaux différents, QEMU est la meilleure option. Si vous souhaitez exécuter plusieurs conteneurs Linux légers sur une seule machine hôte, LXC avec des templates peut être une solution plus pratique.

Installation de QEMU


1. Mise à jour du système

On commence par mettre à jour la liste des paquets.

                            
                            sudo apt update
                            
                            
content_copy

2. Installation de QEMU

Ubuntu dispose de QEMU dans ses dépôts standards (mais en version 4, on est actuellement en version 8), donc son installation est simple. Pour installer QEMU, exécutons la commande suivante :

                            
                            sudo apt install qemu-system-x86 qemu-kvm libvirt-daemon libvirt-clients bridge-utils
                            
                            
content_copy
emoji_objects

Cette commande installe QEMU ainsi que plusieurs outils et dépendances utiles, tels que :
- qemu-kvm : support de la virtualisation KVM (Kernel-based Virtual Machine).
- libvirt-daemon : le démon de la bibliothèque libvirt, qui fournit une API pour gérer les machines virtuelles.
- libvirt-clients : les outils en ligne de commande pour interagir avec libvirt.
- bridge-utils : outils pour configurer les ponts réseau Linux, utiles pour les réseaux de machines virtuelles.
- virt-manager : une interface graphique pour gérer les machines virtuelles (facultatif si on préfère utiliser uniquement le terminal).

3. Vérification de l'installation

Après l'installation, on peut vérifier si QEMU est correctement installé en exécutant :

emoji_objects

Par défaut dans les dépôts Ubuntu, la version de Qemu fournie est celle de 4.x.x, elle est assez vieille. Pour une utilisation spécifique, il serait utile de compiler manuellement la dernière version qu'on peut trouver sur le site officiel : Lien.

Pour compiler QEMU, il faut avoir installé au préalable les paquets suivants :

                            
                            sudo sudo apt-get install build-essential libglib2.0-dev libfdt-dev libpixman-1-dev libssl-dev zlib1g-dev libncurses5-dev python3 python3-pip git bison flex ninja-build meson libslirp-dev
                            
                            
content_copy
                            
                            qemu-system-x86_64 --version
                            
                            
content_copy
                            
                            QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.28)
                            Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
                            
                            
content_copy

4. Activation des services Libvirtd

On s'assure que le service libvirt est activé et démarre avec notre système :

                            
                            toto@srv:~$ sudo apt install libvirt-daemon-system
                            toto@srv:~$ sudo systemctl enable --now libvirtd
                            toto@srv:~$ sudo systemctl status libvirtd
                            ● libvirtd.service - Virtualization daemon
                                Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
                                Active: active (running) since Tue 2024-01-16 13:34:46 UTC; 52min ago
                            TriggeredBy: ● libvirtd-ro.socket
                                         ● libvirtd.socket
                                         ● libvirtd-admin.socket
                            
                            
emoji_objects

Le service libvirtd facilite la gestion des machines virtuelles sur votre système Linux, offrant une abstraction conviviale pour la virtualisation, quel que soit le type de technologie de virtualisation qu'on utilises (QEMU, Xen, et d'autres).

5. Ajout de l’utilisateur au groupe kvm et libvirt

On Ajoute notre utilisateur aux groupes kvm et libvirt pour lui donner les droits nécessaires pour le bon fonctionnements des commandes :

                            
                            # On remplace $USER par le nom de l'utilisateur.
                            toto@srv:~$ sudo usermod -aG kvm $USER
                            toto@srv:~$ sudo usermod -aG libvirt $USER
                            
                            

Après avoir effectué ces étapes, QEMU devrait être installé et prêt à être utilisé sur notre machine Ubuntu. On peut maintenant procéder à la création et à la gestion de machines virtuelles.

Commandes QEMU de Bases


1. Vérifier l'état d'un service QEMU

                            
                            systemctl status qemu-kvm
                            
                            
content_copy

2. Redémarrer un service QEMU

                            
                            systemctl restart qemu-kvm
                            
                            
content_copy

3. Quitter une VM QEMU

                            
                            Ctrl+A /* Puis on relâche et on appuie sur */ C 
                            // On tape ensuite quit, puis clear pour éviter des bug du terminal.
                            
                            

4. Lancer une VM en arrière plan

L'option -daemonize permet de démarrer les machines virtuelles en arrière-plan.

5. Vérification de la redirection de port sur l'hôte

Pour réaliser la redirection de port, permettant de rediriger un port spécifique de l'hôte vers un port d'une VM on doit s'assurer que le forwarding IP est activé sur l'hôte :

                            
                            toto@srv:~/alpineOS$ sysctl net.ipv4.ip_forward
                                net.ipv4.ip_forward = 1
                                // Si le résultat n'est pas 1 on doit l'activer
                            toto@srv:~/alpineOS$ sudo sysctl -w net.ipv4.ip_forward=1
                                net.ipv4.ip_forward = 1
                            
                            
emoji_objects

Pour rendre cette modification permanente on modifie le fichier /etc/sysctl.conf et on ajoute net.ipv4.ip_forward = 1

6. VM en cours d'exécution

                            
                            toto@srv:~/alpineOS$ ps aux | grep qemu
                            User  PID   CPU(%) Rss(KB) VSZ(KB)   SHR(KB)  PTS    État Proc  Heure dém  T exec
                            ---------------------------------------------------------------------------------------------------------------------------------------------------
                            toto  1764  8.9    31.9    1108204   315432   pts/1  Sl+        18:54      0:55    qemu-system-x86_64 -k fr -m 512 -drive file=./alpine-disk.img ...
                            toto  1772  9.3    32.1    1106140   318084   pts/2  Sl+        18:54      0:55    qemu-system-x86_64 -k fr -m 512 -drive file=./alpine-disk-2.img ...
                            toto  1826  0.0    0.2     5192      2124     pts/0  S+         19:04      0:00    grep --color=auto qemu
                            
                            

7. Redémarrer le service libvirt

                            
                            sudo systemctl restart libvirtd
                            
                            
content_copy

8. Personnalisation (Facultatif)

On peut personnaliser l'invite de commande pour afficher des informations telles que le nom de l'utilisateur, le nom de l'hôte. Pour une meilleure expérience. car par défaut on a ce genre de résultat :

                            
                            // Après le démarrage de la VM on 
                            // switch vers notre utilisateur
                            my-alpine-vm-1:~$ su toto
                            Password:
                            ~ $ // On obtient juste "~ $"
                            
                            

Pour améliorer le résultat on quelque chose du genre : toto@my-alpine-vm-1:~$ on peut suivre les étapes suivantes :

                            
                            ~ $ vi ~/.profile
                            // On ajoute cette ligne dans le fichier
                            PS1="\u@\h:\w$ "
                            // On sauvegarde : :wq
                            // Pour que les modifications prennent effet immédiatement 
                            source ~/.profile
                            // Résultat
                            toto@my-alpine-vm-1:~$
                            
                            
emoji_objects

- On s'assure d'être connecté en tant qu'utilisateur.
- La ligne insérée configure l'invite de commande pour afficher le nom d'utilisateur, le nom de l'hôte, le chemin du répertoire courant et le signe dollar $.

On peut également personnaliser l'invite de commande en ayant le nom de l'utilisateur en vert, le nom du système hôte en violet, et le reste en blanc :

                            
                            ~ $ vi ~/.profile
                            PS1="\[\033[32m\]\u\[\033[0m\]\[\033[37m\]@\[\033[0m\]\[\033[35m\]\h\[\033[0m\]:\[\033[37m\]\w\[\033[0m\]$ "
                            // On sauvegarde : :wq
                            
                            

Installation d'une machine virtuelle Alpine


Installer une machine virtuelle Alpine Linux dans QEMU sur une VM Ubuntu via le terminal nécessite plusieurs étapes, notamment le téléchargement de l'image ISO d'Alpine Linux et la configuration de la machine virtuelle.

1. Téléchargement de l'ISO d'Alpine Linux

On utilise wget ou curl pour télécharger l'image ISO d'Alpine Linux directement depuis leur serveur de distribution.

                            
                            toto@srv:~/alpineOsNew$ curl -LO https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.0-x86_64.iso

                            % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                                               Dload  Upload   Total   Spent    Left  Speed
                            100  159M  100  159M    0     0  57.9M      0  0:00:02  0:00:02 --:--:-- 57.9M
                            toto@srv:~/alpineOsNew$ ls
                            alpine-standard-3.15.0-x86_64.iso  index.html
                            
                            
emoji_objects

Différence entre -o et -OL :
- -LO : Cette option est un raccourci qui signifie "location" et "output". Lorsque on utilise -LO, curl téléchargera le fichier depuis l'URL spécifiée et utilisera le nom du fichier dans l'URL comme nom de fichier de sortie.
- -o : Cette option nous permet de spécifier manuellement un nom de fichier de sortie.
Exemple : curl -o mon_fichier_local.zip ...

2. Création d'un disque virtuel :

On va créer un disque virtuel pour l'installation de la VM Alpine avec une taille de 2 Go en utilisant qemu-img :

                            
                            toto@srv:~/alpineOsNew$ qemu-img create -f qcow2 alpine-disk.img 2G
                            Formatting 'alpine-disk.img', fmt=qcow2 size=2147483648 cluster_size=65536 lazy_refcounts=off refcount_bits=16
                            toto@srv:~/alpineOsNew$ ls
                            alpine-disk.img  alpine-virt-3.19.0-x86_64.iso
                            
                            
emoji_objects

Cela crée un fichier alpine-disk.img qui servira de disque dur pour la machine virtuelle.
- qemu-img : C'est la commande pour gérer les images de disque avec QEMU.
- create : C'est l'option pour créer une nouvelle image de disque.
- -f qcow2 : Spécifie le format de l'image de disque à utiliser, ici qcow2.
- alpine-disk.img : C'est le nom qu'on va donner à l'image du disque.

3. Installation de Alpine sur le disque virtuel

emoji_objects

Je me situe dans un environnement sans interface graphique.

On va maintenant installer la distribution Alpine sur le disque virtuel en utilisant l'image téléchargée.

                            
                            qemu-system-x86_64 -k fr -m 512 -drive file=./alpine-disk.img,format=qcow2 -boot d -cdrom alpine-virt-3.19.0-x86_64.iso -nographic -netdev user,id=mynet0 -device e1000,netdev=mynet0
                            
                            
content_copy
emoji_objects

Informations sur la commande :
- qemu-system-x86_64 : C'est la commande pour exécuter QEMU avec une architecture de machine virtuelle x86_64.
- -k fr : Cette option définit le clavier de la machine virtuelle sur une disposition française.
- -m 512 : Définit la quantité de mémoire RAM allouée à la machine virtuelle.
- -drive file=./alpine-disk.img,format=qcow2 : Cette option précise le disque dur virtuel utilisé par la VM avec le chemin "file=./alpine-disk.img" et le format "qcow2" pour le fichier d'image, qui supporte les instantanés.
- -boot d : Définit l'ordre de démarrage de la machine virtuelle. Le d signifie que la VM va essayer de démarrer à partir du lecteur de CD-ROM en premier.
- -cdrom alpine-virt-3.19.0-x86_64.iso : Montre l'image ISO qui sera utilisée comme CD-ROM virtuel pour la session de la VM.
- -nographic : Active le mode sans graphique.
- Quitter la VM : Ctrl+A, puis X.

Après quelques secondes, on aura un ecran qui nous demandera d'entrer notre login.

                            
                            Welcome to Alpine Linux 3.19
                            Kernel 6.6.4-1-virt on an x86_64 (/dev/ttyS0)
    
                            localhost login: // root par défaut
                            
                            

Après avoir saisi le login root, on accède à un nouvel écran qui nous demande ce que l'on souhaite faire. Soit essayer Alpine, auquel cas on peut déjà taper des commandes, ou installer Alpine sur le disque virtuel.
Dans notre cas, on vas choisir d'installer Alpine.

                            
                            Welcome to Alpine Linux 3.19
                            Kernel 6.6.4-1-virt on an x86_64 (/dev/ttyS0)
                                
                            localhost login: root
                            Welcome to Alpine!
                                
                            The Alpine Wiki contains a large amount of how-to guides and general
                            information about administrating Alpine systems.
                            See .
                                
                            You can setup the system with the command: setup-alpine
                                
                            You may change this message by editing /etc/motd.
                                
                            localhost:~# setup-alpine
                            
                            

L'installation d'Alpine débute, et nous allons maintenant saisir plusieurs informations au fur et à mesure.

1- Saisir un nom d'hôte au système
                            
                            ALPINE LINUX INSTALL
                            ----------------------

                            Hostname
                            ----------
                            Enter system hostname (fully qualified form, e.g. 'foo.example.org') [localhost]
                            
                            
emoji_objects

Hostname : Le nom d'hôte (hostname) est le nom qui identifie de manière unique un ordinateur ou une machine sur un réseau.
Exemple : my-alpine-vm-1

2- Choisir une interface réseau
                            
                            Interface
                            -----------
                            Available interfaces are: eth0.
                            Enter '?' for help on bridges, bonding and vlans.
                            Which one do you want to initialize? (or '?' or 'done') [eth0]
                            
                            
emoji_objects

Interface : Dans cette étape, on doit choisir quelle interface réseau on souhaites initialiser pour notre machine virtuelle.
Par défaut, l'option est déjà configurée avec "eth0".
En résumé, si "eth0" est l'interface réseau qu'on souhaites utiliser, on appuies simplement sur "Entrée" pour accepter la configuration par défaut.

3- Attribution d'une adresse IP

Ensuite, on devra choisir comment l'adresse IP de la VM est attribuée. Par défaut, on choisit DHCP.
On clique simplement sur la touche "Entrée".

                            
                            Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp]
                            
                            

Le système nous propose de configurer le réseau manuellement, on choisira "non".
On clique simplement sur la touche "Entrée".

                            
                            Do you want to do any manual network configuration? (y/n) [n]
                            
                            
3- Configuration du mot de passe root

À cette étape, on doit spécifier un nouveau mot de passe pour l'utilisateur root de notre machine virtuelle.

                            
                            Root Password
                            ---------------
                            Changing password for root
                            New password:
                            Bad password: too weak
                            Retype password:
                            passwd: password for root changed by root
                            
                            
emoji_objects

On ne s'inquète pas si ça affiche Bad password: too weak, cela est du a un mot de passe faible.

4- Configuration du timezone

À cette étape, on doit simplement choisir le fuseau horaire qui nous convient.

                            
                            Timezone
                            ----------
                            Africa/            Egypt              Iran               Poland
                            America/           Eire               Israel             Portugal
                            Antarctica/        Etc/               Jamaica            ROC
                            Arctic/            Europe/            Japan              ROK
                            
                            
5- Configuration d'un proxy (facultatif)

Lorsque l'on atteint cette étape, on peut configurer un proxy HTTP/FTP si notre réseau ou notre environnement l'exige.
Dans mon cas, ce n'est pas nécessaire.

                            
                            Proxy
                            -------
                            HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none]
                            
                            
6- Configuration du protocole de temps réseau

L'étape du "Network Time Protocol" (Protocole de temps réseau) nous demande de choisir quel client NTP on souhaite exécuter pour la synchronisation de l'heure sur votre système Alpine Linux.
On choisit celui par défaut.

                            
                            Network Time Protocol
                            -----------------------
                            Which NTP client to run? ('busybox', 'openntpd', 'chrony' or 'none') [chrony]
                            
                            
7- Configuration du protocole de temps réseau

Cette étape nous permet de configurer les référentiels de paquets (mirrors) pour Alpine Linux.
Par défaut, la première option, "Find and use fastest mirror" (Trouver et utiliser le miroir le plus rapide), est généralement la meilleure.

                            
                            APK Mirror
                            ------------
                             (f)    Find and use fastest mirror
                             (s)    Show mirrorlist
                             (r)    Use random mirror
                             (e)    Edit /etc/apk/repositories with text editor
                             (c)    Community repo enable
                             (skip) Skip setting up apk repositories
                                
                            Enter mirror number or URL: [1]
                            
                            
8- Configuration d'un utilisateur

Cette étape vous permet de configurer un utilisateur.

                            
                            User
                            ------
                            Setup a user? (enter a lower-case loginname, or 'no') [no] toto
                            Full name for user toto [toto]
                            Changing password for toto
                            New password:
                            Bad password: similar to username
                            Retype password:
                            passwd: password for toto changed by root
                            Enter ssh key or URL for toto (or 'none') [none]
                            .
                            .
                            Which ssh server? ('openssh', 'dropbear' or 'none') [openssh]
                            
                            
emoji_objects

- Entrez la clé SSH ou l'URL pour toto (ou 'none') [none]: Cette étape nous permet de configurer une clé SSH pour l'utilisateur que nous venons de créer.
- À cette étape, le système ne peut pas encore générer de nouvelle clé.
- Quel serveur SSH choisir ? ('openssh', 'dropbear' ou 'none') [openssh]: Nous choisirons openssh.

9- Choix du disque d'installation de Alpine

Dans cette étape, on doits choisir le disque sur lequel on souhaites installer Alpine Linux.

                            
                            Disk & Install
                            ----------------
                            Available disks are:
                                fd0   (0.0 GB  )
                                sda   (2.1 GB ATA      QEMU HARDDISK   )
                                
                            Which disk(s) would you like to use? (or '?' for help or 'none') [none]
                            
                            
emoji_objects

- On choisit le disque que l'on a préalablement créé, sda.

Après avoir sélectionné le disque 'sda', on doit choisir comment on souhaite l'utiliser. Voici ce que signifient les options disponibles :

                            
                            How would you like to use it? ('sys', 'data', 'crypt', 'lvm' or '?' for help) [?] sys
                            
                            
  • "sys" : Cette option est utilisée pour installer le système d'exploitation Alpine Linux sur le disque "sda". C'est l'option qu'on choisira pour une installation standard.
  • "data" : Cette option est utilisée pour utiliser le disque "sda" comme espace de stockage de données sans installer le système d'exploitation.
  • "crypt" : Cette option est utilisée pour configurer le disque "sda" avec le chiffrement des données. Cela signifie que toutes les données stockées sur ce disque seront chiffrées.
  • "lvm" : Cette option est utilisée pour configurer le disque "sda" avec LVM (Logical Volume Manager) pour une gestion flexible des volumes logiques.

C'est la dernière étape, après celle-ci, Alpine Linux est installé sur le disque et prêt à être utilisé.

                            
                            WARNING: Erase the above disk(s) and continue? (y/n) [n] y
                            Creating file systems...
                            Installing system on /dev/sda3:
                            /mnt/boot is device /dev/sda1
                            100% ████████████████████████████████████████████==> initramfs: creating /boot/initramfs-virt for 6.6t
                            /boot is device /dev/sda1
                                
                            Installation is complete. Please reboot.
                            my-alpine-vm-1:~# reboot
                            
                            
emoji_objects

- Maintenant qu'on a installé Alpine et fait le reboot(Il y a un temps d'attente de quelques secondes), on doit quitter le terminal actuel, puis booter sur la VM fraîchement installée.
- Pour quitter le terminal QEMU correctement, on fait : Ctrl+A, puis on relâche ces touches et on appuie sur C
- Cela devrait nous ramener à un prompt QEMU, où on peut taper quit pour sortir proprement de QEMU.

10- Relancer la VM après installation

Maintenant qu'on a installé la VM sur le disque virtuel, on peut lancer la machine avec une nouvelle commande.

                            
                            toto@srv:~/alpineOsNew$ qemu-system-x86_64 -k fr -m 512 -drive file=./alpine-disk.img,format=qcow2 -boot c -nographic -netdev user,id=mynet0 -device e1000,netdev=mynet0
                            
                            
- Suppression de l'Option -cdrom :
  • Lors de l'installation, on dois utiliser l'option -cdrom pour monter l'image ISO d'Alpine Linux.
  • Pour démarrer une VM déjà installée, on omettera cette option car l'OS est déjà installé sur le disque dur virtuel.
- Changement de l'Option -boot :
  • Pendant l'installation, -boot d est souvent utilisé pour démarrer à partir du CD-ROM (l'image ISO).
  • Pour une VM installée, vous utilisez -boot c pour démarrer à partir du disque dur virtuel.
- Maintien de la Configuration Réseau :
  • Les options -netdev user,id=mynet0 -device e1000,netdev=mynet0 sont conservées pour permettre la connectivité réseau de la VM.
- Conservation du Mode sans Interface Graphique :
  • L'option -nographic est conservée pour démarrer la VM en mode console, sans interface graphique.
- Mémoire et Configuration Régionale :
  • Les options de mémoire (-m 512) et de configuration régionale du clavier (-k fr) sont conservées.
  • Les options de mémoire peut être modifié.