https://wiki.debian.org/KVM
https://www.how2shout.com/linux/how-to-install-and-configure-kvm-on-debian-11-bullseye-linux/
Pour voir si le processeur possède les extensions matérielles nécessaires pour la virtualisation matérielle :
grep -E --color '(vmx|svm)' /proc/cpuinfo
Qu’est-ce que c’est ?
kvm - QEMU
kvm est un hyperviseur type 1, en espace noyau, sous forme de module noyau pour Linux (intégré au noyau depuis la version 2.6.20). Il permet l’accès aux instructions processeur de virtualisation (Intel-VT ou AMD-V).
QEMU est un émulateur de PC (ou hyperviseur de type 2) : il simule du matériel (disques, RAM etc) pour un système invité. Grâce à kvm, il peut mettre à disposition le processeur physique, pour des performances quasi-natives.
L’un n’a pas besoin de l’autre (kvm peut servir à faire tourner une appli Linux sans OS complet, via containerization, et QEMU peut faire tourner un OS virtuel en émulant complètement un processeur), mais c’est en binôme qu’ils fonctionnent le mieux.
Pour voir si une VM utilise kvm , il faut trouver le PID de la VM, puis entrer la commande strings /proc/<PID>/cmdline|grep kvm
. Si oui, on peut y lire “-enable-kvm” ou “accel=kvm”.
Il y’a un module noyau nommé kqemu, qui visait à améliorer les performances de qemu, mais celui-ci a été rendu obsolète par kvm. Son seul avantage potentiel est qu’il fournissait une accélération (logicielle) sur les processeurs ne disposant pas des extensions de virtualisation (mais en ce cas, Virtualbox reste aujourd’hui une solution correcte), si l’invité et l’hôte sont sous la même architecture.
Le paquet qemu-user permet de faire tourner un OS compilé pour une architecure différente du processeur physique ?
libvirt, virsh, virt-install, virt-manager
libvirt
est une bibliothèque qui permet de gérer les machines virtuelles. Elle peut aussi se connecter à plusieurs hyperviseurs, dont kvm/QEMU, mais aussi Xen par exemple.
virt-install
est une interface en ligne de commande pour simplifier la création de VM.
virsh
est une interface en ligne de commande pour interagir avec libvirt, et donc créer, supprimer, modifier, démarrer, arrêter etc. les VMs.
- un “domaine” équivaut à une machine virtuelle.
- pour lister les VMs de la session utilisateur :
virsh list --all
- pour lister les VMs de la session système :
virsh -c qemu:///system list --all
- pour démarrer une VM système : ‘virsh -c qemu:///system start nom_de_la_vm’
virt-manager
est une interface graphique pour interagir avec libvirt (même rôle que virsh, mais en GUI).
virtio
Il me semble que c’est un protocole/une interface pour mettre le matériel de l’hôte à disposition des invités, avec le moins de latence possible. Ces périphériques virtuels nécessitent des pilotes spécifiques, sans quoi ils ne seront pas disponibles, au moins sous Windows. On peut trouver ces pilotes sur cette page.
En montant l’ISO en tant que lecteur CD lors de l’installation de Windows, on peut installer les pilotes pour le contrôleur de disque, à la volée (il faut choisir le dossier qui contient directement les pilotes, il n’y a pas de récursivité).
Virtualbox
C’est simplement un émulateur. Il est plutôt simple d’utilisation, peut être utilisé par un utilisateur non privilégié, mais n’a pas de performances folles.
Xen
Hyperviseur de type 1.
kvm - QEMU
Installation
kvm est déjà présent dans le noyau par défaut. Pour installer QEMU sous Debian Bullseye : sudo apt install qemu-system-x86
.
Pour installer virt-manager : sudo apt install virt-manager
. Installera automatiquement qemu.
Connexion system ou session
https://blog.wikichoon.com/2016/01/qemusystem-vs-qemusession.html
QEMU peut être utilisé avec une connexion système, ou avec une connexion session.
La connexion système permet l’accès complet à toutes les ressources ; libvirtd est lancé en tant que root
, les VMs en tant qu’utilisateur qemu
. L’accès d’un utilisateur simple est géré via polkit. On peut ajouter le user au groupe libvirt
pour lui permettre un accès aux ressources sans avoir à s’authentifier en root.
La configuration de libvirt est dans /etc/libvirt/
.
La connexion session est spécifique à l’utilisateur. Tout est exécuté par l’utilisateur simple. Les configurations/pools sont stockés dans le $HOME. Cependant le réseau accessible par défaut est lent, et peu flexible (difficile à rendre accessible depuis l’extérieur). À voir avec qemu-bridge-helper pour accéder à un pont réseau (créé au préalable par l’admin) ?
La configuration de libvirt est stockée dans $HOME/.config/libvirt
.
Détacher souris/clavier de la VM
Par défaut, c’est la combinaison L-Ctrl + L-Alt
.
Connexion via SSH
On peut gérer les VMs d’un serveur distant via ssh. Pour ceci, via virsh : virsh --connect qemu+ssh://root@example.com/system
.
Via virt-manager, il faut ajouter une connexion, et entrer l’URI qemu+ssh://root@example/system
.
En ce cas, il faudra entrer certains chemins manuellement (par exemple pour définir un chemin vers un ISO ou un fichier qcow2), le bouton “Parcourir” étant grisé.
Processeur
La configuration par défaut est de “Copier la configuration du processeur de l’hôte”. Il me semble que ça donne des performances très moyennes. Il vaut mieux décocher cette case et choisir le mode host-passthrough
. De même, la détection automatique de la topologie ne me donnait pas de très bons résultats. En choisissant une topologie manuelle, ça fonctionne bien mieux.
Socket : nombre de processeurs physiques sur la MB (1 dans la plupart des cas)
Coeurs : nombre de core du CPU
Chaînes : nombre de thread de chaque core
Périphériques USB ?
Réseau
https://wiki.qemu.org/Documentation/Networking
Le réseau par défaut est un réseau en NAT, et il ne démarre pas automatiquement.
Si on veut bridger une VM à une carte réseau, il faut d’abord créer le pont au niveau système ; il ne semble pas possible de bridger la VM directement à l’interface physique.
Disques
Si connexion à qemu:///system
, les pools de stockage (emplacement des fichiers image de disque dur) sont définis dans /etc/libvirt/storage/
et celui par défaut pointe sur /var/lib/libvirt/images/
. Les définitions de VMs (fichier XML) sont rangées dans /etc/libvirt/qemu/
.
Si connexion à qemu:///session
, les pools de stockage dont définis dans $HOME/.config/libvirt/storage/
et celui par défaut pointe vers $HOME/.local/share/libvirt/images/
. Les définitions de VMs sont rangées dans $HOME/.config/libvirt/qemu/
.
Les images sont au format qcow2.
Il est possible d’utiliser directement un périphérique de type block. Pour ceci, il faut éditer le fichier XML.
Virtualbox
L’avantage principal que je vois est le fait de pouvoir ponter facilement et à la volée la carte réseau virtuelle et n’importe quelle carte réseau (physique, pont ou virtuelle, genre tap0 ), sans préparer le réseau auparavant.
USB
Pour pouvoir passer les périphériques USB à l’invité, l’utilisateur qui lance VBox doit faire partie du groupe vboxusers :
sudo adduser $(whoami) vboxusers
Pour gérer l’USB2 / USB3 , il faut l’extension pack :
sudo apt install virtualbox-ext-pack
On peut passer les périphériques à la volée, via clic-droit sur l’icône USB en bas à droite de la fenêtre de la VM.