Dawan Proxmox VE — TSSR

Chapitre 2 — Machines Virtuelles KVM

11. Templates et clones — déploiement en série

11.1 Convertir une VM en template

Une VM préparée (OS installé, cloud-init configuré, agent QEMU actif) se convertit en template en un clic. Si elle a démarré pendant sa préparation, ne serait-ce que pour un test, elle doit d'abord être nettoyée et éteinte (§10.2).

La commande cloud-init clean --logs --machine-id efface l'état de cloud-init et remet l'identifiant système à uninitialized. Sans cela, tous les clones partagent le même machine-id, vérifié sur le lab. Un template n'est plus démarrable directement — il sert uniquement de source de clonage.

Via l'interface graphique :

VM → More → Convert to Template

Une boîte de confirmation s'ouvre. Après validation, l'icône de la VM dans le panneau de gauche change pour indiquer qu'il s'agit d'un template.

Via CLI :

Dans le Shell du nœud (interface web → votre nœud → Shell) :

# Convertir la VM 100 en template
qm template 100

# Vérifier que la conversion a réussi
qm config 100 | grep template
# → template: 1

Résultat attendu de qm config 100 | grep template :

template: 1

Deux points de départ pour un template. Le plus courant actuellement est une image cloud préparée par cloud-init (§10) : chaque clone reçoit au premier démarrage son nom, son adresse, son compte et ses clés.

Mais n'importe quelle VM installée peut devenir un template, par exemple la VM 105 installée depuis l'ISO. La différence porte sur ce qui reste à faire, avant la conversion puis sur chaque clone.

Template cloud-init (atelier 9, partie A) Template d'une VM installée (atelier 9, partie B)
Avant la conversion cloud-init clean --logs --machine-id Vider /etc/machine-id, supprimer /var/lib/dbus/machine-id et les clés /etc/ssh/ssh_host_*
Au premier démarrage d'un clone Nom, adresse, compte et clés SSH injectés par Proxmox Le nom et l'adresse du modèle : à changer dans la console, carte débranchée
Clés SSH de la machine Générées par cloud-init ssh-keygen -A à la main ; sans clés, le service SSH ne démarre pas

Deux constats du lab justifient le nettoyage manuel. Sans suppression de /var/lib/dbus/machine-id, le clone a repris le machine-id de la VM d'origine : systemd recrée /etc/machine-id à partir de cette copie. Et le clone démarre avec l'adresse fixe du modèle : branché tel quel, il entre en conflit avec la VM d'origine.

Le template d'une VM installée convient pour quelques machines, ou pour un système qui n'a pas d'image cloud. Dès qu'on déploie en série, cloud-init fait ce travail à la place de l'administrateur.

11.2 Cloner un template — clone lié vs clone intégral

Proxmox propose deux types de clones avec des compromis différents :

Clone lié (Linked Clone) : le clone partage les blocs de données du template grâce au mécanisme CoW (Copy-on-Write). Le disque du clone n'occupe que l'espace des données modifiées par rapport au template.

Très rapide à créer (quelques secondes), mais le clone dépend du template : ses blocs non modifiés sont lus dans le disque base- du template. Proxmox refuse d'ailleurs de supprimer un template tant qu'un clone lié en dépend.

Clone intégral (Full Clone) : copie complète et indépendante du disque. Prend plus de temps et d'espace, mais le clone est totalement autonome — le template peut être supprimé sans impact.

Via l'interface graphique :

Template → More → Clone

Champ Valeur
Mode Linked Clone (atelier) ou Full Clone (production)
Target Storage local-lvm
VM ID 101
Name debian-prod-01

Via CLI :

Dans le Shell du nœud (interface web → votre nœud → Shell) :

# Clone lié (rapide — dépend du template 9000)
qm clone 9000 101 --name debian-prod-01 --linked 1

# Clone intégral (indépendant)
qm clone 9000 102 --name debian-prod-02 --full 1 --storage local-lvm

