
Discovod - stock.adobe.com
Hyper-V Storage effizient verwalten und Engpässe vermeiden
Hyper-V bringt unter Windows Server 2022 und 2025 erweiterte Möglichkeiten zur Analyse und Optimierung des Storage-Verbrauchs, von Snapshots bis hin zu Cluster-Storage.
Hyper-V in Windows Server 2022 und Windows Server 2025 bringt verschiedene Werkzeuge für die effiziente Verwaltung virtueller Festplatten mit. In der Realität entstehen dennoch häufig Speicherprobleme durch zu groß dimensionierte VHDX-Dateien, vergessene Snapshots oder alte Testmaschinen, die nie entfernt wurden. Eine fundierte Analyse des Storage-Verbrauchs kombiniert Abfragen in PowerShell mit den erweiterten Verwaltungsfunktionen der neuen Hyper-V-Versionen und erlaubt eine Optimierung bis ins Detail.
Überblick durch Resource Metering und eigene Auswertungen
Für eine kontinuierliche Erfassung des Ressourcenbedarfs einer virtuellen Maschine (VM) eignet sich Resource Metering. Damit werden Daten wie belegter Speicher, I/O-Last und Disk Allocation über längere Zeiträume gesammelt. Resource Metering erlaubt es, den Ressourcenverbrauch einer einzelnen VM oder mehrerer VMs über einen längeren Zeitraum hinweg zu erfassen. Dabei geht es nicht nur um Arbeitsspeicher oder CPU, sondern auch um Netzwerkverkehr und vor allem den Storage-Bedarf. Wird Resource Metering für eine VM aktiviert, protokolliert Hyper-V Kennzahlen wie:
- die insgesamt zugewiesene und genutzte Speichermenge
- die Anzahl und Größe der I/O-Operationen auf den virtuellen Festplatten
- den Netzwerkdurchsatz, getrennt nach ein- und ausgehendem Verkehr
- die Dauer der Messung, wodurch eine zeitliche Einordnung möglich wird
Diese Daten eignen sich für Kapazitätsplanung, Abrechnung von Ressourcen (Chargeback) oder um Lastspitzen zu erkennen, die durch bestimmte Workloads entstehen. Besonders in Umgebungen mit vielen VMs ist Resource Metering ein Werkzeug, um Transparenz in den Storage-Verbrauch zu bringen, den Hyper-V Manager alleine nicht bietet.
Die Aktivierung erfolgt einmalig pro VM, danach werden die Daten automatisch gesammelt. Über PowerShell lassen sich die Werte jederzeit abrufen, formatieren und in eigene Reports integrieren. Das ist nützlich, wenn Administratoren Trends über Wochen oder Monate nachvollziehen oder die Grundlage für Storage-Erweiterungen ermitteln wollen. Der Start erfolgt mit einem eigenen Cmdlet:
# Einschalten pro VM
Enable-VMResourceMetering -VMName "SRV-01"
# Werte ziehen und komprimiert anzeigen
Measure-VM -VMName "SRV-01" |
Select-Object VMName,
@{n="Disk gesamt GB";e={[math]::Round($_.TotalDiskAllocation/1GB,2)}},
@{n="Dauer";e={$_.MeteringDuration}},
@{n="IO Lesen MB";e={[math]::Round($_.HardDiskReadBytes/1MB,2)}},
@{n="IO Schreiben MB";e={[math]::Round($_.HardDiskWriteBytes/1MB,2)}}
Damit lassen sich nicht nur Trends erkennen, sondern auch Prognosen erstellen, wenn die Daten in ein zentrales Monitoring übernommen werden. Gerade in Umgebungen mit vielen VMs ergibt sich daraus ein Frühwarnsystem für Engpässe.
Zuweisung und Nutzung vergleichen
Hyper-V unterscheidet zwischen der konfigurierten Maximalgröße einer virtuellen Festplatte und der tatsächlichen Dateigröße. Beide Werte auseinanderzuhalten ist entscheidend. Eine PowerShell-Schleife kann jede VM abfragen und die Disk-Auslastung berechnen:
Get-VM | ForEach-Object {
$vm = $_.Name
Get-VMHardDiskDrive -VMName $vm | ForEach-Object {
$disk = Get-VHD -Path $_.Path
[PSCustomObject]@{
"VM" = $vm
"Disk" = (Split-Path $disk.Path -Leaf)
"Kapazität (GB)"= [math]::Round($disk.Size/1GB,1)
"Belegt (GB)" = [math]::Round($disk.FileSize/1GB,1)
"Auslastung (%)"= [math]::Round(($disk.FileSize/$disk.Size)*100,1)
}
}
} | Sort-Object "Auslastung (%)" -Descending | Format-Table
Die Abfrage macht sichtbar, ob Disks überfüllt sind oder ungenutzt Speicherplatz binden. Fixe Platten, die mit 200 GB angelegt und dauerhaft nur zu 15 GB belegt sind, sollten konsequent verkleinert oder auf dynamische VHDX migriert werden.

