====== Gestion des VM KVM/Libvirt à distance avec Virsh ======
Ce guide regroupe les commandes essentielles pour administrer nos machines virtuelles en ligne de commande (CLI) via SSH, en remplacement de **virt-manager**.
===== 1. Installation de l'environnement (Serveur Headless) =====
Si le serveur Debian hôte est installé sans environnement de bureau (sans KDE/Gnome), voici les paquets requis pour faire fonctionner le moteur de virtualisation et les outils CLI :
sudo apt update
sudo apt install qemu-system-x86 libvirt-daemon-system libvirt-clients virtinst
* **libvirt-clients** : Fournit la commande ''virsh''.
* **virtinst** : Fournit la commande ''virt-install'' (création) et ''virt-clone'' (clonage).
===== 2. Informations et Statut =====
==== Lister les machines virtuelles ====
Pour afficher toutes les VM (y compris celles qui sont **éteintes**), l'option ''--all'' est indispensable.
sudo virsh list --all
==== Obtenir les détails d'une VM ====
Affiche les informations générales (Statut, CPU, Mémoire allouée).
sudo virsh dominfo
==== Connaître l'adresse IP d'une VM ====
Permet de trouver l'IP attribuée par le serveur DHCP interne de libvirt ou détectée sur l'hôte.
sudo virsh domifaddr
===== 3. Gestion de l'alimentation =====
==== Démarrer une VM ====
sudo virsh start
==== Éteindre proprement une VM ====
Envoie un signal ACPI à l'OS invité pour un arrêt propre (comme un clic sur "Éteindre").
sudo virsh shutdown
==== Forcer l'arrêt (Urgence) ====
Équivalent à débrancher la prise électrique. À n'utiliser que si la VM est totalement plantée.
sudo virsh destroy
==== Activer le démarrage automatique ====
Pour que la VM s'allume toute seule au boot du serveur Debian hôte.
sudo virsh autostart
//Pour désactiver : ajouter l'option ''--disable'' à la fin de la commande.//
===== 4. Gestion de la Configuration (XML) =====
==== Afficher la configuration XML complète ====
sudo virsh dumpxml
==== Sauvegarder la configuration dans un fichier ====
Utile pour faire une sauvegarde textuelle avant modification.
sudo virsh dumpxml > backup_.xml
==== Modifier la configuration à la volée ====
Ouvre la configuration de la VM dans l'éditeur de texte par défaut du système (souvent Nano ou Vim). **La VM doit être redémarrée pour appliquer les changements.**
sudo virsh edit
===== 5. Ressources Matérielles (Évolution) =====
^ Type ^ Commande ^ Note ^
| **RAM** | ''sudo virsh setmaxmem 4194304 --config'' \\ ''sudo virsh setmem 4194304 --config'' | VM éteinte obligatoirement (Exprimé en Kibibytes, ici 4 Go) |
| **CPU** | ''sudo virsh setvcpus 4 --maximum --config'' \\ ''sudo virsh setvcpus 4 --config'' | VM éteinte obligatoirement |
==== Agrandir un Disque Dur ====
1. Trouver le chemin du fichier de disque :
sudo virsh domblklist
2. Éteindre la VM, puis ajouter l'espace (ex: +20 Go) sur l'hôte :
sudo qemu-img resize /chemin/vers/image.qcow2 +20G
3. Rallumer la VM et étendre la partition à l'intérieur du système invité.
===== 6. Réseau et Stockage =====
==== Lister les disques attachés à une VM ====
sudo virsh domblklist --details
==== Lister les interfaces réseau d'une VM ====
sudo virsh domiflist
===== 7. Création et Duplication de VM =====
==== Créer une VM depuis un ISO (virt-install) ====
Cette commande instancie la VM, crée son disque dur au format QCOW2 et boot sur l'ISO.
sudo virt-install \
--name "ma-nouvelle-vm" \
--memory 2048 \
--vcpus 2 \
--os-variant debian12 \
--disk size=20,format=qcow2,pool=default \
--network network=default \
--cdrom /var/lib/libvirt/images/debian-12-installer.iso \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole
//Note pour le réseau : Remplacer ''network=default'' par ''network=routeur_nat'' si vous souhaitez la lier à votre routeur virtuel.//
==== Dupliquer / Cloner une VM (virt-clone) ====
Permet de créer une copie conforme d'une VM existante (comme un modèle) vers une nouvelle instance, en générant de nouvelles adresses MAC et de nouveaux disques pour éviter les conflits. **La VM source doit être éteinte.**
sudo virt-clone --original ynh_modèle --name nouvelle-instance.fr --auto-copy
===== 8. Instantanés (Snapshots) =====
Les snapshots nécessitent que les disques des VM soient au format **QCOW2**. Idéal avant une mise à jour critique de YunoHost.
==== Créer un instantané ====
sudo virsh snapshot-create-as nom-du-snapshot "Ma description ici"
//Astuce : Ajoutez l'option ''--live'' si la VM est allumée et que vous voulez aussi figer l'état exact de la RAM.//
==== Lister les instantanés d'une VM ====
sudo virsh snapshot-list
==== Restaurer un instantané (Retour en arrière) ====
**Il est recommandé d'éteindre la VM avant la restauration.**
sudo virsh snapshot-revert nom-du-snapshot
==== Supprimer un instantané ====
À faire une fois la mise à jour validée pour libérer de l'espace disque et conserver de bonnes performances.
sudo virsh snapshot-delete nom-du-snapshot
===== 9. Accès graphique à distance (Tunnel SSH + VNC) =====
Le port VNC de l'hôte n'étant pas accessible directement depuis l'extérieur pour des raisons de sécurité, il faut faire passer le flux graphique à l'intérieur d'un **tunnel SSH chiffré**.
==== Étape 1 : Identifier le port VNC utilisé ====
Sur le serveur distant, vérifiez le numéro d'affichage ou le port de la VM en cours d'exécution :
sudo virsh vncdisplay ma-nouvelle-vm
* Si le résultat est '':0'', le port réel est **5900**.
* Si le résultat est '':1'', le port réel est **5901**, etc.
==== Étape 2 : Créer le tunnel depuis votre machine locale ====
Ouvrez un **nouveau terminal sur votre PC local** (pas sur le serveur distant) et exécutez la commande suivante :
ssh -L 5900:127.0.0.1:5900 utilisateur@adresse_ip_du_serveur
//Note : Si à l'étape 1 la VM affichait ":1", remplacez le port de destination par 5901 (ex: 5900:127.0.0.1:5901).//
**Laissez ce terminal ouvert**, c'est lui qui maintient le pont sécurisé.
==== Étape 3 : Se connecter avec un visionneur VNC ====
1. Ouvrez votre logiciel VNC local (Remmina, TigerVNC, Vinagre, etc.).
2. Dans le champ d'adresse, connectez-vous sur : **''127.0.0.1:5900''**
3. L'écran graphique de l'installateur ou du bureau Debian de la VM distante s'affiche.