Configuration et utilisation d'Hyper-V en ligne de commande

Hyper-V est un hyperviseur de niveaux 1 et 2, disponible sous Windows. Il peut être administré soit via une interface graphique avec les composants MMC integrés à Windows, soit via la ligne de commande avec PowerShell. Ce tutoriel présente les principales commandes permettant de configurer et de gérer des machines virtuelles Hyper-V, ainsi que les administrer, uniquement à l'aide de PowerShell.

Gérer les commutateurs virtuels

Un commutateur virtuel permet aux machines virtuelles d'avoir accès au réseau de la machine physique, ou de créer un réseau interne dédié aux VM et isolé de l’extérieur.

  • Afficher les différentes carte réseau physiques installées sur l'hyperviseur :
Get-NetAdapter

Cartes réseaux disponibles sur l'hyperviseur

  • Pour créer un commutateur externe (ponté avec la carte réseau physique de l'hyperviseur permettant l'accès à Internet) :
New-VMSwitch -name Bridge -NetAdapterName Ethernet0 -AllowManagementOS $true
  • Pour créer un commutateur interne (réseau isolé communicant avec l'hyperviseur) :
New-VMSwitch -name InternalSwitch -SwitchType Internal
  • Et enfin pour créer un commutateur privé (réseau isolé, communications inter-VM uniquement) :
New-VMSwitch -name PrivateSwitch -SwitchType Private

Explication des arguments dans les commandes ci-dessus :

  • -Name : Désigne le nom du commutateur virtuel à créer
  • -NetAdapterName : Nom de l'adaptateur réseau physique à lier au commutateur externe (voir la première commande pour les lister)
  • -AllowManagementOS : Autoriser l'utilisation de la carte réseau par l'hyperviseur
  • -SwitchType : Type de commutateur virtuel (external, internal, ou private)
  • -NatSubnet : Permet de préciser le réseau privé à Natter (pour les switchs virtuels de type NAT)
  • Lister les commutateurs virtuels existants :
Get-VMSwitch 
  • Même chose mais de façon plus détaillée :
Get-VMSwitch | Format-List
  • Et on peut les supprimer avec :
Remove-VMSwitch -Name External 

Commutateurs virtuels de type NAT

Les commutateurs virtuels de type Interne peuvent utiliser le mécanisme NAT. Celui-ci sert à partager l'adresse IP de l'hyperviseur avec les machines d'un même réseau privé.

  • Pour créer un commutateur virtuel de type NAT (créer un switch interne) :
 New-VMSwitch -SwitchName SWNAT -SwitchType Internal
  • Puis créer la passerelle NAT (l'adresse IP externe partagée)
New-NetIPAddress -IPAddress 192.168.3.1 -PrefixLength 24 -InterfaceAlias "vEthernet (SWNAT)"
  • Et configurer le réseau NAT avec :
New-NetNat -Name NAT01 -InternalIPInterfaceAddressPrefix 192.168.3.0/24
  • Pour finir, supprimer le NAT avec :
remove-netnat -Name NAT01

VLANs

Les machines virtuelles peuvent être associées à un VLAN (réseau local virtuel) afin d'isoler les flux entre les machines qui ne doivent pas se voir.

  • Association d'une VM à un VLAN en mode Access :
Set-VMNetworkAdapterVlan -VMName NanoServer01 -Access -VlanId 121
  • Association d'une VM à un ou plusieurs VLANs en mode trunk :
Set-VMNetworkAdapterVlan -VMName NanoServer01 -Trunk -AllowedVlanIdList 1-100 -NativeVlanId 10

:!: -AllowVlanIdList permet d'indiquer la plage de vlans à associer à la machine.

  • Associer un vlan à la carte réseau physique de l'hyperviseur :
Set-VMNetworkAdapterVlan -ManagementOS -Access -VlanID 20
  • Désassocier tous les vlans de la VM :
Set-VMNetworkAdapterVlan -VMName NanoServer01 -Untagged

:!: Lorsqu'une machine virtuelle possède plusieurs cartes réseau, il faut utiliser l'option -VMNetworkAdapter pour spécifier celle que l'on souhaite configurer.

Switch Embedded Teaming (SET)

Le SET permet d’agréger jusqu'a 8 cartes réseau physiques en un seul switch virtuel afin de tolérer d'une d'entre elles ou de faire de l'équilibrage de charge entre plusieurs adaptateurs. Les adaptateurs à agréger ne peuvent pas être associé à d'autre switchs virtuels. Les switchs SET se configurent de la même façon que les switch virtuels mais à quelques détails près.

  • Créer un switch SET :
New-VMSwitch -Name TEAMSET -NetAdapterName "NIC 1","NIC 2" -EnableEmbeddedTeaming $true

Comme on peut le voir ci-dessus, on indique les carte réseau à agréger avec l'option -NetAdapterName suivie du nom de chacune d'elles séparées par une virgule.

  • Activer l'équilibrage de charge (mode dynamique) :
Set-VMSwitchTeam -Name TEAMSET -LoadBalacingAlgorithm Dynamic
  • Supprimer un switch SET :
Remove-VMSwitch -Name TEAMSET

Création d'une VM

  • Créer une nouvelle VM sous Hyper-V :
New-VM -Name NanoServer01 -MemoryStartupBytes 2GB -BootDevice VHD -VHDPath C:\VM\VM01\VM01-disk.vhdx -Path C:\VM\VM01\ -Generation 2 -Switch Bridge

VM Créée

Explication des arguments dans la commande ci-dessus :

  • -Name : Désigne le nom de la VM à créer
  • -MemoryStartupBytes : Quantité de mémoire vive minimale allouée au démarrage de la VM (en GB ou en MB)
  • -BootDevice : Type de périphérique de démarrage (VHD, IDE, CD, Floppy, LegacyNetworkAdapter ou NetworkAdapter)
  • -VHDPath : Chemin vers le fichier VHD (ou VHDx) sur lequel la machine doit démarrer (à la suite de -BootDevice)
  • -Path : Chemin d'accès vers le répertoire de la VM
  • -Generation : Génération de la VM (1 ou 2)
  • -Switch : Commutateur réseau virtuel à associer à la VM

⇒ Afin de générer un nouveau disque dur virtuel de 20GB lors de la création d'une VM, il faut utiliser les arguments suivants à la place de -VHDPath :

-NewVHDPath C:\VM\VM01\VM01-newdisk.vhdx -NewVHDSizeBytes 20GB

Tel que présenté ci-dessus, bien indiquer le chemin du nouveau fichier VHD(x) à créer et sa taille (en MB ou en GB).

  • Pour connecter un DVD virtuel (au format ISO) à une machine virtuelle afin de démarrer dessus par exemple, il faut utiliser cette commande :
Set-VMDvdDrive -VMName TestVM -Path C:\ISO\WinBuild.iso
  • -VMName : permet de spécifier le nom de la VM à laquelle attacher le DVD virtuel
  • -Path : Chemin vers l'image disque concernée
  • Afficher les DVD attachés à une machine virtuelle :
Get-VMDvdDrive -VMName TestVM
  • Ejecter un DVD virtuel attaché à une VM :
Remove-VMDvdDrive -VMName TestVM -ControllerNumber 1 -ControllerLocation 0

Gestion des machines virtuelles

  • Lister les VM instanciées sur l'hyperviseur :
Get-VM

On peut concaténer la commande Format-List (avec un pipe |) pour afficher les informations sous forme de liste (et non de tableau) et avoir quelques informations supplémentaires sur les VM.

  • Démarrer une VM :
Start-VM -Name nanoserver01

:!: Remplacer nanoserver01 par le nom de la VM à démarrer.

  • Arrêter une VM à travers le système d'exploitation (méthode propre) :
Stop-VM -Name nanoserver01

:!: L'argument optionnel -force sert à forcer l'arrêt de la VM quitte à fermer les applications ouvertes et les fichiers non sauvegardés.

  • Eteindre une VM (méthode brutale, comparable à un coupure d'alimentation, n'utiliser qu'en cas de plantage) :
Stop-VM -Name nanoserver01
  • Supprimer une VM (ne supprime pas ses fichiers) :
Remove-VM -Name nanoserver01

L'argument optionnel -Force permet d'éviter le message de confirmation de suppression.

  • Exporter une VM :
Export-VM -Name NanoServer01 -Path C:/VM/Export_VM/
  • Importer une VM sur l'hyperviseur en régénérant son ID :
Import-VM -Path C:\VM\Export\NanoServer\2B91FEB3-F1E0-4FFF-B8BE-29CED892A95A.vmcx' -Copy -GenerateNewId
  • Déplacer une VM à un autre emplacement sur l'hyperviseur local :
Move-VMStorage NanoServer01 -DestinationStoragePath D:\TestVM
  • Déplacer une VM sur un hyperviseur distant :
Move-VM -Name "Test VM" -DestinationHost remoteServer

Gestion des disques durs virtuels

  • Création d'un disque dur dynamique au format VHDX de 10GB :
New-vhd -Dynamic -Path E:\VDISKS\Disk01.vhdx -SizeBytes 10GB
  • Même chose avec un disque au format VHD :
New-vhd -Dynamic -Path E:\VDISKS\Disk02.vhd -SizeBytes 10GB

Remplacer l'option -Dynamic par -Fixed pour obtenir un disque dur virtuel à taille fixe.

  • Convertir un disque VHD en VHDX :
Convert-VHD -Path c:\test\testvhd.vhd -DestinationPath c:\test\testvhdx.vhdx
  • Entendre un disque virtuel à 50GB (pour avoir une plus de place dessus) :
Resize-VHD -Path c:\DISKS\Disk01.vhdx -SizeBytes 50GB

Inverser les chemins des disques sources et destination pour convertir du VHDX en VHD.

  • Lister les disques attachés à une VM :
Get-VMHardDiskDrive -VMName NanoServer01
  • Attacher un disque à une VM (avec un contrôleur SCSI) :
Add-VMHardDiskDrive -VM NanoServer01 -ControllerType SCSI -Path C:\Disks\disk03.vhdx
  • Détacher un disque d'une VM :
Remove-VMHardDiskDrive -VMName NanoServer01 -ControllerType SCSI -ControllerNumber 1 -ControllerLocation 0

:!: Bien faire attention au contrôleur IDE/SCSI où le disque est attaché pour ne pas détacher le mauvais.


Gestion des points de contrôle (snapshots)

Les points de contrôle permettent de créer l'image à un instant T d'une machine virtuelle afin de pouvoir rétablir l'état actuel de la VM en cas de problème.

Il existe deux types de points de contrôles sous Hyper-V :

  • Points de contrôle standard : une capture instantanée de la machine virtuelle et de l'état de sa mémoire est prise lors de l'initiation du point de contrôle. Une capture instantanée n’étant pas une sauvegarde complète, il peut entraîner des problèmes de cohérence des données avec les systèmes qui répliquent les données entre différents nœuds (comme Active Directory). Avant Windows 10, Hyper-V offrait uniquement des points de contrôle standard (anciennement nommés captures instantanées).
  • Points de contrôle de production : ils utilisent le service VSS (Volume Shadow Copy Service) ou File System Freeze sur une machine virtuelle Linux pour créer une sauvegarde cohérente des données de la machine virtuelle. Aucune capture instantanée de l’état de la mémoire de la machine virtuelle n’est prise. Ce sont les points de contrôle par défaut sur les versions récentes d'Hyper-V.

⇒ Le type de point de contrôle d'une VM peut être configuré comme ceci :

Set-VM -Name NanoServer01 -CheckpointType Standard

:!: On peut aussi utiliser les valeurs Production et ProductionOnly derrière l'argument -CheckpointType pour activer les points de contrôles mixtes ou de production.

  • Créer un point de contrôle pour la VM nommée NanoServer01 :
Checkpoint-VM -Name NanoServer01
  • Afficher les points de contrôles disponibles d'une VM :
Get-VMSnapshot -VMName NanoServer01

Listing des snapshots de la VM "NanoServer01"

  • Renommer le point de contrôle NanoServer01 - (12/11/2020 - 10:10:20) de la VM NanoServer01 en Snapshot-test :
Rename-VMCheckpoint -VMName NanoServer01 -Name "NanoServer01 - (12/11/2020 - 10:10:20)" -NewName "Snapshot-test"
  • Restaurer le point de contrôle Snapshot-test de la VM NanoServer01 :
Restore-VMSnapshot -Name "Snapshot-test" -VMName NanoServer01 -Confirm:$false
  • Supprimer le point de contrôle Snapshot-test de la VM NanoServer01 :
Remove-VMSnapshot -VMName NanoServer01 -Name Snapshot-test

Réglages supplémentaires

  • Autoriser la virtualisation imbriquée (nested virtualizaton) :
Set-VMProcessor -VMName nanoserver01 -ExposeVirtualizationExtensions $true
  • Activer l'usurpation d'adresse MAC (utile pour connecter des VM en virtualisation imbriquée) :
Get-VMNetworkAdapter -VMName nanoserver01 | Set-VMNetworkAdapter -MacAddressSpoofing On

Connexion à distance à l'hyperviseur

La connexion à distance à Hyper-V se fait habituellement grâce au protocole WinRM, soit par le biais du composant MMC Gestionnaire Hyper-V, soit par le biais de la console PowerShell. Sur le client (windows 10 ou windows server), l'installation des outils d'administration Hyper-V est requise (interface graphique et/ou module PowerShell), à différencier de la platerforme Hyper-V qui est le moteur de virtualisation (installé sur l'hyperviseur).

Commencer par activer les connexions Powershell distantes sur l'hyperviseur :

Enable-PSRemoting

Pour se connecter à un hyperviseur associé au même domaine Active Directory que le client, ignorer les étapes ci-dessous et passer directement à la partie Connexion à l'hyperviseur de ce tutoriel.

Pour se connecter à un hyperviseur depuis un poste client faisant partie d'un groupe de travail ou d'un domaine différent, il faut configurer WinRM et le protocole CredSSP de façon à ce que le serveur et le client puissent échanger des informations d'identification en toute sécurité. Cette procédure à détaillé juste après.

Configuration de WinRM et CredSSP pour la connexion d'un client hors domaine

Configuration côté serveur

Activer l'authentification CredSSP sur l'hyperviseur :

Enable-WSManCredSSP -Role "Server"

Sans oublier de valider avec O.

Activer la connexion CredSSP sur le serveur

Configuration côté client

Pour qu'un client hors domaine puisse se connecter au serveur via WinRM, il doit autoriser la connexion au serveur distant et l'échange d'informations d'identification via le protocole CredSSP. Passer tout d'abord la carte réseau active en mode “Réseau privé” (Cliquer ici pour voir le tutoriel).

Ensuite, activer WinRM avec la commande suivante :

WinRM quickconfig

Et répondre “O” aux questions posées.

Ce qui doit donner :

Activation de WinRM sur le client

Puis, ajouter le serveur à la liste des hôtes aux hôtes WinRM de confiance (adresse IP ou nom DNS) :

Set-Item WSMan:\localhost\Client\TrustedHosts -Value "HV01-TEST.nocterie.lab"

Et valider avec O.

Comme cela :

Ajout du serveur aux hôtes WinRM de confiance

Ensuite, activer l'authentification CredSSP pour ce même serveur :

Enable-WSManCredSSP -Role client -DelegateComputer HV01-TEST.nocterie.lab

Et valider avec O.

Tant qu'aucune erreur ne s'affiche, tout fonctionne correctement.

Voici le résultat :

Activation de l'authentification CredSSP avec le serveur

Connexion à l'hyperviseur

Avant de passer à la suite, s'assurer que les fonctionnalités Windows Outils d'administration Hyper-V sont installés sur le client (Disponible uniquement sur les éditions pro, éducation, entreprise, et serveur de Windows). Ils peuvent être installés via le panneau de configuration des programmes et fonctionnalités, via la commande powershell add-WindowsFeature rsat-hyper-v-manager ou encore en téléchargeant les outils d'administration de serveur distant pour Windows 10 (rsat) sur le site de Microsoft.

Une fois ces outils installés, ouvrir le gestionnaire Hyper-V, faire un clic droit sur le nœud en haut à droite nommé Gestionnaire Hyper-V, puis faire Se connecter au serveur.

Dans la petite boîte de dialogue qui s'ouvre alors, cocher Autre ordinateur, et renseigner l'adresse IP ou le nom d'hôte de l'hyperviseur (tel qu'il a été indiqué plus tôt lors de la configuration de WinRM et de CredSSP).

Afin de renseigner des identifiants de connexion, cliquer sur Définir l'utilisateur dans le but d'afficher la fenêtre d'identification. Les identifiants peuvent être enregistrés localement pour éviter de devoir les retaper à chaque fois.

Connexion à l'hyperviseur depuis le gestionnaire Hyper-V

Dès que le client est connecté, on a accès à toutes les machines virtuelles sur l'hyperviseur, comme si elles étaient instanciées localement :

Machines virtuelles sur l'hyperviseur

C'est gagné ! =)


Sources