Snapshots und differenzierende Disks kontrollieren
Prüfpunkte (Checkpoints) sichern den Zustand einer VM, verursachen aber durch differenzierende Festplatten erheblichen Speicherverbrauch. Eine Analyse der Prüfpunkte mit eigenem Cmdlet zeigt Datum und Größe:
# Optional, falls das Modul nicht automatisch geladen wird
Import-Module Hyper-V
Get-VM | ForEach-Object {
$vm = $_.Name
$snaps = Get-VMSnapshot -VMName $vm -ErrorAction SilentlyContinue
if ($snaps) {
foreach ($s in $snaps) {
# Pfade der differenzierenden Disks zum Checkpoint sammeln
$avhdxPaths = @()
$s.HardDrives | ForEach-Object {
if ($_.Path) { $avhdxPaths += $_.Path }
}
# Größe aller AVHDX-Dateien summieren
$sizeBytes = 0
foreach ($p in $avhdxPaths) {
if (Test-Path -LiteralPath $p) {
$sizeBytes += (Get-Item -LiteralPath $p).Length
}
}
[PSCustomObject]@{
VM = $vm
Checkpoint = $s.Name
Erstellt = $s.CreationTime
Dateien = ($avhdxPaths -join "; ")
"Groesse (GB)"= [math]::Round($sizeBytes / 1GB, 2)
}
}
}
} | Sort-Object Erstellt -Descending | Format-Table -Auto
Das Skript durchsucht alle virtuellen Maschinen auf einem Hyper-V-Host nach vorhandenen Checkpoints, ermittelt zu jedem Prüfpunkt das Erstellungsdatum und summiert die Größen der dazugehörigen differenzierenden AVHDX-Dateien. In der Ausgabe erscheint für jede VM eine Liste mit Name, Checkpoint, Zeitpunkt der Erstellung und belegtem Speicher. Der Nutzen liegt darin, dass Administratoren sofort erkennen, welche Snapshots Speicherplatz beanspruchen und wie alt sie sind. Damit lassen sich verwaiste oder überfällige Prüfpunkte gezielt entfernen, bevor sie übermäßig viel Storage blockieren und die Performance der betroffenen VMs verschlechtern.

