Hyper-V & Copy-VMFile : Copier un fichier dans plusieurs VM
Sommaire
I. Présentation
Avec Hyper-V, le transfert de données entre l'hôte physique et les machines virtuelles, c'est une question qui revient assez souvent auprès des utilisateurs. Comme évoqué dans un article que j'ai rédigé il y a un moment, c'est possible d'utiliser différentes manières notamment PowerShell et c'est cette méthode que nous allons voir en détails dans cet article.
Comment transférer des données entre un hôte Hyper-V et des machines virtuelles ?
Le commandlet "Copy-VMFile" est relativement simple d'utilisation dès lors que l'on a compris sa logique, nous allons l'étudier ensemble.
Ce commandlet introduit avec Windows Server 2012 R2 et toujours disponible bien entendu avec WS 2016 s'avère vraiment pratique, notamment dans un scénario où l'on doit copier un fichier vers un ensemble de VMs.
Rassurez-vous, pour que ça fonctionne, il n'est pas nécessaire d'ouvrir une session sur la VM, ça fonctionnera très bien sans, à partir du moment où elle est démarrée et que les services invités sont actifs.
II. Vérifier les services invités
Pour rester dans l'univers PowerShell, via la console associée, nous allons pouvoir vérifier que les services invités sont bien actifs au niveau de chaque VM. On va s'appuyer sur deux commandlets tout particulièrement : Get-VM et Get-VMIntegrationService, puis l'on affichera seulement les propriétés VMName et Enabled afin de savoir, pour chaque VM, si l'interface service invitée est active ou non.
Voici la commande a exécuter :
Get-VM | Get-VMIntegrationService -Name "Guest Service Interface" | Select VMName, Enabled
Que faire si ce n'est pas activé sur une VM et que je souhaite réaliser la config via PowerShell ? Il suffit d'exécuter la commande ci-dessous, en remplaçant "<Nom-VM>" par le nom de la VM ciblée.
Get-VM <Nom-VM> | Get-VMIntegrationService -Name "Guest Service Interface" | Enable-VMIntegrationService
Pour que ça fonctionne, au sein du système d'exploitation invité (de la VM), le service "Hyper-V Guest Service Interface" (vmicguestinterface) doit être actif, mais normalement c'est le cas par défaut. Je vous invite à vérifier cela, seulement dans le cas où ce qui va suivre ne fonctionne pas.
III. Copier un fichier vers une VM
Maintenant, prenons pour exemple, la copie du fichier "H:\ISO\debian-8.7.1-amd64-i386-netinst.iso" situé sur l'hôte Hyper-V, vers la VM "ADDS-01" au sein du répertoire "C:\Copy\" et en renommant le fichier en "iso-debian.iso" au sein de la destination.
Ce qui nous donnera la commande suivante :
Copy-VMFile -VMName ADDS-01 -FileSource Host -SourcePath "H:\ISO\debian-8.7.1-amd64-i386-netinst.iso" -DestinationPath "C:\Copy\iso-debian.iso" -CreateFullPath
Vous remarquerez la présence du paramètre "CreateFullPath" pour que l'arborescence de destination soit créée si elle n'existe pas, ou si elle n'existe pas entièrement. Ceci évitera les erreurs de chemin mais peut être trompeur : en effet, en cas de faute involontaire dans le nom du dossier/du chemin, un autre dossier sera créé.
La copie sera plus ou moins longue selon la rapidité de votre serveur ainsi que la taille du fichier. Dans tous les cas, une barre de progression sera affichée dans la console PowerShell afin de suivre la progression du transfert.
IV. Copier un fichier vers plusieurs VM
Sur le même principe que la commande précédente, nous pouvons envoyer notre fichier vers plusieurs machines virtuelles en même temps. Enfin au sein de la même commande, car les transferts seront lancés tour à tour, et non pas tous en même temps.
Directement dans le paramètre "VMName" il suffit d'indiquer les noms de VM à la suite, séparé par une virgule, comme ceci :
Copy-VMFile -VMName ADDS-01, SCCM-01 -FileSource Host -SourcePath "H:\ISO\debian-8.7.1-amd64-i386-netinst.iso" -DestinationPath "C:\Copy\iso-debian-2.iso" -CreateFullPath
Pour chaque transfert, vous pourrez suivre l'évolution via l'habituelle barre de progression.
Voilà, vous êtes désormais en mesure de transférer des fichiers simplement et rapidement vers une ou plusieurs VM, à vous de jouer ! 🙂