# Personnaliser le clone avant démarrage
qm set 101 --ipconfig0 ip=10.44.1.56/24,gw=10.44.1.1
qm set 101 --ciuser devops --sshkeys ~/.ssh/authorized_keys   # utilisateur et clé SSH du clone
qm cloudinit update 101   # régénérer le lecteur cloud-init

# Démarrer le clone
qm start 101

Résultat attendu de qm clone 9000 101 --name debian-prod-01 --linked 1 :

create linked clone of drive scsi0 (local-lvm:base-9000-disk-0)
  Logical volume "vm-101-disk-0" created.

Le clone est créé en quelques secondes : son disque vm-101-disk-0 n'est qu'un instantané du disque base-9000-disk-0, qui ne contiendra que ce que le clone écrira. Après qm start 101, cloud-init applique les paramètres spécifiques au clone (hostname, IP, clé SSH) au premier démarrage.

Template 9000, clone lié 101 qui lit le disque du template, clone intégral 102 avec sa propre copie

Ce que chaque type de clone fait du disque du template. Le clone lié n'écrit que ses différences et lit le reste dans base-9000-disk-0 : il en dépend.

Le clone intégral en a une copie complète : il est autonome. Cliquez sur un élément pour le détail.

Revenons à la définition de base : cloner, c'est fabriquer une nouvelle VM à partir d'une autre. La question est : le clone a-t-il besoin de l'original pour vivre ?

Terme Ce que c'est Dans le laboratoire
Template Une VM figée, qui ne démarre plus et ne sert qu'à être clonée VM 100 debian13-template (atelier 9)
Disque base- Le disque du template, en lecture seule base-100-disk-0
Clone lié Un disque qui ne garde que ses différences et lit le reste dans le disque du template Le mode proposé par défaut dans la fenêtre Clone
Copie à l'écriture (copy-on-write) Un bloc n'est copié dans le clone que lorsqu'il le modifie En quelques secondes, le clone est prêt
Clone intégral Une copie autonome du disque ; plus longue, plus lourde VM 101 et 102 de l'atelier 9 (--full)
cloud-init Ce qui donne à chaque clone son nom, son IP et sa clé SSH au premier démarrage qm set 101 --ipconfig0 …

Un clone lié lit ses blocs non modifiés dans le disque du template : c'est pourquoi Proxmox refuse de supprimer un template tant qu'un clone lié en dépend. Un clone intégral, lui, survit à la suppression du template.

Où les voir sur votre nœud :

Notion Où la voir
Le template Une icône à part dans l'arborescence ; le menu More → Clone au lieu de Start
Le lien entre un clone lié et son template Le journal du clonage : create linked clone of drive scsi0 (local-lvm:base-<template>-disk-0). qm config <clone> ne le montre pas : il n'affiche que le disque du clone
Le mode de clonage La fenêtre Clone : champ Mode, Linked Clone ou Full Clone
L'espace occupé par chaque clone lvs : le Data% d'un clone lié reste faible, celui d'un clone intégral reprend toutes les données du template

Résultat attendu (pxe211, Proxmox VE 9, stockage local-lvm) : un modèle d'essai 990, puis un clone lié 991.

root@pxe211:~# qm template 990
  Renamed "vm-990-disk-0" to "base-990-disk-0" in volume group "pve"
root@pxe211:~# qm clone 990 991 --name essai-lie
creating a clone of VM 990 with ID 991
create linked clone of drive scsi0 (local-lvm:base-990-disk-0)
  Logical volume "vm-991-disk-0" created.
root@pxe211:~# qm config 991 | grep scsi0
boot: order=scsi0
scsi0: local-lvm:vm-991-disk-0,size=1G

Sans --full, qm clone d'un template fait un clone lié : le journal le dit (create linked clone) et nomme le disque du modèle qui sert de base. La configuration du clone, elle, ne cite que son propre disque. Pour savoir si une VM est un clone lié, on lit le journal de la tâche de clonage.

▶ À pratiquer maintenant — Atelier 9

Convertir la VM 100 en template et en tirer deux clones à adresse fixe ; puis faire un template d'une VM installée à la main, pour comparer.