Verwaiste VHDs aufspüren
Ein klassisches Problem: Eine VM wird im Hyper-V-Manager gelöscht, ihre Festplatten bleiben bestehen. Diese Dateien tauchen nicht mehr in den Konfigurationsobjekten auf, belegen aber weiterhin Speicher. Eine erweiterte Abfrage ermittelt alle VHDX-Dateien im Repository und gleicht sie mit den aktuell gebundenen Disks ab:
# Verwaiste VHD/VHDX/AVHDX unter C:\vm finden
# Erfasst alle an VMs gebundenen Disks inkl. kompletter Differencing-Ketten
# und vergleicht sie mit allen Dateien im Repository C:\vm
Import-Module Hyper-V
$repo = 'C:\vm'
function Get-AttachedDiskFiles {
param([string[]]$Paths)
$set = New-Object System.Collections.Generic.HashSet[string] ([System.StringComparer]::OrdinalIgnoreCase)
foreach ($p in $Paths) {
if (-not (Test-Path -LiteralPath $p)) { continue }
try {
$vhd = Get-VHD -Path $p -ErrorAction Stop
while ($null -ne $vhd) {
[void]$set.Add($vhd.Path)
if ($vhd.VhdType -ne 'Differencing' -or [string]::IsNullOrEmpty($vhd.ParentPath)) { break }
$vhd = Get-VHD -Path $vhd.ParentPath -ErrorAction Stop
}
} catch { }
}
return $set
}
# Alle an VMs gebundenen Leaf-Disks einsammeln
$attachedLeafs = Get-VM | Get-VMHardDiskDrive | Select-Object -ExpandProperty Path
# Kompletten Satz referenzierter Dateien inkl. AVHDX-Kette bilden
$attachedSet = Get-AttachedDiskFiles -Paths $attachedLeafs
# Alle VHD/VHDX/AVHDX unter C:\vm erfassen
$allDisks = Get-ChildItem -Path $repo -Recurse -Include *.vhd,*.vhdx,*.avhdx -File -ErrorAction SilentlyContinue
# Nicht zugeordnete Dateien ausgeben
$orphans = foreach ($f in $allDisks) {
if (-not $attachedSet.Contains($f.FullName)) {
[pscustomobject]@{
Verwaist = $f.FullName
Groesse_GB = [math]::Round($f.Length/1GB,2)
Geaendert = $f.LastWriteTime
}
}
}
$orphans | Sort-Object Groesse_GB -Descending | Format-Table -Auto
Das Skript durchsucht den Speicherort C:\vm mit allen Unterverzeichnissen nach VHD-, VHDX- und AVHDX-Dateien und vergleicht diese mit den virtuellen Festplatten, die aktuell von Hyper-V eingebunden sind. Dabei reicht es nicht aus, nur die direkt an die VMs gebundenen Festplattenpfade zu betrachten, da bei der Nutzung von Prüfpunkten zusätzliche differenzierende AVHDX-Dateien entstehen.
Um das korrekt abzubilden, ruft das Skript über die Funktion Get-AttachedDiskFiles für jede Festplatte auch die komplette Kette der übergeordneten und abhängigen Dateien ab. Das Ergebnis ist eine vollständige Liste aller tatsächlich verwendeten Dateien. Anschließend ermittelt das Skript mit Get-ChildItem alle vorhandenen Festplatten im Verzeichnis C:\vm. Alle Dateien, die in diesem Verzeichnis liegen, aber nicht in der Liste der aktiven Disks enthalten sind, werden als verwaist markiert. Für diese verwaisten Dateien zeigt die Ausgabe den vollständigen Pfad, die Dateigröße in Gigabyte sowie das Datum der letzten Änderung an. Sortiert nach Größe erhalten Administratoren so eine klare Übersicht, welche alten oder ungenutzten Festplatten im Repository Speicherplatz belegen. Der praktische Nutzen liegt darin, dass man ungenutzte Reste von gelöschten oder vergessenen VMs aufspüren und anschließend gezielt löschen oder archivieren kann, um Storage zurückzugewinnen und die Übersichtlichkeit im Hyper-V-Storage zu verbessern. Diese verwaisten Dateien können archiviert oder gelöscht werden, sobald klar ist, dass keine Abhängigkeiten mehr bestehen.
Inaktive Maschinen erkennen
In Testumgebungen bleiben oft VMs liegen, die seit Monaten nicht mehr genutzt werden. Über den letzten Schreibzugriff auf die VHDX-Dateien lässt sich feststellen, wann zuletzt Aktivität stattfand:
# Optional: nur Disks unter C:\vm berücksichtigen
$repoPrefix = 'C:\vm'
Import-Module Hyper-V
Get-VM | ForEach-Object {
$vm = $_.Name
Get-VMHardDiskDrive -VMName $vm | ForEach-Object {
$path = $_.Path
if ($repoPrefix -and ($path -notlike "$repoPrefix*")) { return }
if (Test-Path -LiteralPath $path) {
[pscustomobject]@{
VM = $vm
Disk = Split-Path -Path $path -Leaf
'Letzter Zugriff'= (Get-Item -LiteralPath $path).LastWriteTime
}
}
}
} | Sort-Object 'Letzter Zugriff'
So lassen sich Kandidaten für Konsolidierung oder Stilllegung identifizieren.

