Skip to content

Virtualisation (KVM / QEMU)

Prérequis (Support matériel)

Avant l'installation, vérifiez que votre processeur supporte la virtualisation matérielle :

# Si le CPU est supporté, la commande retournera un chiffre > 0
egrep -c '(vmx|svm)' /proc/cpuinfo

Abstract

Si le résultat est 0, il est possible que la virtualisation soit désactivée dans votre BIOS/UEFI.

Installation (Debian / Ubuntu)

Utilisez apt pour installer l'hyperviseur et les outils de gestion :

sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager

Attribution des permissions

Pour gérer les machines virtuelles sans utiliser sudo, ajoutez votre utilisateur aux groupes libvirt et kvm :

sudo usermod -aG libvirt,kvm $USER

Note

Vous devrez vous déconnecter puis vous reconnecter (ou redémarrer la session) pour que ces modifications soient effectives.

Gestion des Machines Virtuelles

Virt-manager (Interface graphique)

C'est l'outil le plus simple pour débuter. Lancement :

virt-manager

Virsh (Ligne de commande)

virsh est l'outil principal pour gérer les domaines (VMs) en CLI.

Commande Description
virsh list --all Liste toutes les VMs (actives ou non)
virsh start <vm> Démarre une VM
virsh shutdown <vm> Arrête proprement une VM
virsh destroy <vm> Force l'arrêt immédiat (équivalent débrancher la prise)
virsh autostart <vm> Définit le démarrage automatique au boot de l'hôte
virsh edit <vm> Édite le fichier XML de configuration de la VM
virsh undefine <vm> Supprime la configuration d'une VM (attention au stockage)

Créer une VM Debian avec une image cloud (cloud-init)

Les images cloud de Debian ne passent pas par l'installeur classique : elles démarrent directement et se configurent toutes seules au premier démarrage grâce à cloud-init (préinstallé dans l'image). Au boot, cloud-init lit une petite ISO appelée seed qui contient votre configuration (utilisateur, clé SSH, nom de machine...).

C'est la méthode la plus rapide pour obtenir une VM utilisable immédiatement en SSH, sans passer par la console graphique.

Note

Le même mécanisme est utilisé par les hébergeurs cloud (AWS, OpenStack, etc.) : vous fournissez une clé publique et l'instance est prête. Ici, on reproduit ce fonctionnement en local avec le datasource « NoCloud ».

1. Télécharger l'image cloud

Dans cette exemple on part sur du Debian cloud.debian.org/images/cloud, choisissez la dernière version stable et téléchargez la variante generic (recommandée pour KVM/libvirt : drivers virtio et agent qemu inclus) :

wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2

Placez ensuite l'image dans le pool par défaut pour qu'elle soit visible dans virt-manager :

sudo cp debian-13-generic-amd64.qcow2 /var/lib/libvirt/images/

2. Créer les fichiers user-data et meta-data

Ce sont deux simples fichiers texte, créés sur l'hôte, dans n'importe quel dossier de travail (par exemple ~/cloud-init-mavm/). La VM ne lira jamais ces fichiers directement : ils servent uniquement à fabriquer le seed ISO.

  • user-data → la configuration à appliquer (utilisateurs, clés SSH...)
  • meta-data → l'identité de l'instance (identifiant et nom de machine)

user-data (remplacez monuser et la clé publique par les vôtres) :

#cloud-config
hostname: mavm
ssh_pwauth: false
users:
  - name: monuser
    groups: sudo
    shell: /bin/bash
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: true
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3Nza... monuser@monpc
Champ Rôle
ssh_authorized_keys Clés publiques autorisées à se connecter (contenu de ~/.ssh/id_ed25519.pub)
lock_passwd: true Aucun mot de passe n'est défini : la clé SSH est le seul accès
ssh_pwauth: false Refuse les connexions SSH par mot de passe
groups + sudo L'utilisateur peut administrer la machine (sudo sans mot de passe)

Tip

Pas encore de clé SSH ? Générez-en une avec ssh-keygen -t ed25519, la clé publique se trouve ensuite dans ~/.ssh/id_ed25519.pub.

meta-data :

instance-id: mavm-001
local-hostname: mavm
À quoi correspond instance-id ?

