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 |
|---|---|
| 1 | Théorie — pourquoi cloner, et pourquoi un clone n’est pas une machine |
| 2 | Full Clone ou Linked Clone : la question qui change tout |
| 3 | Les cinq identités à régénérer |
| 4 | Pas à pas — cloner srv-mysql-01 |
| 5 | Cas particulier : cloner un nœud destiné à un cluster |
| 6 | Cas particulier : la machine gère son réseau par NetworkManager |
| 7 | Piè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éinstallation | Clonage | |
|---|---|---|
| Durée | 20 à 40 min par VM | 1 à 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ée | Symptôme |
|---|---|
| Adresse IP | deux machines répondent à la même adresse, le réseau devient imprévisible |
machine-id | journaux 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 machine | services lents au démarrage, résolution du nom propre incohérente |
| Données d’un nœud de cluster | historiques 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ément | Où | Comment |
|---|---|---|---|
| 1 | Adresse IP | /etc/network/interfaces ou NetworkManager | voir §4.3 et §6 |
| 2 | Nom de machine | /etc/hostname + /etc/hosts | hostnamectl |
| 3 | machine-id | /etc/machine-id et /var/lib/dbus/machine-id | les deux |
| 4 | Clés d’hôte SSH | /etc/ssh/ssh_host_* | dpkg-reconfigure openssh-server |
| 5 | Données de cluster | /var/lib/mysql | vidage — 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 :
| # | Source | Message affiché |
|---|---|---|
| 1 | /etc/machine-id s’il est valide | (rien, conservé) |
| 2 | /var/lib/dbus/machine-id | from D-Bus machine ID |
| 3 | UUID SMBIOS/DMI de l’hyperviseur | from SMBIOS/DMI UUID |
| 4 | tirage aléatoire | from 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 IDetfrom random generatorsont 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,
journalctlrépond « No journal files were found ». Le démon écrit dans un répertoire nommé d’après l’ancien identifiant, alors quejournalctlcherche 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-01en10.0.20.10, VLAN 20, Debian 13, MariaDB installée. Objectif : obtenirsrv-mysql-02en10.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
| Champ | Valeur |
|---|---|
| Target node | pve-01 |
| VM ID | le prochain libre |
| Name | SIO2527-srv-mysql-02-Axel |
| Resource Pool | SIO2527_Axel |
| Mode | Full Clone (imposé si la source n’est pas un template) |
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\.10exige un0final : la passerelle10.0.20.1n’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-01deviendraitsrv-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ôteest attendu :sudolit le nom de la machine au lancement, donc avant quesedn’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.
disableempêche MariaDB de démarrer au prochain boot sur un répertoire vide — il échouerait bruyamment. On réactivera parsystemctl enable mariadbune 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 -dplutôt quemkdir: il crée le répertoire et fixe propriétaire et droits en une seule opération idempotente.mkdir -plaisserait les droits dépendre duumask.
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.
| Gestionnaire | Configuration | Outil | Installé par |
|---|---|---|---|
ifupdown | /etc/network/interfaces | ifup / ifdown | installation sans bureau |
| NetworkManager | /etc/NetworkManager/system-connections/ | nmcli | installation avec bureau |
systemd-networkd | /etc/systemd/network/ | networkctl | images cloud, conteneurs |
Le réflexe de diagnostic
ls -l /etc/network/interfaces.d/ ; nmcli -t -f NAME,DEVICE,STATE connection show
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
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.methodafficheauto, 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ège | Symptôme | Où c’est documenté |
|---|---|---|
machine-id recopié depuis D-Bus | aucun — identifiants jumeaux silencieux | H-11 |
sed sur la mauvaise école réseau | aucun — le fichier ne contient pas l’adresse | H-12 |
rsync absent sur la cible | dpkg-query: paquet non installé | §7.2 |
| Clone démarré carte branchée | conflit 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.




