Hyper-V : comment cloner une VM ?
Sommaire
I. Présentation
Pour cloner une VM avec Hyper-V, il n'y a pas de commandes magiques malheureusement. Le plus simple c'est de passer par SCVMM (System Center Virtual Machine Manager) mais tout le monde ne l'a pas... Déjà parce que les licences sont coûteuses, mais aussi parce qu'on en a pas forcément l'utilité notamment si l'on a un seul hyperviseur.
Pour atteindre notre objectif, nous allons devoir utiliser les fonctionnalités d'export et d'import d'Hyper-V pour réussir à créer ce fameux clone. Dans ce tutoriel, les actions seront réalisées en PowerShell. A la fin de l'article, j'ai inclus un lien vers mon GitHub avec un script qui permet justement de cloner une VM sans devoir saisir toutes les commandes.
II. Cloner une VM
Dans cet exemple où je vais cloner une VM, je vais prendre la VM "Windows-10" et la cloner en "Windows-10-Clone".
A. Exporter la VM
Sur votre serveur Hyperviseur, ouvrez une console PowerShell en tant qu'administrateur. Nous allons commencer par exporter la VM source. Il n'est pas nécessaire de l'éteindre.
Voici la commande pour exporter la VM "Windows-10" dans le dossier "C:\TEMP" :
Export-VM -Name "Windows-10" -Path "C:\TEMP" -CaptureLiveState CaptureSavedState
Le paramètre CaptureLiveState sert à préciser comment Hyper-V doit capturer la VM source. Avec la valeur CaptureSavedState, on inclut l'état en mémoire actuelle. Par conséquent, la VM clonée sera dans l'état enregistré. Comme la documentation du cmdlet Export-VM l'indique, il y a 3 valeurs possibles.
B. Importer la VM
L'export étant réalisé, on va l'utiliser pour l'importer et créer une nouvelle machine virtuelle à partir du modèle exporté.
Note : Pour l'import, ceci peut être fait sur un autre serveur Hyper-V si vous le souhaitez.
La commande Import-VM doit contenir 3 valeurs à personnaliser :
- Path : chemin vers le fichier VMCX de la VM à importer
- VirtualMachinePath : chemin vers le dossier dans lequel créer la nouvelle VM (fichiers de config)
- VhdDestinationPath : chemin vers le dossier dans lequel stocker le(s) disque(s) virtuel(s) de cette VM
En complément, les paramètres -Copy et -GenerateNewId vont nous permettre de créer le clone en générant de nouveaux identifiants.
# Importer la VM en générant un nouvel ID pour créer le clone Import-VM -Path "C:\TEMP\Windows-10\Virtual Machines\3ED89FF1-7926-449D-AF2C-17877160D5F5.vmcx" -Copy -GenerateNewId ` -VirtualMachinePath "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\Windows-10-Clone" ` -VhdDestinationPath "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\Windows-10-Clone"
L'opération sera plus ou moins longue en fonction de la taille de la VM et des perfs de votre serveur.
Lorsque l'import est terminé, la deuxième VM apparaît directement dans l'inventaire Hyper-V. Vous verrez qu'elle a le même nom.
C. Renommer la VM
Quand on souhaite cloner une VM, il y a quelques étapes supplémentaires pour aller jusqu'au bout du processus. Nous allons déjà renommer la VM pour lui donner un nom différent et éviter les confusions.
Pour ne pas se tromper puisque les deux VMs ont le même nom, on va regarder la machine virtuelle qui est stockée à l'emplacement de la VM importée. Pour obtenir la VM, voici la commande :
$VM = Get-VM | Where-Object {$_.Path.StartsWith("C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\Windows-10-Clone")}
Vous pouvez lire la valeur de $VM pour contrôler si vous voulez. Sinon, passons directement à la commande Rename-VM afin de renommer la machine virtuelle.
Rename-VM -VM $VM -NewName Windows-10-Clone
Vous pouvez voir sur la copie d'écran ci-dessus que la VM est bien renommée.
D. Déconnecter le réseau de la VM
Si l'on démarre la machine virtuelle en l'état, elle aura la même adresse IP que la VM source. Ce n'est pas recommandé. Je vous propose de déconnecter la carte réseau de la VM (sans supprimer la carte) grâce à la commande Disconnect-VMNetworkAdapter. Il suffit de spécifier le nom de la VM donc nous allons réutiliser la variable $VM.
Disconnect-VMNetworkAdapter -VMName $VM
E. Ajouter une note / description
Nous allons modifier les paramètres de la machine virtuelle pour indiquer dans la description (les notes), une phrase : "Clone de la VM : Windows-10".
Set-VM -Name $VM -Notes "Clone de la VM Windows-10"
F. Supprimer l'export initial
Pour finir, on va supprimer l'export réalisé initialement pour ne pas laisser de données à trainer sur le serveur... Tout simplement, nous allons cibler le dossier de l'export avec Remove-Item :
Remove-Item -Path "C:\TEMP\Windows-10" -Recurse -Force
Bravo ! Vous venez de cloner une VM : il ne reste plus qu'à démarrer le clone pour vérifier qu'il fonctionne !
III. Script pour cloner une VM
Je vous propose un script pour cloner une VM en PowerShell. Ce script va reprendre les différentes étapes que l'on a vu ci-dessus, de façon automatique. Vous n'avez qu'à renseigner les valeurs au début du script ?
Merci Florian,
Good job ton script ça marche Nickel !! Je cherchais quelque chose comme ça pour cloner les VM rapidement C’est parfait pour un pti lab ou plus.
On adore te lire et découvrir des choses.
Bonne soirée.
Hello,
Il faut faire un sysprep pour l’utiliser en prod ensuite ?
Hello,
Pour une machine Windows, oui exact!
Bonjour,
Est ce que c’est possible de le faire entre deux (2) sites distant??
Merci de me revenir si possible!!
merci pour l’info. Mais je n’arrive pas à faire cela pour ma vm linux, en l’occurence Kali. Sous linux il n’y a pas de sysprep ???
Bonjour Thierry,
Non il n’y pas de sysprep sous Linux, quelle est l’erreur rencontrée ?