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
3. Vérification de l'installation
Après l'installation, on peut vérifier si QEMU est correctement installé en exécutant :
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
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
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:~$
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
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
3. Installation de Alpine sur le disque virtuel
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
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]
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]
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
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]
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]
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
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
- 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.
- 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.
- Les options -netdev user,id=mynet0 -device e1000,netdev=mynet0 sont conservées pour permettre la connectivité réseau de la VM.
- L'option -nographic est conservée pour démarrer la VM en mode console, sans interface graphique.
- 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é.