11/12/2024

Hyper-VPowerShell

Hyper-V : comment cloner une VM ?

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.

cloner une VM

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 ?

Script - New-VMClone

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

6 commentaires sur “Hyper-V : comment cloner une VM ?

  • 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.

    Répondre
  • Hello,

    Il faut faire un sysprep pour l’utiliser en prod ensuite ?

    Répondre
  • Bonjour,
    Est ce que c’est possible de le faire entre deux (2) sites distant??
    Merci de me revenir si possible!!

    Répondre
  • 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 ???

    Répondre
    • Bonjour Thierry,
      Non il n’y pas de sysprep sous Linux, quelle est l’erreur rencontrée ?

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.