Mode opératoire — Cloner une VM Proxmox et la rendre viable

Document autonome. Il peut se lire et s’appliquer sans les autres documents du TP. Partie 1 théorique, partie 2 pas-à-pas appliqué à l’infrastructure sio.internal.

Contexte : Documentation-pfSense.md · Incidents rencontrés : Troubleshooting.md · Dernière mise à jour : 27/09/2026


Sommaire

§Contenu
1Théorie — pourquoi cloner, et pourquoi un clone n’est pas une machine
2Full Clone ou Linked Clone : la question qui change tout
3Les cinq identités à régénérer
4Pas à pas — cloner srv-mysql-01
5Cas particulier : cloner un nœud destiné à un cluster
6Cas particulier : la machine gère son réseau par NetworkManager
7Pièges rencontrés et checklist finale

1 · Théorie — un clone n’est pas une machine

1.1 Pourquoi cloner plutôt que réinstaller

RéinstallationClonage
Durée20 à 40 min par VM1 à 2 min
Cohérence des versions dépend du dépôt au moment de l’installation identique par construction
Configuration applicativeà refaire déjà présente
Risque d’écart entre machinesélevénul

Sur un cluster, le troisième point est décisif. Deux serveurs web derrière un répartiteur doivent être interchangeables : même version de PHP, mêmes extensions, et surtout — pour WordPress — les mêmes clés de signature de session (salts). Le clonage garantit gratuitement cette identité ; une réinstallation obligerait à recopier wp-config.php à la main.

1.2 Ce qu’un clone copie — y compris ce qu’il ne devrait pas

Un clone est une copie octet par octet du disque. Il hérite donc de tout :

    ce qu'on veut              ce qu'on ne veut PAS
   ───────────────             ────────────────────────
   le système installé          l'adresse IP
   les paquets                  le nom de machine
   les configurations           l'identifiant machine-id
   les fichiers applicatifs     les clés d'hôte SSH
                                les données applicatives (pour un cluster)

Le principe à retenir : tout ce qui doit être unique sur un réseau doit être régénéré après un clonage. Une machine n’est pas définie par son disque, mais par son identité — et l’identité ne se copie pas, elle se recrée.

1.3 Pourquoi c’est dangereux de l’oublier

Les conséquences ne sont presque jamais des erreurs franches. Ce sont des pannes intermittentes, la pire catégorie à diagnostiquer :

Identité dupliquéeSymptôme
Adresse IPdeux machines répondent à la même adresse, le réseau devient imprévisible
machine-idjournaux mélangés, baux DHCP disputés — aucun message d’erreur
Clés d’hôte SSH une machine peut se faire passer pour l’autre sans que SSH ne s’en aperçoive
Nom de machineservices lents au démarrage, résolution du nom propre incohérente
Données d’un nœud de clusterhistoriques divergents, réconciliation impossible

2 · Full Clone ou Linked Clone

   LINKED CLONE                        FULL CLONE
   ────────────                        ──────────
   clone ──lit──► disque source        clone ──► son PROPRE disque
                       ▲
        si la source disparaît,        totalement indépendant
        le clone meurt aussi

Un linked clone ne copie rien : il n’enregistre que les différences par rapport au disque d’origine. Rapide et économe en espace — mais dépendant à vie de sa source.

Pour un cluster, le linked clone est un contresens. Trois nœuds censés survivre à la perte de l’un d’eux, tous adossés au même disque parent, c’est un seul point de panne déguisé en trois.

Dans Proxmox, le sélecteur Mode n’apparaît pas quand la source est une VM ordinaire : le Linked Clone n’est possible que depuis un template. Si tu ne vois pas le choix, c’est que Proxmox fait déjà un Full Clone. L’absence d’option est ici une bonne nouvelle.


3 · Les cinq identités à régénérer

#ÉlémentOùComment
1Adresse IP/etc/network/interfaces ou NetworkManagervoir §4.3 et §6
2Nom de machine/etc/hostname + /etc/hostshostnamectl
3machine-id/etc/machine-id et /var/lib/dbus/machine-id les deux
4Clés d’hôte SSH/etc/ssh/ssh_host_*dpkg-reconfigure openssh-server
5Données de cluster/var/lib/mysqlvidage — voir §5
—Adresse MAC— régénérée par Proxmox, rien à faire

3.1 Le piège du machine-id — à connaître absolument

La commande que l’on trouve partout est incomplète :

sudo rm -f /etc/machine-id && sudo systemd-machine-id-setup     #  INSUFFISANT

systemd-machine-id-setup cherche une source dans cet ordre :

#SourceMessage affiché
1/etc/machine-id s’il est valide(rien, conservé)
2/var/lib/dbus/machine-idfrom D-Bus machine ID
3UUID SMBIOS/DMI de l’hyperviseurfrom SMBIOS/DMI UUID
4tirage aléatoirefrom random generator

En n’effaçant que le premier fichier, la commande recopie celui du clone depuis D-Bus. Les deux machines restent jumelles, sans aucun message d’erreur et avec un code de retour 0.