C'est un identifiant libre (n'importe quel texte), que vous choisissez vous-même. Il sert uniquement à cloud-init pour savoir si la VM a déjà été configurée :

  • Premier démarrage : cloud-init lit le seed, découvre un identifiant inconnu et applique toute la configuration (création de l'utilisateur, dépôt de la clé SSH...).
  • Démarrages suivants : l'identifiant n'a pas changé → cloud-init considère la machine comme déjà configurée et ne rejoue pas la configuration.
  • Vous modifiez user-data (nouvelle clé, nouvel utilisateur...) : changez l'instance-id (par ex. mavm-002), reconstruisez le seed et redémarrez. Cloud-init verra un « nouvel identifiant » et appliquera la nouvelle configuration.

Note

La notion vient du cloud public : chez un hébergeur, chaque machine virtuelle est une « instance » avec un identifiant unique fourni par la plateforme. En local, NoCloud lit simplement cet identifiant dans le seed au lieu d'interroger un service web.

3. Fabriquer le seed ISO

sudo apt install cloud-image-utils
cloud-localds seed.iso user-data meta-data

Abstract

La seule vraie contrainte : le volume de l'ISO doit s'appeler cidata. cloud-localds s'en charge, tout comme cette commande équivalente :

genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

Copiez ensuite le seed dans le pool par défaut :

sudo cp seed.iso /var/lib/libvirt/images/seed-mavm.iso

4. Créer la VM et attacher le seed

Avec virt-manager :

  1. Créer une nouvelle machine virtuelle → Importer une image disque existante → sélectionnez le .qcow2 → choisissez l'OS (ex. Debian 13) → Terminer.
  2. VM éteinte : ouvrez-la → icône ampoule (détails du matériel) → bouton + (Ajouter du matériel) → Stockage.
  3. Sélectionner ou créer un stockage personnalisé → seed-mavm.iso → Type de périphérique : CDROM, Bus : SATA → Terminer.

Ou en une seule commande avec virt-install (le seed est fabriqué et attaché automatiquement) :

virt-install --name mavm --memory 2048 --vcpus 2 \
  --import \
  --disk path=/var/lib/libvirt/images/debian-13-generic-amd64.qcow2 \
  --cloud-init user-data=$PWD/user-data,meta-data=$PWD/meta-data \
  --network network=default --osinfo debian13

Tip

Pour agrandir le disque avant le premier démarrage : qemu-img resize image.qcow2 20G. Contrairement au cas classique (voir la section qemu-img), inutile d'agrandir la partition à la main : cloud-init étendra automatiquement la partition et le système de fichiers au démarrage.

5. Démarrer et se connecter en SSH

virsh start mavm
virsh net-dhcp-leases default      # repérer l'IP de la VM (192.168.122.x)
ssh monuser@192.168.122.X

Note

L'écran graphique de la VM restera noir : c'est normal, les images cloud écrivent sur la console série. Dans virt-manager : Affichage → Consoles texte → Série 1. Si la VM apparaît avec une IP dans net-dhcp-leases, elle est prête.

Warning

Si la VM a déjà démarré une fois sans le seed, ce n'est pas grave : attachez le seed et redémarrez. Cloud-init appliquera la configuration dès lors que l'instance-id est nouveau pour lui.

Gestion des disques (qemu-img)

qemu-img est l'outil en ligne de commande pour manipuler les images de disque (création, conversion, redimensionnement).

Informations sur une image

qemu-img info /chemin/vers/image.qcow2

Création d'un disque vide

# Crée un disque de 20 Go au format qcow2
qemu-img create -f qcow2 mon_disque.qcow2 20G

Redimensionnement d'un disque

# Ajoute 10 Go à l'image existante
qemu-img resize mon_disque.qcow2 +10G

Warning

Après avoir redimensionné le fichier, il faut également agrandir la partition à l'intérieur de la VM (avec gparted ou resize2fs).

Conversion de format

# Convertit un disque VMDK (VMware) vers QCOW2 (KVM)
qemu-img convert -f vmdk -O qcow2 disque.vmdk disque.qcow2

Stockage et Réseau

Réseau

Par défaut, KVM utilise un réseau NAT (default) permettant aux VMs d'accéder à internet mais pas l'inverse. Pour un accès direct depuis le réseau local, il est préférable de configurer une carte bridge ou macvtap.

Warning

Il faut bien installer le paquet (sur Debian/Ubuntu) bridge-utils.

Format de disque (QCOW2)

Le format recommandé est .qcow2. Il supporte le "Thin Provisioning" (le fichier grossit selon l'usage réel) et les snapshots.

  • Prendre un snapshot : virsh snapshot-create-as <vm> <nom_snapshot>
  • Restaurer un snapshot : virsh snapshot-revert <vm> <nom_snapshot>

Vérification du système

Pour vérifier que tout est correctement configuré pour l'hyperviseur :

virt-host-validate