Bulk Merge aller AVHDX-Snapshots einer VM
Eine VM, 5 Platten, 1.000 AVHDX-Daten. Diverse Snapshots, die einfach hängen geblieben sind, und niemanden ist es aufgefallen. Zwar habe ich unter Snapshots händisch mergen schon einen Artikel, wie man das händisch macht, aber bei mehreren VMs und mehreren VHD(X)-Dateien nervt das hammer.
Folgendes Powershell-Script fixt das, indem es alle Platten einer VM durchläuft und für jede die AVHDX-Dateien immer weiter reinmergt bis keine mehr da sind:
# Wenn das `-Name "DC"` weggestrichen wird, wird das oben für alle VMs gemacht
$VMs = Get-VM -Name "DC"
foreach ($VM in $VMs) {
Write-Host "Bearbeite VM: $($VM.Name)" -ForegroundColor Cyan
$HardDrives = Get-VMHardDiskDrive -VMName $VM.Name
foreach ($Drive in $HardDrives) {
$DiskPath = $Drive.Path
# Infos zu dieser einen Disk ziehen
$DiskInfo = Get-VHD -Path $DiskPath
while ($DiskInfo.VhdType -eq 'Differencing') {
Write-Host "Merge: $($DiskInfo.Path)" -ForegroundColor Yellow
try {
Merge-VHD -Path $DiskInfo.Path -Force
# Zu der übergeordneten Disk springen und wieder zu Anfang
# der Schleife
$DiskInfo = Get-VHD -Path $DiskInfo.ParentPath
} catch {
Write-Host "Fehler beim Merge: $($DiskInfo.Path) - $_" -ForegroundColor Red
break
}
}
# Hier angekommen sind wir entweder mit dem Mergen aller Platten durch
# -oder- es trat ein Fehler auf, und hier wird die letzte Platte
# ausgegeben
Write-Host "Finale VHD(x): $($DiskInfo.Path)" -ForegroundColor Green
}
}
Code language: PowerShell (powershell)