Fragmentierung reduzieren und Disks verkleinern
Gerade dynamische VHDX-Dateien fragmentieren stark. Das führt nicht nur zu zusätzlichem Platzverbrauch, sondern auch zu schlechterer Performance. Ein eigener Report gibt Auskunft über Fragmentierung und minimal mögliche Größe:
Import-Module Hyper-V
Get-VM | ForEach-Object {
$vm = $_.Name
Get-VMHardDiskDrive -VMName $vm | ForEach-Object {
$vhd = Get-VHD -Path $_.Path -ErrorAction SilentlyContinue
if ($vhd -and $vhd.VhdType -eq 'Dynamic') {
[pscustomobject]@{
VM = $vm
Disk = Split-Path -Path $vhd.Path -Leaf
'Fragmentierung (%)'= $vhd.FragmentationPercentage
'Aktuell (GB)' = [math]::Round($vhd.FileSize/1GB,1)
'Minimal (GB)' = [math]::Round($vhd.MinimumSize/1GB,1)
Pfad = $vhd.Path
}
}
}
} | Sort-Object 'Fragmentierung (%)' -Descending | Format-Table -Auto
Die betroffenen Disks können anschließend mit Compress-VMDisk -Path <Datei> komprimiert werden, um Speicherplatz freizugeben. Mit dem Befehl Optimize-VHD -Path <Datei> -Mode Full kann darüber hinaus der Speicherplatz optimiert werden.
Storage im Cluster- und Replikationsbetrieb
In Windows Server 2025 wurde die Live-Migration erweitert. Hier werden nun Workgroup Cluster eingeführt, die die Live-Migration von Hyper-V-VMs mithilfe von Zertifikaten ermöglichen, ohne dass eine Active-Directory-Umgebung erforderlich ist. Virtuelle Festplatten lassen sich nun im laufenden Betrieb verschieben, auch zwischen Arbeitsgruppen-Hosts. In Clustern mit Storage Spaces Direct speichern Cluster Shared Volumes (CSV) die VHDX-Dateien, die von allen Knoten parallel genutzt werden. Die Auswertung der Disk-Belegung auf CSVs erfolgt ebenfalls per PowerShell:
Import-Module FailoverClusters
Import-Module Storage
Get-ClusterSharedVolume | ForEach-Object {
$csv = $_
$mount = $csv.SharedVolumeInfo.FriendlyVolumeName # z. B. C:\ClusterStorage\Volume1
$vol = Get-Volume -Path $mount -ErrorAction SilentlyContinue
if ($vol) {
[pscustomobject]@{
CSV = $csv.Name
Pfad = $mount
'Belegt (GB)' = [math]::Round( ($vol.Size - $vol.SizeRemaining) / 1GB, 1 )
'Frei (GB)' = [math]::Round( $vol.SizeRemaining / 1GB, 1 )
OwnerNode = $csv.OwnerNode.Name
}
} else {
[pscustomobject]@{
CSV = $csv.Name
Pfad = $mount
'Belegt (GB)' = $null
'Frei (GB)' = $null
OwnerNode = $csv.OwnerNode.Name
}
}
} | Sort-Object 'Belegt (GB)' -Descending | Format-Table -Auto
Das Monitoring von CSVs ist dabei interessant, da hier der Storage-Verbrauch aller VMs zusammenläuft.
Darüber hinaus bietet Windows Server 2025 Hyper-V eine optimierte Skalierbarkeit und unterstützt bis zu 2.048 virtuelle CPUs und 240 TB Arbeitsspeicher für VMs der Generation 2. Die neu integrierte GPU-Partitionierungsfunktion (GPU-P) ermöglicht, dass mehrere VMs eine GPU gemeinsam nutzen können, was für die Zuweisung und Verwaltung von Ressourcen Vorteile bringt.
Strategien für nachhaltige Optimierung
Neben den technischen Abfragen lassen sich Effizienzgewinne mit organisatorischen Maßnahmen erzielen. Dazu gehören:
- konsequente Nutzung dynamischer Disks, sofern keine festen Kapazitäten garantiert werden müssen
- Storage QoS, um IOPS für kritische VMs zu sichern und Noisy Neighbors zu begrenzen
- Deduplizierung auf Host-Volumes, um identische Dateien (zum Beispiel Betriebssysteme) nicht mehrfach zu speichern
- regelmäßige Kontrolle der Prüfpunkte, vor allem in Clustern und bei Domain-Controllern
- Backup-Lösungen, die VHDX-Dateien mit Checkpoints sichern und Platz sparen
Fazit
Die Verwaltung von Storage in Hyper-V verlangt mehr als den Blick auf die Dateigrößen im Explorer. Erst durch eigene PowerShell-Reports, konsequentes Aufräumen von Snapshots und verwaisten Disks sowie die Nutzung moderner Funktionen wie Storage QoS und Deduplizierung entsteht eine nachhaltige Kontrolle. In Windows Server 2022 und 2025 stehen dazu leistungsfähige Schnittstellen bereit, die sowohl für einzelne Hosts als auch für Cluster-Umgebungen nutzbar sind. Wer diese Werkzeuge konsequent einsetzt, gewinnt nicht nur Speicherplatz zurück, sondern sichert auch die Performance seiner virtuellen Infrastruktur.