Cloner une machine virtuelle Linux Debian avec VirtualBox
L’un des principaux intérêts de la virtualisation est de pouvoir déployer à souhait des machines virtuelles à partir d’une installation de référence (ou master). N’allez cependant pas croire qu’il suffit de simplement copier le fichier image du master pour le réutiliser lors de la création d’une nouvelle machine. Dans ce billet j’aborderai les principales précautions à prendre pour éviter de perdre du temps lors du clonage d’une machine virtuelle Linux Debian avec VirtualBox.
Clonage du disque dur
Les quelques aventuriers ayant tenté le passage en force en copiant le fichier image du master ont certainement été confontés à un message de ce type lors de l’import du disque nouvellement créé :
Cannot register the hard disk [...] with UUID [...] because a hard disk [...] with UUID [...] already exists in the media registry [...].
L’UUID (Universal Unique IDentifier), auquel le message fait référence, est en fait une chaîne de caractères alphanumériques permettant d’identifier des périphériques de stockage (plus d’info ici). Cet identifiant étant inscrit dans les métadonnées du disque dur virtuel (fichier .vdi), il est copié en même temps que ce dernier. Lors de l’import de la nouvelle copie, l’unicité des identifiants de périphériques n’est plus respectée, d’où le message d’erreur retourné par VirtualBox.
Heureusement, les développeurs ont pensé à nous ! Plutôt que de modifier l’UUID du nouveau disque à la main, nous allons utiliser la commande VBoxManage associée à l’option clonehd :
VBoxManage clonehd <uuid>|<filename> <outputfile>
[--format VDI|VMDK|VHD|RAW|<other>]
[--variant Standard,Fixed,Split2G,Stream,ESX]
[--type normal|writethrough|immutable]
[--remember] [--existing]
La commande que j’utilise le plus couramment est la plus simple :
$ VBoxManage clonehd /path/to/master.vdi /path/to/clone.vdi
NB : Il est important de spécifier les chemins absolus des disques source et distant.
Une fois la procédure de clonage terminée, le nouveau disque est prêt à l’emploi et peut être utilisé en choisissant l’option « Utiliser un disque existant » lors de la création d’une nouvelle VM. Il ne reste alors plus qu’à démarrer la machine pour la suite des opérations.
Modification du hostname
Le nom d’hôte de la machine est utilisé par certaines opérations réseau et s’affiche sur le prompt d’un utilisateur connecté (bien que ce comportement soit configurable). Vous l’aurez compris, au premier démarrage, le nom d’hôte de la nouvelle VM est celui du master. Pour le modifier il faut éditer le fichier /etc/hostname :
$ echo newhostname > /etc/hostname
NB : on évitera les caractères trop exotiques pour la définition du hostname ;)
L’une des erreurs les plus couramment commises est de s’arrêter là ! En effet, il faut également propager cette modification dans le fichier /etc/hosts de façon à avoir au minimum les déclarations suivantes (en plus de celles pour IPv6) :
127.0.0.1 localhost 127.0.0.1 newhostname.localdomain newhostname
NB : Cette mise à jour est vraiment importante, tant son oubli peut faire perdre du temps. Un exemple typique est l’impossibilité de démarrer le serveur applicatif JBoss. Inutile de dire que le lien de cause à effet n’est pas immédiat et que les erreurs causées par l’omission de cette configuration sont assez difficiles à diagnostiquer (surtout lorsqu’elles surgissent 15 jours plus tard ! ).
Mise à jour des rules udev pour les interfaces réseau
Les distributions basées sur Debian disposent d’une règle udev permettant d’associer de façon pérenne le nom d’une interface réseau logique (ethX) avec l’adresse MAC de la carte correspondante. L’enregistrement des couples ethX/@MAC dans le fichier /etc/udev/rules.d/70-persistent-net.rules permet d’effectuer des opérations physiques sur les interfaces réseaux (ajout, retrait, interversions) sans pertrber la configuration réseau. La règle udev responsable de l’écriture de ces associations est située dans le script /etc/udev/rules.d/75-persistent-net-generator.rules. Les adresses MAC figurant dans le fichier 70-persistent-net.rules étant celles du master, il faut mettre le fichier à jour pour les faire correspondre avec celles de la nouvelle machine. On peut également tout bonnement supprimer ces 2 fichiers, mais cela n’est pas conseillé.
Changez vos mots de passe !
Et oui, les comptes utilisateurs étant les mêmes que ceux configurés sur le master, il est vivement conseillé de modifier au minimum le pass root !!!
Si je me souviens bien, l’UUID n’est pas stocké dans le fichier .vdi, mais dans les fichiers xml de configuration des machines et disques sous la forme .
Il est donc possible de changer l’UUID à la main comme un porc.
Et en bidouillant un peu plus les fichiers XML, on peut effectuer un clonehd sur un diff au lieu de le faire sur le .vdi de base (ce que VBox refuse de faire normalement). Et là, on peut avoir différentes branches dans les modifs d’un disque, à la VMWare, et c’est cooooool :)
@Geo
Au temps pour moi, l’uuid est effectivement dans le fichier nom-machine-virtuelle.xml, j’ai confondu avec un bout du profil hardware VMWare (rien à voir mais c’est un billet que je rédige en parallèle :) ). Pour ce qui est des snapshots, les dernières versions de VirtualBox permettent de faire un clonehd sur un snap moyennant le bon choix d’uuid. Je n’en parle pas car d’une façon générale je n’aime pas la façon dont sont gérés les snapshots sur VirtualBox (je préfère le COW kvm par exemple). Mais bon ce sera sûrement pour un prochain billet :)
EDIT : A vérifier mais, le descripteur XML de la machine étant écrit suite à la création de celle-ci (le disque étant déjà ajouté), l’UUID pourrait être tiré du fichier image. Cela expliquerait également pourquoi la copie d’un disque seul n’est pas possible (c’est donc que le vdi doit bien être porteur de l’UUID d’une façon ou d’une autre).
@TuxP
Je sais plus trop comment est généré l’UUID, mais je viens de me rappeler que vboxmanage a une commande pour changer l’UUID associé à un disque. Mais je me souviens plus du nom de la commande (elle est pas indiquée quand on fait VBoxManage –help).
@Geo
J’avoue ne pas avoir cherché cette commande, étant donné que clonehd génère un nouvel UUID pour le disque cible. Mais si tu la retrouves je suis preneur.
voila la commmande pour changer l’UUID :
VBoxManage internalcommands sethduuid *-*nomdufichier*-*
Merci pour le complément :)
Merci pour ce tuto !!
Ca fonctionne à merveille !
Juste un ajout.
La commande « VBoxManage clonehd » est exécutée sous root (perso j’ai eu des prb avec mon profil utilisateur).
Du coup, le fichier généré est utilisable uniquement par root.
Si comme moi, les machines virtuelles sont exécutées avec un utilisateur et non avec root, il ne faut pas oublier de lancer la commande sous root :
$ chown :users .vdi
Voilà pour ma modeste contribution à ce tuto.
Oups, voici la commande :
$ chown nom_utilisateur:users nom_fichier_virtuel.vdi
Exact, merci pour le complément :)