Microsoft Hyper-V
- 1. Installation de Hyper-V
- 2. Configuration Réseau
- 3. Gestion des Machines Virtuelles
- 4. Stockage
- 5. Checkpoints (Snapshots)
- 6. Live Migration
- 7. Failover Clustering
- 8. Hyper-V Replica
- 9. Nested Virtualization
- 10. PowerShell Hyper-V
- 11. Sécurité
- 12. Monitoring et Performance
- 13. Sauvegarde
- 14. Dépannage
1. Installation de Hyper-V
1.1 Prérequis matériels
Avant d'installer Hyper-V, le serveur ou poste de travail doit répondre aux exigences suivantes :
- Processeur 64 bits avec support de la virtualisation matérielle (Intel VT-x ou AMD-V)
- SLAT (Second Level Address Translation) : Intel EPT ou AMD RVI
- DEP matériel : Intel XD bit ou AMD NX bit activé dans le BIOS
- Minimum 4 Go de RAM (recommandé : 8 Go ou plus selon la charge)
- Espace disque : minimum 32 Go pour l'OS + espace pour les VM
systeminfo.exe et vérifiez la section "Configuration requise pour Hyper-V" en bas de la sortie.
1.2 Vérifier la compatibilité matérielle
# Verifier le support de la virtualisation
systeminfo.exe
# Verifier via PowerShell
Get-ComputerInfo -Property "HyperV*"
# Verifier specifiquement les fonctionnalites du processeur
(Get-WmiObject Win32_Processor).VirtualizationFirmwareEnabled
(Get-WmiObject Win32_Processor).SecondLevelAddressTranslationExtensions
1.3 Installation sur Windows Server
Le rôle Hyper-V peut être installé via Server Manager ou PowerShell :
Via PowerShell (recommandé)
# Installer le role Hyper-V avec les outils de gestion
Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart
# Installer uniquement les outils de gestion (sur un poste d'administration)
Install-WindowsFeature -Name RSAT-Hyper-V-Tools, Hyper-V-Tools, Hyper-V-PowerShell
# Verifier l'installation
Get-WindowsFeature Hyper-V
Via Server Manager
- Ouvrir Server Manager → Manage → Add Roles and Features
- Sélectionner Role-based or feature-based installation
- Sélectionner le serveur cible
- Cocher Hyper-V dans la liste des rôles
- Configurer les virtual switches et la migration si demandé
- Confirmer et redémarrer le serveur
1.4 Installation sur Windows 10 / 11 Pro ou Enterprise
# Activer Hyper-V via PowerShell (en tant qu'administrateur)
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
# Ou via DISM
DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V
# Verifier l'activation
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V
1.5 Hyper-V Server (gratuit)
Microsoft proposait Hyper-V Server en tant que produit gratuit autonome (sans interface graphique). Il s'agit d'un Windows Server Core avec uniquement le rôle Hyper-V.
- Dernière version : Hyper-V Server 2019
- Pas de GUI : administration via PowerShell,
sconfiget outils RSAT distants - Pas de licence Windows Server requise pour l'hôte
- Les VM Windows nécessitent toujours leurs propres licences
1.6 Configuration initiale post-installation
# Configurer le chemin par defaut des VM
Set-VMHost -VirtualMachinePath "D:\Hyper-V\VMs"
# Configurer le chemin par defaut des disques virtuels
Set-VMHost -VirtualHardDiskPath "D:\Hyper-V\VHDs"
# Verifier la configuration de l'hote
Get-VMHost | Select-Object VirtualMachinePath, VirtualHardDiskPath, `
MacAddressMinimum, MacAddressMaximum, EnableEnhancedSessionMode
# Activer le mode session amelioree (Enhanced Session Mode)
Set-VMHost -EnableEnhancedSessionMode $true
2. Configuration Réseau
2.1 Types de Virtual Switches
Hyper-V propose trois types de commutateurs virtuels (Virtual Switch) :
- External (Externe) : Connecté à une carte réseau physique. Permet aux VM de communiquer avec le réseau physique, l'hôte et entre elles. C'est le type le plus courant.
- Internal (Interne) : Permet la communication entre les VM et l'hôte Hyper-V uniquement. Aucun accès au réseau physique externe.
- Private (Privé) : Permet la communication entre les VM uniquement. L'hôte ne peut pas communiquer avec les VM via ce switch.
2.2 Créer des Virtual Switches
# Lister les cartes reseau physiques disponibles
Get-NetAdapter | Where-Object { $_.Status -eq "Up" }
# Creer un switch External
New-VMSwitch -Name "vSwitch-External" -NetAdapterName "Ethernet0" -AllowManagementOS $true
# Creer un switch Internal
New-VMSwitch -Name "vSwitch-Internal" -SwitchType Internal
# Creer un switch Private
New-VMSwitch -Name "vSwitch-Private" -SwitchType Private
# Lister tous les virtual switches
Get-VMSwitch | Format-Table Name, SwitchType, NetAdapterInterfaceDescription
# Supprimer un virtual switch
Remove-VMSwitch -Name "vSwitch-Old" -Force
2.3 NIC Teaming (agrégation de liens)
Le NIC Teaming permet de regrouper plusieurs cartes réseau physiques pour la redondance et l'augmentation de bande passante :
# Creer un NIC Team avec deux cartes
New-NetLbfoTeam -Name "Team-Prod" -TeamMembers "NIC1", "NIC2" `
-TeamingMode SwitchIndependent -LoadBalancingAlgorithm Dynamic
# Modes de teaming disponibles :
# - SwitchIndependent : ne necessite aucune config switch (recommande)
# - Static : necessite config statique sur le switch (port channel)
# - LACP : necessite support 802.3ad sur le switch
# Algorithmes de load balancing :
# - Dynamic : meilleur choix general (par defaut)
# - HyperVPort : optimise pour Hyper-V
# - TransportPorts : base sur les ports TCP/UDP
# Creer un virtual switch sur le NIC Team
New-VMSwitch -Name "vSwitch-Team" -NetAdapterName "Team-Prod" -AllowManagementOS $true
# Verifier l'etat du team
Get-NetLbfoTeam
Get-NetLbfoTeamMember
Switch Embedded Teaming (SET)
# Creer un virtual switch avec SET (2 NICs)
New-VMSwitch -Name "vSwitch-SET" -NetAdapterName "NIC1", "NIC2" `
-EnableEmbeddedTeaming $true -AllowManagementOS $true
# Verifier le SET
Get-VMSwitch "vSwitch-SET" | Select-Object Name, EmbeddedTeamingEnabled
Get-VMSwitchTeam -Name "vSwitch-SET"
2.4 Configuration VLAN
# Configurer un VLAN sur le port d'une VM
Set-VMNetworkAdapterVlan -VMName "SRV-WEB01" -Access -VlanId 100
# Configurer le mode Trunk (plusieurs VLANs)
Set-VMNetworkAdapterVlan -VMName "SRV-ROUTER" -Trunk `
-AllowedVlanIdList "100,200,300" -NativeVlanId 1
# Configurer le VLAN sur l'interface de management de l'hote
Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName "vSwitch-External" `
-Access -VlanId 10
# Verifier la configuration VLAN
Get-VMNetworkAdapterVlan -VMName "SRV-WEB01"
# Retirer la configuration VLAN
Set-VMNetworkAdapterVlan -VMName "SRV-WEB01" -Untagged
2.5 MAC Spoofing et DHCP Guard
# Activer le MAC Spoofing (necessaire pour NIC teaming dans la VM ou containers)
Set-VMNetworkAdapter -VMName "SRV-DOCKER" -MacAddressSpoofing On
# Activer DHCP Guard (empeche une VM de repondre en tant que serveur DHCP)
Set-VMNetworkAdapter -VMName "SRV-WEB01" -DhcpGuard On
# Activer Router Guard (empeche une VM de router le trafic)
Set-VMNetworkAdapter -VMName "SRV-WEB01" -RouterGuard On
# Configurer une adresse MAC statique
Set-VMNetworkAdapter -VMName "SRV-WEB01" -StaticMacAddress "00-15-5D-01-02-03"
2.6 Gestion de la bande passante
# Activer la QoS sur le virtual switch
Set-VMSwitch -Name "vSwitch-External" -DefaultFlowMinimumBandwidthWeight 10
# Configurer la bande passante minimale et maximale par VM
Set-VMNetworkAdapter -VMName "SRV-WEB01" -MinimumBandwidthWeight 40
Set-VMNetworkAdapter -VMName "SRV-DEV01" -MinimumBandwidthWeight 10
# Limiter la bande passante maximale (en Mbps)
Set-VMNetworkAdapter -VMName "SRV-DEV01" -MaximumBandwidth 100000000 # 100 Mbps
# Verifier la configuration reseau d'une VM
Get-VMNetworkAdapter -VMName "SRV-WEB01" | Format-List *
2.7 Ajouter ou retirer des cartes réseau virtuelles
# Ajouter une carte reseau a une VM
Add-VMNetworkAdapter -VMName "SRV-WEB01" -SwitchName "vSwitch-External" -Name "NIC-Prod"
# Ajouter une seconde carte sur un autre switch
Add-VMNetworkAdapter -VMName "SRV-WEB01" -SwitchName "vSwitch-Internal" -Name "NIC-Mgmt"
# Retirer une carte reseau
Remove-VMNetworkAdapter -VMName "SRV-WEB01" -Name "NIC-Mgmt"
# Lister toutes les cartes reseau d'une VM
Get-VMNetworkAdapter -VMName "SRV-WEB01"
3. Gestion des Machines Virtuelles
3.1 Génération 1 vs Génération 2
Hyper-V propose deux générations de VM :
| Fonctionnalité | Génération 1 | Génération 2 |
|---|---|---|
| Firmware | BIOS | UEFI |
| Secure Boot | Non | Oui |
| Boot depuis SCSI | Non (IDE uniquement) | Oui |
| TPM virtuel | Non | Oui |
| Boot PXE | Legacy Network Adapter | Carte réseau standard |
| Redimensionnement VHDX à chaud | Non | Oui |
| OS supportés | Tous (Windows, Linux ancien) | Windows 8+/2012+, Linux récent |
3.2 Créer une machine virtuelle
# Creer une VM Generation 2 basique
New-VM -Name "SRV-WEB01" -Generation 2 `
-MemoryStartupBytes 4GB `
-NewVHDPath "D:\Hyper-V\VHDs\SRV-WEB01.vhdx" `
-NewVHDSizeBytes 60GB `
-SwitchName "vSwitch-External"
# Configurer le nombre de processeurs virtuels
Set-VMProcessor -VMName "SRV-WEB01" -Count 4
# Activer la memoire dynamique
Set-VMMemory -VMName "SRV-WEB01" -DynamicMemoryEnabled $true `
-MinimumBytes 2GB -MaximumBytes 8GB -StartupBytes 4GB
# Monter un ISO pour l'installation
Add-VMDvdDrive -VMName "SRV-WEB01" -Path "D:\ISOs\Win2022.iso"
# Configurer l'ordre de boot (DVD en premier)
$dvd = Get-VMDvdDrive -VMName "SRV-WEB01"
Set-VMFirmware -VMName "SRV-WEB01" -FirstBootDevice $dvd
# Desactiver Secure Boot pour Linux
Set-VMFirmware -VMName "SRV-LINUX01" -EnableSecureBoot Off
# Demarrer la VM
Start-VM -Name "SRV-WEB01"
3.3 Secure Boot et TPM virtuel
# Activer Secure Boot (Generation 2 uniquement)
Set-VMFirmware -VMName "SRV-WEB01" -EnableSecureBoot On
# Pour Linux : utiliser le modele Microsoft UEFI Certificate Authority
Set-VMFirmware -VMName "SRV-LINUX01" -EnableSecureBoot On `
-SecureBootTemplate "MicrosoftUEFICertificateAuthority"
# Ajouter un TPM virtuel (necessaire pour Windows 11 / BitLocker dans la VM)
Enable-VMTPM -VMName "SRV-WEB01"
# Ajouter un Key Protector pour le vTPM
Set-VMKeyProtector -VMName "SRV-WEB01" -NewLocalKeyProtector
# Verifier l'etat du TPM
Get-VMTPM -VMName "SRV-WEB01"
MicrosoftUEFICertificateAuthority au lieu du template Windows par défaut, sinon la VM ne démarrera pas.
3.4 Integration Services
Les Integration Services sont des composants qui améliorent l'intégration entre l'hôte et la VM :
- Operating System Shutdown : arrêt propre de la VM depuis l'hôte
- Time Synchronization : synchronisation de l'heure avec l'hôte
- Data Exchange (KVP) : échange de paires clé/valeur entre hôte et VM
- Heartbeat : détection de la santé de la VM
- Backup (VSS) : sauvegardes cohérentes via Volume Shadow Copy
- Guest Services : copie de fichiers directe hôte vers VM
# Verifier les Integration Services d'une VM
Get-VMIntegrationService -VMName "SRV-WEB01"
# Activer un service specifique
Enable-VMIntegrationService -VMName "SRV-WEB01" -Name "Guest Service Interface"
# Desactiver la synchronisation du temps (utile pour les DC)
Disable-VMIntegrationService -VMName "SRV-DC01" -Name "Time Synchronization"
# Copier un fichier vers la VM via Guest Services
Copy-VMFile -VMName "SRV-WEB01" -SourcePath "C:\Temp\config.xml" `
-DestinationPath "C:\Config\config.xml" -FileSource Host
3.5 Configuration avancée des VM
# Activer l'Automatic Start Action (demarrage auto au boot de l'hote)
Set-VM -Name "SRV-WEB01" -AutomaticStartAction Start `
-AutomaticStartDelay 60
# Configurer l'action a l'arret de l'hote
Set-VM -Name "SRV-WEB01" -AutomaticStopAction ShutDown
# Options : TurnOff, Save, ShutDown
# Renommer une VM
Rename-VM -Name "SRV-WEB01" -NewName "SRV-WEB-PROD01"
# Ajouter des notes a une VM
Set-VM -Name "SRV-WEB01" -Notes "Serveur web production - Apache + PHP"
# Configurer le poids de demarrage (priorite)
Set-VM -Name "SRV-DC01" -AutomaticStartDelay 0
Set-VM -Name "SRV-WEB01" -AutomaticStartDelay 120
4. Stockage
4.1 VHD vs VHDX
| Caractéristique | VHD | VHDX |
|---|---|---|
| Taille maximale | 2 To | 64 To |
| Taille de bloc | 2 Mo (fixe) | Jusqu'à 256 Mo (configurable) |
| Taille de secteur logique | 512 octets | 512 octets ou 4 Ko |
| Protection corruption | Non | Oui (journal interne) |
| Redimensionnement à chaud | Non | Oui (Gen 2 uniquement) |
4.2 Disques dynamiques vs fixes
- Dynamique : le fichier VHDX grandit au fur et à mesure de l'utilisation. Économise l'espace disque mais légèrement moins performant.
- Fixe : la totalité de l'espace est allouée immédiatement. Meilleures performances I/O. Recommandé pour la production.
- Différencing : disque enfant qui stocke uniquement les différences par rapport à un disque parent. Utilisé pour les checkpoints et les scénarios de templates.
# Creer un disque VHDX dynamique
New-VHD -Path "D:\Hyper-V\VHDs\Data01.vhdx" -SizeBytes 100GB -Dynamic
# Creer un disque VHDX fixe
New-VHD -Path "D:\Hyper-V\VHDs\Data02.vhdx" -SizeBytes 100GB -Fixed
# Creer un disque de differenciation
New-VHD -Path "D:\Hyper-V\VHDs\Child.vhdx" `
-ParentPath "D:\Hyper-V\VHDs\Template-Win2022.vhdx" -Differencing
# Convertir un VHD en VHDX
Convert-VHD -Path "D:\Old\disk.vhd" -DestinationPath "D:\New\disk.vhdx" -VHDType Dynamic
# Convertir dynamique en fixe
Convert-VHD -Path "D:\VHDs\disk.vhdx" -DestinationPath "D:\VHDs\disk-fixed.vhdx" -VHDType Fixed
# Obtenir les informations d'un disque virtuel
Get-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01.vhdx"
4.3 Redimensionner un disque virtuel
# Agrandir un disque VHDX (VM eteinte ou Generation 2 a chaud)
Resize-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01.vhdx" -SizeBytes 120GB
# Reduire un disque VHDX (VM eteinte obligatoirement)
Resize-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01.vhdx" -SizeBytes 50GB -ToMinimumSize
# Compacter un disque dynamique (recuperer l'espace inutilise)
Optimize-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01.vhdx" -Mode Full
4.4 Ajouter et gérer les disques d'une VM
# Ajouter un disque SCSI a une VM
Add-VMHardDiskDrive -VMName "SRV-WEB01" -ControllerType SCSI `
-Path "D:\Hyper-V\VHDs\Data01.vhdx"
# Ajouter un controleur SCSI supplementaire
Add-VMScsiController -VMName "SRV-WEB01"
# Lister les disques d'une VM
Get-VMHardDiskDrive -VMName "SRV-WEB01"
# Retirer un disque d'une VM
Remove-VMHardDiskDrive -VMName "SRV-WEB01" -ControllerType SCSI `
-ControllerNumber 0 -ControllerLocation 1
4.5 Pass-through Disk
Un disque pass-through connecte directement un disque physique à une VM, offrant les meilleures performances I/O mais sans les avantages du format VHDX :
# Le disque physique doit etre "Offline" dans Disk Management cote hote
# Mettre le disque offline
Set-Disk -Number 2 -IsOffline $true
# Ajouter un disque pass-through a la VM
Add-VMHardDiskDrive -VMName "SRV-SQL01" -ControllerType SCSI -DiskNumber 2
4.6 Partages SMB 3.0
Hyper-V supporte le stockage des VM et VHDX sur des partages SMB 3.0 :
# Creer un partage SMB pour Hyper-V
New-SmbShare -Name "HyperV-VMs" -Path "E:\HyperV" `
-FullAccess "DOMAIN\HyperV-Hosts$", "DOMAIN\Admin" `
-Description "Stockage Hyper-V via SMB 3.0"
# Configurer les permissions NTFS
$acl = Get-Acl "E:\HyperV"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"DOMAIN\HyperV-Hosts$", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
Set-Acl "E:\HyperV" $acl
# Creer une VM sur un partage SMB
New-VM -Name "SRV-WEB02" -Generation 2 `
-MemoryStartupBytes 4GB `
-NewVHDPath "\\FileServer\HyperV-VMs\SRV-WEB02\SRV-WEB02.vhdx" `
-NewVHDSizeBytes 60GB `
-SwitchName "vSwitch-External" `
-Path "\\FileServer\HyperV-VMs\SRV-WEB02"
4.7 Storage Spaces
# Lister les disques physiques disponibles
Get-PhysicalDisk | Where-Object { $_.CanPool -eq $true }
# Creer un pool de stockage
New-StoragePool -FriendlyName "Pool-HyperV" `
-StorageSubSystemFriendlyName "Windows Storage*" `
-PhysicalDisks (Get-PhysicalDisk -CanPool $true)
# Creer un disque virtuel en miroir (RAID 1)
New-VirtualDisk -StoragePoolFriendlyName "Pool-HyperV" `
-FriendlyName "Disk-Mirror" -ResiliencySettingName Mirror `
-Size 500GB -ProvisioningType Fixed
# Creer un disque virtuel en parite (RAID 5)
New-VirtualDisk -StoragePoolFriendlyName "Pool-HyperV" `
-FriendlyName "Disk-Parity" -ResiliencySettingName Parity `
-Size 1TB -ProvisioningType Thin
# Initialiser et formater
Initialize-Disk -FriendlyName "Disk-Mirror" -PartitionStyle GPT
New-Partition -DiskNumber 3 -UseMaximumSize -DriveLetter F
Format-Volume -DriveLetter F -FileSystem ReFS -NewFileSystemLabel "HyperV-Data"
5. Checkpoints (Snapshots)
5.1 Types de checkpoints
Hyper-V propose deux types de checkpoints :
- Standard Checkpoint : capture l'état complet de la VM incluant la mémoire et l'état du processeur. Similaire à un snapshot classique. Non recommandé pour la production.
- Production Checkpoint : utilise VSS (Windows) ou fsfreeze (Linux) pour créer un checkpoint cohérent au niveau application. Recommandé pour la production.
# Configurer le type de checkpoint par defaut
Set-VM -Name "SRV-WEB01" -CheckpointType Production
# Types disponibles : Standard, Production, ProductionOnly, Disabled
# Desactiver completement les checkpoints
Set-VM -Name "SRV-SQL01" -CheckpointType Disabled
5.2 Créer et gérer les checkpoints
# Creer un checkpoint
Checkpoint-VM -Name "SRV-WEB01" -SnapshotName "Avant-MiseAJour-2024-01"
# Lister les checkpoints d'une VM
Get-VMCheckpoint -VMName "SRV-WEB01"
# Restaurer un checkpoint (la VM sera arretee si standard)
Restore-VMCheckpoint -VMName "SRV-WEB01" -Name "Avant-MiseAJour-2024-01" -Confirm:$false
# Supprimer un checkpoint (merge le fichier AVHDX dans le VHDX parent)
Remove-VMCheckpoint -VMName "SRV-WEB01" -Name "Avant-MiseAJour-2024-01"
# Supprimer TOUS les checkpoints d'une VM
Get-VMCheckpoint -VMName "SRV-WEB01" | Remove-VMCheckpoint
# Renommer un checkpoint
Rename-VMCheckpoint -VMName "SRV-WEB01" -Name "Ancien-Nom" -NewName "Nouveau-Nom"
5.3 Configurer l'emplacement des checkpoints
# Definir le chemin de stockage des checkpoints
Set-VM -Name "SRV-WEB01" -SnapshotFileLocation "D:\Hyper-V\Checkpoints"
# Verifier l'emplacement actuel
Get-VM -Name "SRV-WEB01" | Select-Object SnapshotFileLocation
5.4 Export et Import de VM
# Exporter une VM complete (incluant checkpoints et disques)
Export-VM -Name "SRV-WEB01" -Path "E:\Exports"
# Exporter uniquement un checkpoint specifique
Export-VMCheckpoint -VMName "SRV-WEB01" -Name "Checkpoint-Clean" `
-Path "E:\Exports"
# Importer une VM (generer un nouvel ID - copie)
Import-VM -Path "E:\Exports\SRV-WEB01\Virtual Machines\*.vmcx" `
-Copy -GenerateNewId
# Importer en specifiant les chemins
Import-VM -Path "E:\Exports\SRV-WEB01\Virtual Machines\*.vmcx" `
-Copy -GenerateNewId `
-VhdDestinationPath "D:\Hyper-V\VHDs" `
-VirtualMachinePath "D:\Hyper-V\VMs"
# Importer sans copie (register - deplacement)
Import-VM -Path "E:\Exports\SRV-WEB01\Virtual Machines\*.vmcx"
Export-VM pour créer des templates. Exportez une VM configurée, puis importez-la autant de fois que nécessaire avec -Copy -GenerateNewId pour créer de nouvelles instances.
5.5 Bonnes pratiques checkpoints
- Utilisez les Production Checkpoints en environnement de production
- Ne gardez pas de checkpoints plus de 48-72 heures
- Évitez de créer plus de 3 niveaux de checkpoints imbriqués
- Surveillez l'espace disque : les fichiers AVHDX peuvent grossir rapidement
- Désactivez les checkpoints sur les VM avec des workloads I/O intensifs (SQL Server, Exchange)
- Ne créez jamais de checkpoints sur des contrôleurs de domaine AD en production
6. Live Migration
6.1 Prérequis
- Les hôtes Hyper-V doivent être dans le même domaine Active Directory (ou configuration de délégation)
- Les processeurs doivent être compatibles entre les hôtes (même fabricant recommandé)
- Un réseau dédié à la migration est fortement recommandé
- Les virtual switches doivent avoir le même nom sur les hôtes source et destination
- L'utilisateur doit avoir les droits d'administration sur les deux hôtes
6.2 Activer Live Migration
# Activer Live Migration sur l'hote
Enable-VMMigration
# Configurer le nombre de migrations simultanees
Set-VMHost -MaximumVirtualMachineMigrations 4
# Configurer le reseau dedie a la migration
Add-VMMigrationNetwork -Subnet "10.0.100.0/24" -Priority 1
# Lister les reseaux de migration configures
Get-VMMigrationNetwork
# Configurer le type d'authentification
# CredSSP : simple mais ne supporte pas la migration depuis un 3eme serveur
# Kerberos : necessite la delegation contrainte mais plus flexible
Set-VMHost -VirtualMachineMigrationAuthenticationType Kerberos
# Configurer le mode de performance
# TCP : par defaut, compatible
# Compression : compresse les donnees en memoire (moins de bande passante)
# SMB : utilise SMB Direct si RDMA est disponible (meilleure performance)
Set-VMHost -VirtualMachineMigrationPerformanceOption SMB
6.3 Configurer la délégation contrainte Kerberos
# Sur chaque hote, configurer la delegation pour les autres hotes
# Dans Active Directory Users and Computers :
# 1. Ouvrir les proprietes du compte ordinateur de l'hote
# 2. Onglet "Delegation"
# 3. "Trust this computer for delegation to specified services only"
# 4. "Use Kerberos only"
# 5. Ajouter le service "cifs" et "Microsoft Virtual System Migration Service"
# du ou des serveurs de destination
# Via PowerShell (sur un DC ou avec RSAT AD)
$sourceHost = Get-ADComputer "HV-HOST01"
$destHost = Get-ADComputer "HV-HOST02"
Set-ADComputer $sourceHost -Add @{
'msDS-AllowedToDelegateTo' = @(
"cifs/$($destHost.Name)",
"cifs/$($destHost.DNSHostName)",
"Microsoft Virtual System Migration Service/$($destHost.Name)",
"Microsoft Virtual System Migration Service/$($destHost.DNSHostName)"
)
}
6.4 Exécuter une Live Migration
# Migration simple (stockage partage)
Move-VM -Name "SRV-WEB01" -DestinationHost "HV-HOST02"
# Shared Nothing Live Migration (sans stockage partage)
Move-VM -Name "SRV-WEB01" -DestinationHost "HV-HOST02" `
-DestinationStoragePath "D:\Hyper-V\VMs\SRV-WEB01"
# Migration du stockage uniquement (sans deplacer la VM)
Move-VMStorage -VMName "SRV-WEB01" -DestinationStoragePath "E:\Hyper-V\VMs\SRV-WEB01"
# Migration avec specification des chemins individuels
Move-VM -Name "SRV-WEB01" -DestinationHost "HV-HOST02" `
-VirtualMachinePath "D:\Hyper-V\VMs" `
-SnapshotFilePath "D:\Hyper-V\Checkpoints" `
-VhdDestinationPath "D:\Hyper-V\VHDs"
# Surveiller l'etat de la migration
Get-VM -Name "SRV-WEB01" | Select-Object Name, Status, `
@{N="MigrationProgress";E={$_.MigrationPercentComplete}}
6.5 Compatibilité processeur
# Activer la compatibilite processeur (pour migrer entre differentes generations)
Set-VMProcessor -VMName "SRV-WEB01" -CompatibilityForMigrationEnabled $true
# Verifier la compatibilite
Get-VMProcessor -VMName "SRV-WEB01" | Select-Object CompatibilityForMigrationEnabled
7. Failover Clustering
7.1 Prérequis
- Windows Server Datacenter ou Standard (même édition sur tous les nœuds)
- Tous les nœuds dans le même domaine Active Directory
- Stockage partagé (SAN iSCSI, Fibre Channel, Storage Spaces Direct, ou SMB 3.0)
- Réseaux dédiés : un pour le trafic cluster (heartbeat), un pour la migration, un pour le stockage, un pour les VM
- Configuration matérielle identique recommandée entre les nœuds
7.2 Installation du rôle Failover Clustering
# Installer sur tous les noeuds
Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools -Restart
# Valider la configuration du cluster (OBLIGATOIRE avant creation)
Test-Cluster -Node "HV-HOST01", "HV-HOST02" -Include "Storage", "Network", "Inventory"
# Generer un rapport complet
Test-Cluster -Node "HV-HOST01", "HV-HOST02" -ReportName "C:\ClusterValidation"
Test-Cluster avant de créer un cluster. Le rapport de validation identifie les problèmes potentiels. Microsoft ne supportera pas un cluster créé sans validation préalable.
7.3 Création du cluster
# Creer un cluster a deux noeuds
New-Cluster -Name "CLUSTER-HV" -Node "HV-HOST01", "HV-HOST02" `
-StaticAddress "192.168.1.50" -NoStorage
# Ajouter un noeud au cluster existant
Add-ClusterNode -Cluster "CLUSTER-HV" -Name "HV-HOST03"
# Verifier les noeuds du cluster
Get-ClusterNode -Cluster "CLUSTER-HV"
# Retirer un noeud du cluster
Remove-ClusterNode -Cluster "CLUSTER-HV" -Name "HV-HOST03" -Force
7.4 Configuration du Quorum
Le quorum détermine combien de défaillances le cluster peut tolérer. Chaque nœud dispose d'un vote, et un témoin (witness) peut ajouter un vote supplémentaire :
# Configurer un File Share Witness (recommande pour 2 noeuds)
Set-ClusterQuorum -Cluster "CLUSTER-HV" `
-FileShareWitness "\\FileServer\ClusterWitness"
# Configurer un Cloud Witness (Azure)
Set-ClusterQuorum -Cluster "CLUSTER-HV" -CloudWitness `
-AccountName "clusterwitness" `
-AccessKey "votre-cle-acces-azure"
# Configurer un Disk Witness
Set-ClusterQuorum -Cluster "CLUSTER-HV" -DiskWitness "Cluster Disk 1"
# Verifier la configuration du quorum
Get-ClusterQuorum -Cluster "CLUSTER-HV"
7.5 Cluster Shared Volumes (CSV)
Les CSV permettent à plusieurs nœuds d'accéder simultanément au même volume de stockage :
# Ajouter un disque au cluster
Get-ClusterAvailableDisk -Cluster "CLUSTER-HV" | Add-ClusterDisk
# Convertir un disque cluster en CSV
Add-ClusterSharedVolume -Cluster "CLUSTER-HV" -Name "Cluster Disk 2"
# Les CSV sont montes sous C:\ClusterStorage\Volume1, Volume2, etc.
# Lister les CSV
Get-ClusterSharedVolume -Cluster "CLUSTER-HV"
# Verifier l'etat des CSV
Get-ClusterSharedVolume | Select-Object Name, State, `
@{N="FreeSpace";E={($_.SharedVolumeInfo.Partition.FreeSpace / 1GB).ToString("N2") + " GB"}}
7.6 Haute disponibilité des VM
# Rendre une VM hautement disponible
Add-ClusterVirtualMachineRole -Cluster "CLUSTER-HV" -VMName "SRV-WEB01"
# Creer une VM directement en HA sur le cluster
New-VM -Name "SRV-WEB02" -Generation 2 `
-MemoryStartupBytes 4GB `
-NewVHDPath "C:\ClusterStorage\Volume1\SRV-WEB02\SRV-WEB02.vhdx" `
-NewVHDSizeBytes 60GB `
-SwitchName "vSwitch-External" `
-Path "C:\ClusterStorage\Volume1\SRV-WEB02"
Add-ClusterVirtualMachineRole -VMName "SRV-WEB02"
# Deplacer une VM vers un autre noeud (Live Migration via cluster)
Move-ClusterVirtualMachineRole -Name "SRV-WEB01" -Node "HV-HOST02"
# Lister les VM du cluster
Get-ClusterGroup -Cluster "CLUSTER-HV" | Where-Object GroupType -eq "VirtualMachine"
# Configurer la priorite de demarrage
(Get-ClusterGroup -Name "SRV-DC01").Priority = 3000 # Plus haute priorite
(Get-ClusterGroup -Name "SRV-WEB01").Priority = 2000
8. Hyper-V Replica
8.1 Présentation
Hyper-V Replica est un mécanisme de réplication asynchrone des VM entre deux hôtes Hyper-V, idéal pour la reprise après sinistre (DRP) :
- Réplication asynchrone toutes les 30 secondes, 5 minutes ou 15 minutes
- Fonctionne sur n'importe quel réseau (WAN inclus)
- Ne nécessite pas de stockage partagé ni de cluster
- Supporte la réplication en chaîne (site A → site B → site C)
- Authentification Kerberos (HTTP) ou certificat (HTTPS)
8.2 Configurer le serveur Replica
# Sur le serveur de destination (Replica Server)
# Activer Hyper-V Replica Broker
Set-VMReplicationServer -ReplicationEnabled $true `
-AllowedAuthenticationType Kerberos `
-KerberosAuthenticationPort 80 `
-DefaultStorageLocation "D:\Hyper-V\Replica"
# Pour l'authentification par certificat (HTTPS - recommande pour WAN)
Set-VMReplicationServer -ReplicationEnabled $true `
-AllowedAuthenticationType Certificate `
-CertificateAuthenticationPort 443 `
-CertificateThumbprint "A1B2C3D4E5F6..." `
-DefaultStorageLocation "D:\Hyper-V\Replica"
# Autoriser un serveur source specifique
New-VMReplicationAuthorizationEntry -AllowedPrimaryServer "HV-HOST01.domain.local" `
-ReplicaStorageLocation "D:\Hyper-V\Replica" `
-TrustGroup "Default"
# Autoriser tous les serveurs authentifies
New-VMReplicationAuthorizationEntry -AllowedPrimaryServer "*" `
-ReplicaStorageLocation "D:\Hyper-V\Replica" `
-TrustGroup "Default"
# Ouvrir le pare-feu pour Hyper-V Replica HTTP
Enable-Netfirewallrule -DisplayName "Hyper-V Replica HTTP Listener (TCP-In)"
# Ouvrir le pare-feu pour Hyper-V Replica HTTPS
Enable-Netfirewallrule -DisplayName "Hyper-V Replica HTTPS Listener (TCP-In)"
8.3 Activer la réplication d'une VM
# Activer la replication sur une VM (sur le serveur source)
Enable-VMReplication -VMName "SRV-WEB01" `
-ReplicaServerName "HV-HOST02.domain.local" `
-ReplicaServerPort 80 `
-AuthenticationType Kerberos `
-ReplicationFrequencySec 300 # 5 minutes
# Demarrer la replication initiale immediatement via le reseau
Start-VMInitialReplication -VMName "SRV-WEB01"
# Demarrer la replication initiale via export (pour gros volumes)
Start-VMInitialReplication -VMName "SRV-WEB01" `
-InitialReplicationStartTime "2024-01-15 22:00:00" # Planifiee
# Ou via un media externe
Start-VMInitialReplication -VMName "SRV-WEB01" `
-UseBackup -DestinationPath "E:\InitialReplica"
# Verifier l'etat de la replication
Get-VMReplication -VMName "SRV-WEB01"
Measure-VMReplication -VMName "SRV-WEB01"
8.4 Failover avec Hyper-V Replica
# Failover planifie (pas de perte de donnees)
# 1. Sur le serveur source, arreter proprement la VM
Stop-VM -Name "SRV-WEB01"
# 2. Lancer une derniere replication
Start-VMFailover -VMName "SRV-WEB01" -Prepare -ComputerName "HV-HOST01"
# 3. Sur le serveur replica, demarrer le failover
Start-VMFailover -VMName "SRV-WEB01" -ComputerName "HV-HOST02"
# 4. Demarrer la VM replica
Start-VM -Name "SRV-WEB01" -ComputerName "HV-HOST02"
# Failover non planifie (serveur source indisponible)
# Sur le serveur replica
Start-VMFailover -VMName "SRV-WEB01" -ComputerName "HV-HOST02"
Start-VM -Name "SRV-WEB01" -ComputerName "HV-HOST02"
# Choisir un point de recuperation specifique
$recovery = Get-VMReplicationCheckpoint -VMName "SRV-WEB01" -ComputerName "HV-HOST02"
Start-VMFailover -VMName "SRV-WEB01" -VMRecoveryCheckpoint $recovery[0]
# Annuler un failover (revenir en arriere)
Stop-VMFailover -VMName "SRV-WEB01" -ComputerName "HV-HOST02"
# Completer le failover (confirmer la bascule)
Complete-VMFailover -VMName "SRV-WEB01" -ComputerName "HV-HOST02"
# Inverser la replication (nouveau source = ancien replica)
Set-VMReplication -VMName "SRV-WEB01" -Reverse -ComputerName "HV-HOST02"
8.5 Resynchronisation
# Verifier si une resync est necessaire
Get-VMReplication | Where-Object { $_.Health -eq "Warning" -or $_.Health -eq "Critical" }
# Forcer la resynchronisation
Resume-VMReplication -VMName "SRV-WEB01" -Resynchronize
# Planifier la resynchronisation
Resume-VMReplication -VMName "SRV-WEB01" -Resynchronize `
-ResynchronizeStartTime "2024-01-15 02:00:00"
9. Nested Virtualization
9.1 Présentation
La virtualisation imbriquée permet d'exécuter Hyper-V à l'intérieur d'une VM Hyper-V. Cas d'usage courants :
- Environnements de test et de lab
- Formation et certification
- Développement avec conteneurs Windows (Docker)
- Test de clusters Hyper-V sans matériel dédié
- CI/CD avec VM imbriques
9.2 Prérequis et limites
- Windows Server 2016+ ou Windows 10+ comme hôte et comme guest
- VM de Génération 2 obligatoire
- Processeur Intel uniquement (AMD supporté à partir de Windows Server 2022)
- La mémoire dynamique n'est pas supportée sur la VM hôte
- Performances réduites par rapport à une virtualisation de premier niveau
- Le MAC Address Spoofing doit être activé pour le réseau des VM imbriquées
9.3 Activation
# La VM doit etre eteinte avant d'activer la nested virtualization
# Activer la virtualisation imbriquee sur une VM
Set-VMProcessor -VMName "HV-LAB01" -ExposeVirtualizationExtensions $true
# Configurer la memoire statique (obligatoire)
Set-VMMemory -VMName "HV-LAB01" -DynamicMemoryEnabled $false -StartupBytes 8GB
# Activer le MAC Spoofing pour le reseau des VM imbriquees
Set-VMNetworkAdapter -VMName "HV-LAB01" -MacAddressSpoofing On
# Verifier la configuration
Get-VMProcessor -VMName "HV-LAB01" | Select-Object ExposeVirtualizationExtensions
# A l'interieur de la VM, installer Hyper-V
# (connexion a la VM puis execution)
Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart
9.4 Configuration réseau pour Nested VMs
# Option 1 : NAT (le plus simple)
# Dans la VM hote, creer un switch Internal
New-VMSwitch -Name "NATSwitch" -SwitchType Internal
# Configurer une IP sur l'interface du switch
New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24 `
-InterfaceAlias "vEthernet (NATSwitch)"
# Creer la regle NAT
New-NetNat -Name "NestedNAT" -InternalIPInterfaceAddressPrefix "192.168.100.0/24"
# Option 2 : MAC Spoofing + External Switch
# Le MAC Spoofing doit etre active sur la VM hote (vu precedemment)
# Puis creer un External Switch dans la VM comme d'habitude
10. PowerShell Hyper-V
10.1 Cmdlets essentielles
# --- GESTION DES VM ---
Get-VM # Lister toutes les VM
Get-VM -Name "SRV-*" # Filtrer par nom
Start-VM -Name "SRV-WEB01" # Demarrer une VM
Stop-VM -Name "SRV-WEB01" # Arreter proprement (via OS)
Stop-VM -Name "SRV-WEB01" -Force # Forcer l'arret (comme couper l'alimentation)
Stop-VM -Name "SRV-WEB01" -TurnOff # Eteindre brutalement
Restart-VM -Name "SRV-WEB01" # Redemarrer
Suspend-VM -Name "SRV-WEB01" # Mettre en pause (sauvegarde etat memoire)
Resume-VM -Name "SRV-WEB01" # Reprendre une VM en pause
Save-VM -Name "SRV-WEB01" # Sauvegarder l'etat (hibernation)
Remove-VM -Name "SRV-OLD" -Force # Supprimer une VM (pas les disques)
# --- INFORMATIONS ---
Get-VM | Format-Table Name, State, CPUUsage, MemoryAssigned, Uptime
Get-VMProcessor -VMName "SRV-WEB01"
Get-VMMemory -VMName "SRV-WEB01"
Get-VMNetworkAdapter -VMName "SRV-WEB01"
Get-VMHardDiskDrive -VMName "SRV-WEB01"
Get-VMIntegrationService -VMName "SRV-WEB01"
# --- CONFIGURATION ---
Set-VM -Name "SRV-WEB01" -ProcessorCount 4
Set-VM -Name "SRV-WEB01" -MemoryStartupBytes 8GB
Set-VM -Name "SRV-WEB01" -AutomaticStartAction Start
Set-VM -Name "SRV-WEB01" -AutomaticStopAction ShutDown
10.2 Administration à distance
# Gerer un hote Hyper-V distant
Get-VM -ComputerName "HV-HOST02"
# Demarrer une VM sur un hote distant
Start-VM -Name "SRV-WEB01" -ComputerName "HV-HOST02"
# Session PowerShell distante
Enter-PSSession -ComputerName "HV-HOST02"
# ou
Invoke-Command -ComputerName "HV-HOST02" -ScriptBlock {
Get-VM | Format-Table Name, State, CPUUsage
}
# Gerer plusieurs hotes en parallele
$hosts = "HV-HOST01", "HV-HOST02", "HV-HOST03"
Invoke-Command -ComputerName $hosts -ScriptBlock {
Get-VM | Select-Object @{N="Host";E={$env:COMPUTERNAME}}, Name, State
} | Sort-Object Host, Name
10.3 Scripts courants
Rapport d'inventaire des VM
# Generer un rapport complet de toutes les VM
$report = Get-VM | ForEach-Object {
$vm = $_
$disk = Get-VHD -VMId $vm.VMId -ErrorAction SilentlyContinue
[PSCustomObject]@{
Name = $vm.Name
State = $vm.State
Generation = $vm.Generation
CPUs = $vm.ProcessorCount
MemoryGB = [math]::Round($vm.MemoryAssigned / 1GB, 2)
UptimeDays = [math]::Round($vm.Uptime.TotalDays, 1)
DiskSizeGB = [math]::Round(($disk | Measure-Object -Property Size -Sum).Sum / 1GB, 2)
DiskUsedGB = [math]::Round(($disk | Measure-Object -Property FileSize -Sum).Sum / 1GB, 2)
}
}
$report | Format-Table -AutoSize
$report | Export-Csv -Path "C:\Reports\VM-Inventory.csv" -NoTypeInformation
Démarrage séquentiel des VM
# Demarrer les VM dans un ordre precis avec delai
$vmOrder = @(
@{Name="SRV-DC01"; Delay=0},
@{Name="SRV-DC02"; Delay=30},
@{Name="SRV-SQL01"; Delay=60},
@{Name="SRV-WEB01"; Delay=90},
@{Name="SRV-WEB02"; Delay=90}
)
foreach ($vm in $vmOrder) {
Write-Host "Demarrage de $($vm.Name) dans $($vm.Delay) secondes..."
Start-Sleep -Seconds $vm.Delay
Start-VM -Name $vm.Name -ErrorAction SilentlyContinue
Write-Host "$($vm.Name) demarre." -ForegroundColor Green
}
Nettoyage des checkpoints anciens
# Supprimer les checkpoints de plus de 7 jours
$maxAge = (Get-Date).AddDays(-7)
Get-VM | Get-VMCheckpoint | Where-Object { $_.CreationTime -lt $maxAge } | ForEach-Object {
Write-Host "Suppression du checkpoint '$($_.Name)' de la VM '$($_.VMName)' cree le $($_.CreationTime)"
Remove-VMCheckpoint -VMName $_.VMName -Name $_.Name -Confirm:$false
}
Surveillance de l'espace disque des VHD
# Alerter si un disque dynamique depasse 85% de sa taille maximale
$threshold = 0.85
Get-VM | Get-VMHardDiskDrive | ForEach-Object {
$vhd = Get-VHD -Path $_.Path -ErrorAction SilentlyContinue
if ($vhd -and $vhd.VhdType -eq "Dynamic") {
$usage = $vhd.FileSize / $vhd.Size
if ($usage -gt $threshold) {
Write-Warning "VM: $($_.VMName) | Disque: $($_.Path) | Usage: $([math]::Round($usage * 100, 1))%"
}
}
}
10.4 Création en masse de VM
# Creer plusieurs VM a partir d'un template
$template = "D:\Templates\Template-Win2022.vhdx"
$vms = @(
@{Name="SRV-WEB01"; CPU=4; RAM=4GB; Disk=60GB},
@{Name="SRV-WEB02"; CPU=4; RAM=4GB; Disk=60GB},
@{Name="SRV-APP01"; CPU=8; RAM=16GB; Disk=100GB},
@{Name="SRV-SQL01"; CPU=8; RAM=32GB; Disk=200GB}
)
foreach ($vm in $vms) {
$vhdPath = "D:\Hyper-V\VHDs\$($vm.Name).vhdx"
# Copier le template
Copy-Item -Path $template -Destination $vhdPath
# Redimensionner le disque
Resize-VHD -Path $vhdPath -SizeBytes $vm.Disk
# Creer la VM
New-VM -Name $vm.Name -Generation 2 `
-MemoryStartupBytes $vm.RAM `
-VHDPath $vhdPath `
-SwitchName "vSwitch-External"
# Configurer les CPU
Set-VMProcessor -VMName $vm.Name -Count $vm.CPU
# Configurer la memoire dynamique
Set-VMMemory -VMName $vm.Name -DynamicMemoryEnabled $true `
-MinimumBytes ($vm.RAM / 2) -MaximumBytes ($vm.RAM * 2)
Write-Host "VM $($vm.Name) creee avec succes." -ForegroundColor Green
}
11. Sécurité
11.1 Shielded VMs
Les Shielded VMs protègent les VM contre l'accès non autorisé, même par les administrateurs de l'infrastructure :
- Chiffrement BitLocker des disques virtuels
- vTPM pour stocker les clés de chiffrement
- Secure Boot obligatoire
- Pas d'accès console (VMConnect limité)
- Les administrateurs Hyper-V ne peuvent pas inspecter la mémoire ou le disque
11.2 Guarded Fabric
L'infrastructure Guarded Fabric est composée de trois composants :
- Host Guardian Service (HGS) : service qui atteste de l'intégrité des hôtes Hyper-V
- Guarded Hosts : hôtes Hyper-V approuvés par le HGS
- Shielded VMs : les VM protégées elles-mêmes
# --- Installation du Host Guardian Service (sur un serveur dedie) ---
Install-WindowsFeature -Name HostGuardianServiceRole -IncludeManagementTools -Restart
# Initialiser HGS en mode TPM (le plus securise)
Initialize-HgsServer -HgsServiceName "HGS" `
-TrustTpm `
-SigningCertificateThumbprint "CERT-THUMB-1" `
-EncryptionCertificateThumbprint "CERT-THUMB-2"
# --- Configuration des Guarded Hosts ---
# Sur chaque hote Hyper-V
Install-WindowsFeature -Name HostGuardian -IncludeManagementTools
# Configurer l'URL du HGS
Set-HgsClientConfiguration -AttestationServerUrl "https://hgs.domain.local/Attestation" `
-KeyProtectionServerUrl "https://hgs.domain.local/KeyProtection"
# Verifier l'attestation
Get-HgsClientConfiguration
11.3 Créer une Shielded VM
# Creer un Key Protector
$owner = New-HgsGuardian -Name "Owner" -GenerateCertificates
$guardian = Get-HgsGuardian -Name "HGS"
$kp = New-HgsKeyProtector -Owner $owner -Guardian $guardian -AllowUntrustedRoot
# Creer le Shielding Data File (PDK)
New-ShieldingDataFile -ShieldingDataFilePath "C:\Temp\ShieldedVM.pdk" `
-Owner $owner `
-Guardian $guardian `
-VolumeIDQualifier (New-VolumeIDQualifier -VolumeSignatureCatalogFilePath "C:\Temp\VSC.vsc" `
-VersionRule Equals) `
-WindowsUnattendFile "C:\Temp\unattend.xml" `
-Policy Shielded
# Provisionner la VM
Initialize-ShieldedVM -VMName "SRV-SHIELDED01" `
-ShieldingDataFilePath "C:\Temp\ShieldedVM.pdk"
11.4 Intégration BitLocker
# Activer le vTPM sur la VM (prerequis pour BitLocker dans la VM)
Set-VMKeyProtector -VMName "SRV-WEB01" -NewLocalKeyProtector
Enable-VMTPM -VMName "SRV-WEB01"
# Puis dans la VM Windows :
# Activer BitLocker sur le volume C:
Enable-BitLocker -MountPoint "C:" -EncryptionMethod XtsAes256 -TpmProtector
# Sauvegarder la cle de recuperation dans AD
Backup-BitLockerKeyProtector -MountPoint "C:" -KeyProtectorId (
(Get-BitLockerVolume -MountPoint "C:").KeyProtector |
Where-Object KeyProtectorType -eq "RecoveryPassword"
).KeyProtectorId
11.5 Bonnes pratiques de sécurité
- Appliquer les mises à jour Windows régulièrement sur les hôtes Hyper-V
- Utiliser des comptes de service dédiés (pas le compte administrateur)
- Activer Windows Defender / antivirus avec exclusions Hyper-V
- Segmenter les réseaux : management, VM, migration, stockage
- Configurer l'audit des événements Hyper-V
- Utiliser le chiffrement SMB 3.0 pour le stockage partagé
- Activer Credential Guard sur les hôtes
- Restreindre l'accès PowerShell via JEA (Just Enough Administration)
# Configurer les exclusions antivirus pour Hyper-V
# Processus a exclure :
# - vmms.exe (Virtual Machine Management Service)
# - vmwp.exe (Virtual Machine Worker Process)
# - vmsp.exe (Virtual Machine Security Process)
# - vmcompute.exe
# Dossiers a exclure :
# - Chemin des VMs (par defaut C:\ProgramData\Microsoft\Windows\Hyper-V)
# - Chemin des VHD/VHDX
# - Chemin des checkpoints
Add-MpPreference -ExclusionProcess "vmms.exe", "vmwp.exe", "vmsp.exe", "vmcompute.exe"
Add-MpPreference -ExclusionPath "D:\Hyper-V\VMs", "D:\Hyper-V\VHDs"
Add-MpPreference -ExclusionExtension ".vhd", ".vhdx", ".avhdx", ".vsv", ".iso"
12. Monitoring et Performance
12.1 Compteurs de performance Hyper-V
Windows Performance Monitor (perfmon) inclut des compteurs spécifiques à Hyper-V :
- Hyper-V Hypervisor Logical Processor : utilisation CPU des processeurs logiques
- Hyper-V Hypervisor Virtual Processor : utilisation CPU par VM
- Hyper-V Virtual Storage Device : I/O disque par VM
- Hyper-V Virtual Network Adapter : trafic réseau par VM
- Hyper-V Dynamic Memory VM : utilisation mémoire dynamique
- Hyper-V VM Vid Partition : mémoire physique attribuée
# Collecter les compteurs de performance CPU
Get-Counter "\Hyper-V Hypervisor Logical Processor(*)\% Total Run Time" -SampleInterval 5 -MaxSamples 12
# Collecter les compteurs memoire
Get-Counter "\Hyper-V Dynamic Memory VM(*)\Current Pressure" -SampleInterval 5
# Collecter les compteurs disque
Get-Counter "\Hyper-V Virtual Storage Device(*)\Read Bytes/sec" -SampleInterval 5
Get-Counter "\Hyper-V Virtual Storage Device(*)\Write Bytes/sec" -SampleInterval 5
# Collecter les compteurs reseau
Get-Counter "\Hyper-V Virtual Network Adapter(*)\Bytes Sent/sec" -SampleInterval 5
Get-Counter "\Hyper-V Virtual Network Adapter(*)\Bytes Received/sec" -SampleInterval 5
# Creer un collecteur de donnees automatise
$counters = @(
"\Hyper-V Hypervisor Logical Processor(_Total)\% Total Run Time",
"\Hyper-V Hypervisor Virtual Processor(*)\% Total Run Time",
"\Memory\Available MBytes",
"\Hyper-V Dynamic Memory VM(*)\Current Pressure"
)
# Demarrer la collecte dans un fichier CSV
Get-Counter -Counter $counters -SampleInterval 30 -MaxSamples 2880 |
Export-Counter -Path "C:\PerfLogs\HyperV-24h.csv" -FileFormat CSV
12.2 Resource Metering
Resource Metering permet de mesurer la consommation de ressources par VM pour la facturation ou la planification de capacité :
# Activer Resource Metering sur une VM
Enable-VMResourceMetering -VMName "SRV-WEB01"
# Activer sur toutes les VM
Get-VM | Enable-VMResourceMetering
# Obtenir les mesures
Measure-VM -VMName "SRV-WEB01"
# Obtenir les mesures detaillees
Measure-VM -VMName "SRV-WEB01" | Select-Object VMName, `
AvgCPU, AvgRAM, TotalDisk, `
@{N="NetworkInMB";E={[math]::Round($_.NetworkMeteredTrafficReport.InboundTraffic / 1MB, 2)}}, `
@{N="NetworkOutMB";E={[math]::Round($_.NetworkMeteredTrafficReport.OutboundTraffic / 1MB, 2)}}
# Rapport complet de toutes les VM
Get-VM | Measure-VM | Format-Table VMName, AvgCPU, AvgRAM, TotalDisk -AutoSize
# Reinitialiser les compteurs
Reset-VMResourceMetering -VMName "SRV-WEB01"
# Desactiver
Disable-VMResourceMetering -VMName "SRV-WEB01"
12.3 Event Viewer
Les journaux d'événements Hyper-V se trouvent sous :
Applications and Services Logs → Microsoft → Windows → Hyper-V-VMMSApplications and Services Logs → Microsoft → Windows → Hyper-V-WorkerApplications and Services Logs → Microsoft → Windows → Hyper-V-ConfigApplications and Services Logs → Microsoft → Windows → Hyper-V-Hypervisor
# Consulter les evenements Hyper-V recents
Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-VMMS-Admin" -MaxEvents 50 |
Format-Table TimeCreated, Id, LevelDisplayName, Message -Wrap
# Rechercher les erreurs
Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-Worker-Admin" |
Where-Object { $_.Level -eq 2 } | # Level 2 = Error
Select-Object TimeCreated, Id, Message -First 20
# Rechercher les evenements lies a une VM specifique
Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-VMMS-Admin" |
Where-Object { $_.Message -like "*SRV-WEB01*" } |
Select-Object TimeCreated, Id, Message -First 10
# Exporter les logs dans un fichier
Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-VMMS-Admin" -MaxEvents 1000 |
Export-Csv -Path "C:\Logs\HyperV-Events.csv" -NoTypeInformation
12.4 Surveillance en temps réel avec PowerShell
# Tableau de bord simple en temps reel
while ($true) {
Clear-Host
Write-Host "=== HYPER-V DASHBOARD === $(Get-Date -Format 'HH:mm:ss')" -ForegroundColor Cyan
Write-Host ""
Get-VM | Format-Table @(
"Name",
"State",
@{N="CPU %"; E={$_.CPUUsage}; Align="Right"},
@{N="RAM (GB)"; E={[math]::Round($_.MemoryAssigned/1GB,1)}; Align="Right"},
@{N="Uptime"; E={$_.Uptime.ToString("dd\.hh\:mm\:ss")}},
@{N="Status"; E={$_.Status}}
) -AutoSize
$totalRAM = [math]::Round((Get-VMHost).MemoryCapacity / 1GB, 1)
$usedRAM = [math]::Round((Get-VM | Where-Object State -eq "Running" |
Measure-Object -Property MemoryAssigned -Sum).Sum / 1GB, 1)
Write-Host "RAM Totale: $totalRAM GB | Utilisee: $usedRAM GB | Disponible: $($totalRAM - $usedRAM) GB"
Start-Sleep -Seconds 5
}
13. Sauvegarde
13.1 Windows Server Backup
# Installer Windows Server Backup
Install-WindowsFeature -Name Windows-Server-Backup -IncludeManagementTools
# Creer une politique de sauvegarde pour les VM
$policy = New-WBPolicy
$schedule = New-WBSchedule -Policy $policy -Time "02:00"
# Ajouter le volume contenant les VM
$volume = New-WBVolume -VolumePath "D:"
Add-WBVolume -Policy $policy -Volume $volume
# Definir la cible de sauvegarde (partage reseau)
$target = New-WBBackupTarget -NetworkPath "\\BackupServer\Backups" `
-Credential (Get-Credential)
Add-WBBackupTarget -Policy $policy -Target $target
# Activer la sauvegarde VSS (coherence applicative)
Set-WBVssBackupOption -Policy $policy -VssCopyBackup
# Sauvegarder l'etat systeme
Add-WBSystemState -Policy $policy
# Appliquer la politique
Set-WBPolicy -Policy $policy
# Lancer une sauvegarde manuelle
Start-WBBackup -Policy (Get-WBPolicy) -Async
# Verifier le statut de la derniere sauvegarde
Get-WBSummary
Get-WBJob -Previous 1
13.2 Export de VM (sauvegarde simple)
# Exporter une VM (peut se faire a chaud)
Export-VM -Name "SRV-WEB01" -Path "E:\Backups\$(Get-Date -Format 'yyyy-MM-dd')"
# Script de sauvegarde quotidienne par export
$backupPath = "E:\Backups\$(Get-Date -Format 'yyyy-MM-dd')"
$retention = 7 # Garder 7 jours
# Creer le dossier
New-Item -Path $backupPath -ItemType Directory -Force
# Exporter toutes les VM en cours d'execution
Get-VM | Where-Object State -eq "Running" | ForEach-Object {
Write-Host "Export de $($_.Name)..."
Export-VM -Name $_.Name -Path $backupPath
Write-Host "$($_.Name) exporte avec succes." -ForegroundColor Green
}
# Nettoyer les anciens backups
Get-ChildItem "E:\Backups" -Directory |
Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$retention) } |
ForEach-Object {
Write-Host "Suppression de $($_.FullName)..."
Remove-Item $_.FullName -Recurse -Force
}
13.3 Sauvegarde avec Veeam (exemple)
Veeam Backup & Replication est la solution la plus populaire pour la sauvegarde Hyper-V :
- Sauvegarde incrémentielle au niveau bloc (Changed Block Tracking)
- Restauration granulaire (fichiers, AD, SQL, Exchange)
- Réplication vers un site distant
- SureBackup : vérification automatique des sauvegardes
- Instant VM Recovery : démarrer une VM directement depuis la sauvegarde
13.4 Bonnes pratiques de sauvegarde
- Suivre la règle 3-2-1 : 3 copies, 2 médias différents, 1 hors site
- Tester régulièrement la restauration (au moins une fois par mois)
- Utiliser les Production Checkpoints pour la cohérence applicative
- Planifier les sauvegardes en dehors des heures de pointe
- Monitorer les jobs de sauvegarde et configurer des alertes
- Documenter les procédures de restauration et les tester
- Chiffrer les sauvegardes, surtout celles stockées hors site
- Exclure les fichiers de pagination (pagefile) et les swap files des sauvegardes
14. Dépannage
14.1 VM qui ne démarre pas
# Verifier l'etat de la VM
Get-VM -Name "SRV-WEB01" | Select-Object Name, State, Status, OperationalStatus
# Erreur "The virtual machine could not be started because the hypervisor is not running"
# Solution : verifier que le role Hyper-V est bien installe et que VT-x est active dans le BIOS
bcdedit /set hypervisorlaunchtype auto
# Puis redemarrer le serveur
# Erreur Secure Boot
# Desactiver temporairement Secure Boot pour diagnostiquer
Set-VMFirmware -VMName "SRV-LINUX01" -EnableSecureBoot Off
# Verifier les fichiers de configuration de la VM
Get-VM -Name "SRV-WEB01" | Select-Object Path, ConfigurationLocation
# Reparer une VM dont le fichier de config est corrompu
# Reimporter depuis le dossier de configuration
$vmcx = Get-ChildItem "D:\Hyper-V\VMs\SRV-WEB01" -Filter "*.vmcx" -Recurse
Import-VM -Path $vmcx.FullName
14.2 VM bloquée (stuck)
# Si une VM est dans l'etat "Starting", "Stopping", "Saving", ou "Pausing" et ne repond plus
# Identifier le PID du worker process de la VM
$vmId = (Get-VM -Name "SRV-WEB01").Id
$workerProcess = Get-Process vmwp | Where-Object {
$_.CommandLine -like "*$vmId*" -or $_.Id -eq (
Get-CimInstance Win32_Process -Filter "Name='vmwp.exe'" |
Where-Object CommandLine -like "*$vmId*"
).ProcessId
}
# Tuer le worker process (DERNIERE OPTION - equivalent a couper l'alimentation)
Stop-Process -Id $workerProcess.Id -Force
# Alternative : forcer l'arret via WMI
$vm = Get-WmiObject -Namespace "root\virtualization\v2" `
-Class Msvm_ComputerSystem -Filter "ElementName='SRV-WEB01'"
$vm.RequestStateChange(3) # 3 = TurnOff
# Redemarrer le service VMMS si plusieurs VM sont bloquees
Restart-Service vmms -Force
# ATTENTION : cela affecte TOUTES les VM sur l'hote
14.3 Problèmes réseau
# Verifier la connectivite du virtual switch
Get-VMSwitch | Select-Object Name, SwitchType, NetAdapterInterfaceDescription, AllowManagementOS
# Verifier les cartes reseau des VM
Get-VM | Get-VMNetworkAdapter | Select-Object VMName, Name, SwitchName, `
MacAddress, IPAddresses, Status
# Reinitialiser un virtual switch problematique
# 1. Deconnecter les VM du switch
Get-VM | Get-VMNetworkAdapter | Where-Object SwitchName -eq "vSwitch-Old" |
Disconnect-VMNetworkAdapter
# 2. Supprimer le switch
Remove-VMSwitch -Name "vSwitch-Old" -Force
# 3. Recreer le switch
New-VMSwitch -Name "vSwitch-External" -NetAdapterName "Ethernet0" -AllowManagementOS $true
# 4. Reconnecter les VM
Get-VM | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName "vSwitch-External"
# Verifier les VLANs
Get-VMNetworkAdapterVlan -VMName "SRV-WEB01"
# Capturer le trafic reseau pour diagnostic
# Utiliser pktmon (integre a Windows Server 2019+)
pktmon start --etw -p 0 -c 1
# Laisser tourner quelques minutes puis
pktmon stop
pktmon format pktmon.etl -o pktmon.txt
14.4 Problèmes de disque et stockage
# Verifier l'integrite d'un fichier VHDX
Test-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01.vhdx"
# Reparer une chaine de checkpoints cassee
# Lister les fichiers AVHDX
Get-ChildItem "D:\Hyper-V\VHDs" -Filter "*.avhdx" -Recurse
# Merger manuellement un AVHDX dans son parent
Merge-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01_checkpointID.avhdx" `
-DestinationPath "D:\Hyper-V\VHDs\SRV-WEB01.vhdx"
# Monter un VHDX pour inspecter son contenu
Mount-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01.vhdx" -ReadOnly
# Le disque apparait dans Disk Management / Explorer
# Pour demonter
Dismount-VHD -Path "D:\Hyper-V\VHDs\SRV-WEB01.vhdx"
# Erreur "The process cannot access the file because it is being used by another process"
# Verifier quel processus verrouille le fichier
Get-Process | Where-Object {
$_.Modules.FileName -like "*SRV-WEB01*"
} | Select-Object Id, ProcessName
14.5 Problèmes de mémoire
# Verifier l'utilisation memoire de l'hote
Get-VMHost | Select-Object MemoryCapacity, `
@{N="MemoryUsed";E={
(Get-VM | Where-Object State -eq "Running" |
Measure-Object -Property MemoryAssigned -Sum).Sum
}}
# Verifier la pression memoire par VM
Get-VM | Where-Object State -eq "Running" | Select-Object Name, `
@{N="Assigned (GB)";E={[math]::Round($_.MemoryAssigned/1GB,2)}}, `
@{N="Demand (GB)";E={[math]::Round($_.MemoryDemand/1GB,2)}}, `
MemoryStatus
# Si "Low" apparait dans MemoryStatus, la VM manque de memoire
# Augmenter la memoire maximale
Set-VMMemory -VMName "SRV-WEB01" -MaximumBytes 16GB
# Verifier la configuration de memoire dynamique
Get-VMMemory -VMName "SRV-WEB01" | Select-Object *
14.6 BSOD / Crash de l'hôte
# Verifier les dumps de crash
Get-ChildItem "C:\Windows\Minidump" -ErrorAction SilentlyContinue
Get-ChildItem "C:\Windows\MEMORY.DMP" -ErrorAction SilentlyContinue
# Verifier les evenements critiques recents
Get-WinEvent -LogName System -MaxEvents 100 |
Where-Object { $_.Level -eq 1 -or $_.Level -eq 2 } |
Select-Object TimeCreated, Id, ProviderName, Message | Format-List
# Verifier les evenements Hyper-V Hypervisor
Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-Hypervisor-Admin" -MaxEvents 50 |
Where-Object { $_.Level -le 3 } |
Select-Object TimeCreated, Id, Message
# Erreurs courantes et solutions :
# - "CLOCK_WATCHDOG_TIMEOUT" : probleme de driver ou firmware CPU, mettre a jour le BIOS
# - "WHEA_UNCORRECTABLE_ERROR" : erreur materielle (RAM, CPU), lancer un diagnostic
# - "HYPERVISOR_ERROR" : conflit avec autre hyperviseur (VMware, VirtualBox)
14.7 Outils de diagnostic
# Verifier l'etat general de Hyper-V
Get-VMHost | Format-List *
# Verifier les services Hyper-V
Get-Service vm* | Select-Object Name, DisplayName, Status, StartType
# Services essentiels :
# vmms - Hyper-V Virtual Machine Management
# vmcompute - Hyper-V Host Compute Service
# vmicheartbeat - Hyper-V Heartbeat Service
# vmicshutdown - Hyper-V Guest Shutdown Service
# Redemarrer les services Hyper-V (si probleme)
Restart-Service vmms -Force
Restart-Service vmcompute -Force
# Verifier la version de Hyper-V
Get-WmiObject -Namespace "root\virtualization\v2" `
-Class Msvm_VirtualSystemManagementServiceSettingData |
Select-Object Version
# Exporter la configuration Hyper-V pour diagnostic
Get-VMHost | Export-Clixml "C:\Temp\VMHost-Config.xml"
Get-VM | Export-Clixml "C:\Temp\VM-Config.xml"
Get-VMSwitch | Export-Clixml "C:\Temp\VMSwitch-Config.xml"
# Verifier les mises a jour en attente
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10
14.8 Récupérer une VM orpheline
# Si une VM a disparu de la console mais les fichiers existent toujours
# Rechercher les fichiers de configuration VMCX
$vmcxFiles = Get-ChildItem -Path "D:\Hyper-V" -Filter "*.vmcx" -Recurse
# Reimporter chaque VM trouvee
foreach ($vmcx in $vmcxFiles) {
Write-Host "Tentative d'import : $($vmcx.FullName)"
try {
$report = Compare-VM -Path $vmcx.FullName
if ($report.Incompatibilities.Count -eq 0) {
Import-VM -CompatibilityReport $report
Write-Host "Import reussi !" -ForegroundColor Green
} else {
Write-Warning "Incompatibilites detectees :"
$report.Incompatibilities | ForEach-Object {
Write-Warning " - $($_.Message)"
}
}
} catch {
Write-Error "Echec de l'import : $_"
}
}
Export-VM ou Export-Clixml). Cela facilite grandement la récupération en cas de problème avec la base de données Hyper-V.