sudo rm -f /etc/machine-id /var/lib/dbus/machine-id       #  les DEUX
sudo systemd-machine-id-setup
sudo ln -sf /etc/machine-id /var/lib/dbus/machine-id

Lire ce que la commande DIT avoir fait. from D-Bus machine ID et from random generator sont deux résultats radicalement différents, produits par la même commande, sans erreur. C’est le seul indice.

Effet de bord : après ce changement, journalctl répond « No journal files were found ». Le démon écrit dans un répertoire nommé d’après l’ancien identifiant, alors que journalctl cherche avec le nouveau. Correction : sudo systemctl restart systemd-journald

3.2 Pourquoi les clés d’hôte SSH sont un enjeu de sécurité

La clé d’hôte permet au client de vérifier qu’il parle bien au serveur attendu, et pas à un intercepteur. Si trois machines partagent la même clé :

   Tu crois joindre  srv-mysql-02
   Un attaquant détourne le trafic vers  srv-mysql-03
   → SSH ne détecte RIEN : la clé présentée est « connue »

Tout le modèle de confiance de SSH s’effondre. C’est la régénération la moins optionnelle des cinq.


4 · Pas à pas — cloner srv-mysql-01 en srv-mysql-02

Contexte : srv-mysql-01 en 10.0.20.10, VLAN 20, Debian 13, MariaDB installée. Objectif : obtenir srv-mysql-02 en 10.0.20.11, prêt à rejoindre un cluster.

4.1 Arrêter proprement la source

Proxmox → clic droit sur la VM → Shutdown

Shutdown, jamais Stop. Shutdown passe par l’agent QEMU : le système éteint ses services proprement, MariaDB ferme ses fichiers et vide ses tampons. Stop coupe le courant virtuel.

Pourquoi arrêter avant de cloner : un clone copie le disque tel quel. Si une base écrit pendant la copie, l’image est incohérente — et on la duplique ensuite autant de fois qu’on fait de clones.

4.2 Cloner

Clic droit → Clone

ChampValeur
Target nodepve-01
VM IDle prochain libre
NameSIO2527-srv-mysql-02-Axel
Resource PoolSIO2527_Axel
ModeFull Clone (imposé si la source n’est pas un template)

33-proxmox-clone-vm

4.3 Déconnecter la carte réseau AVANT le premier démarrage

Onglet Hardware → Network Device (net0) → décocher Connected → OK

   ┌──────────────┐   Connected    ┌──────────────┐
   │ srv-mysql-01 │                 │   le clone   │
   │  10.0.20.10  │                │  10.0.20.10  │
   └──────────────┘   pas de        └──────────────┘
                      conflit        on corrige au calme

Le clone porte l’adresse de sa source. Le démarrer tel quel créerait un conflit d’adresses IP — deux machines répondant à la même adresse, avec des symptômes incompréhensibles sur tout le VLAN.

4.4 Corriger l’adresse par la console

Démarrer la VM, ouvrir la Console Proxmox, se connecter :

sudo sed -i 's/10\.0\.20\.10/10.0.20.11/' /etc/network/interfaces
cat /etc/network/interfaces

Vérifier address 10.0.20.11/24, avec la passerelle 10.0.20.1 inchangée.

Le motif 10\.0\.20\.10 exige un 0 final : la passerelle 10.0.20.1 n’est pas touchée. Les points sont échappés pour désigner des points littéraux et non « n’importe quel caractère ».

Si le clavier de la console est en QWERTY — fréquent avec noVNC — utiliser le bouton presse-papiers de la barre d’outils Proxmox.

4.5 Rebrancher et redémarrer

Proxmox → Hardware → net0 → cocher Connected, puis dans la console :

sudo reboot

La machine remonte sur sa nouvelle adresse : plus aucun risque de conflit. Le reste se fait confortablement en SSH.

4.6 Le nom de machine

sudo hostnamectl set-hostname srv-mysql-02
sudo sed -i "s/^10\.0\.20\.1[0-9].*/10.0.20.11\tsrv-mysql-02.sio.internal\tsrv-mysql-02/" /etc/hosts && exec bash

Pourquoi réécrire la ligne entière plutôt qu’un s/ancien/nouveau/g : la seconde forme est dangereuse si on la rejoue (srv-mysql-01 deviendrait srv-mysql-02-02…). En ancrant sur l’adresse IP et en réécrivant toute la ligne, la commande devient idempotente.

L’avertissement sudo: impossible de résoudre l'hôte est attendu : sudo lit le nom de la machine au lancement, donc avant que sed n’ait modifié le fichier. Il disparaît ensuite.

4.7 L’identifiant machine

sudo rm -f /etc/machine-id /var/lib/dbus/machine-id && sudo systemd-machine-id-setup && sudo ln -sf /etc/machine-id /var/lib/dbus/machine-id

Attendre un message autre que from D-Bus machine ID.

sudo systemctl restart systemd-journald

4.8 Les clés d’hôte SSH

sudo rm -f /etc/ssh/ssh_host_* && sudo dpkg-reconfigure openssh-server

Trois clés sont régénérées (RSA, ECDSA, ED25519), portant le nouveau nom de machine.

4.9 Validation

hostname ; ip -br a | grep ens18 ; cat /etc/machine-id

Et la vérification croisée, depuis une troisième machine :

for h in 10.0.20.10 10.0.20.11 10.0.20.12; do echo -n "$h : "; ssh ipfixe@$h cat /etc/machine-id; done

Les identifiants doivent tous différer, et les empreintes ED25519 affichées à la connexion aussi. Une seule commande valide deux régénérations.


5 · Cas particulier — un nœud destiné à un cluster

sudo systemctl stop mariadb && sudo systemctl disable mariadb
sudo rm -rf /var/lib/mysql && sudo install -d -o mysql -g mysql -m 700 /var/lib/mysql

Pourquoi effacer des données qu’on vient de copier ? Le clone contient une copie figée de la base. S’il rejoignait le cluster avec ses propres données, celui-ci verrait deux historiques divergents et refuserait de les réconcilier.

Un répertoire vide oblige le nœud à demander une synchronisation complète (SST) : une copie intégrale et cohérente, prise à l’instant précis de la jonction.

disable empêche MariaDB de démarrer au prochain boot sur un répertoire vide — il échouerait bruyamment. On réactivera par systemctl enable mariadb une fois le nœud effectivement membre du cluster. Ne pas l’oublier : sans ça, un redémarrage de la VM sortirait le nœud du cluster sans prévenir.

install -d plutôt que mkdir : il crée le répertoire et fixe propriétaire et droits en une seule opération idempotente. mkdir -p laisserait les droits dépendre du umask.


6 · Cas particulier — la machine utilise NetworkManager

Toutes les machines Debian ne gèrent pas leur réseau de la même façon. Trois écoles cohabitent, et éditer le fichier de la mauvaise ne produit aucune erreur — juste aucun effet.

GestionnaireConfigurationOutilInstallé par
ifupdown/etc/network/interfacesifup / ifdowninstallation sans bureau
NetworkManager/etc/NetworkManager/system-connections/nmcliinstallation avec bureau
systemd-networkd/etc/systemd/network/networkctlimages cloud, conteneurs

Le réflexe de diagnostic

ls -l /etc/network/interfaces.d/ ; nmcli -t -f NAME,DEVICE,STATE connection show

36-h12-sed-sans-effet
37-h12-networkmanager

Un /etc/network/interfaces qui ne contient que le lo, et une connexion nommée Wired connection 1 : c’est NetworkManager.

Changer l’adresse avec nmcli

sudo nmcli connection modify "Wired connection 1" ipv4.addresses 10.0.10.11/24
nmcli connection show "Wired connection 1" | grep -E "ipv4.method|ipv4.addresses|ipv4.gateway|ipv4.dns:"

Les quatre paramètres attendus :

ipv4.method:      manual
ipv4.addresses:   10.0.10.11/24
ipv4.gateway:     10.0.10.1
ipv4.dns:         10.0.10.1

38-h12-nmcli-corrige

nmcli connection modify écrit dans la configuration persistante. Le changement survit au redémarrage sans avoir besoin d’activer la connexion — pratique quand la carte est volontairement débranchée.

Si ipv4.method affiche auto, c’est du DHCP. Sur un VLAN sans serveur DHCP, corriger :

sudo nmcli connection modify "Wired connection 1" ipv4.method manual ipv4.gateway 10.0.10.1 ipv4.dns 10.0.10.1

7 · Pièges rencontrés et checklist

7.1 Les quatre pièges du TP

PiègeSymptômeOù c’est documenté
machine-id recopié depuis D-Busaucun — identifiants jumeaux silencieuxH-11
sed sur la mauvaise école réseauaucun — le fichier ne contient pas l’adresseH-12
rsync absent sur la cibledpkg-query: paquet non installé§7.2
Clone démarré carte branchéeconflit d’adresses, symptômes erratiques sur le VLAN§4.3

7.2 Ce que le clone n’a pas forcément

Un clone n’a que ce que la source avait. Sur srv-mysql-01, ni curl ni rsync n’étaient installés — les clones non plus. Vérifier avant d’en avoir besoin :

dpkg -l curl rsync 2>/dev/null | grep '^ii'

7.3 Checklist finale

   Source arrêtée proprement (Shutdown, pas Stop)
   Full Clone
   net0 DÉCONNECTÉ avant le premier démarrage
   Adresse IP corrigée par la console  (ifupdown OU nmcli)
   net0 reconnecté, machine redémarrée
   hostnamectl + /etc/hosts
   machine-id  ← LES DEUX FICHIERS, vérifier le message affiché
   systemd-journald redémarré
   clés d'hôte SSH régénérées
   (cluster) /var/lib/mysql vidé, service désactivé
   Vérification croisée : machine-id et empreintes SSH tous différents
   VM renommée dans Proxmox selon la convention
   Hôte ajouté dans Termix

La règle à retenir en une phrase : un clone devient une machine le jour où plus rien d’unique ne le relie à son parent.