Migration von VMs mit vTPM
Es steht mal wieder ein Wechsel der Labor-Umgebung an… das „alte“ Labor 3 (ab 2020) wird durch Labor 4 (ab 2022) ersetzt. Da ich mittlerweile sehr viele VMs mit virtuellem TPM aktiviert habe, stand ich erstmal vor einem Problem, denn die migrierten VMs (zum Glück erstmal nur drei zum Testen 😉) wollten nicht starten.
Dank Rachfahl IT-Solutions gibt es einen recht einfachen Weg, siehe: Live migration of Hyper-V VMs with a vTPM Chip #HyperV #TPM – Hyper-V Server Blog (hyper-v-server.de)
Hier habe das bei meinen beiden Servern nachgestellt:
- Auf dem neuen System „LABOR2022“ eine neue VM erstellen und „Enable Trusted Platform Module“ & „Encrypt state and virtual machine migration traffic“ aktivieren. Die VM selbst muss nicht gestartet und kein Betriebssystem installiert werden. Durch das Aktivieren wird im lokalen Zertifikatsspeicher der Unterordner „Shielded VM Local Certificates“ erstellt.
- Die beiden Zertifikate vom alten Host exportieren und im neuen Host importieren
- Die VMs werden dann exportiert und von LABOR v3 nach LABOR v4 kopiert
- Die VMs werden importiert (mit der Option „Copy the virtual machine (create a new unique ID)“) und anschließend gestartet.
- Optional kann man vorher noch die VM-Generation von „9.0“ (= Windows Server 2019) auf „10.0“ (= Windows Server 2022) aktualisieren.
Hier als Bildergalerie:






Wow, das sieht in der Tat nach einer heftigen Bastelei aus.
Mal sehen ob ich das im Sommer nach meinem Urlaub mal irgendwo nachbauen kann.
Herzlichen Dank
So bekommt man die Kisten zum Laufen, vielen Dank erst mal dafür.
Aber nehmen wir an, die Vertrauenswürdigkeit des ursprünglichen Zertifikats läuft dann irgendwann später ab.
Die Box, der das ursprüngliche Zertifikat gehört ist dekomissioniert.
Wie übertrage ich den vTPM Inhalt in ein neues vTPM, das möglichst von meinem neuen Hypervisor gebaut wurde?
Hallo Volker,
vielen Dank für deinen Kommentar.
Das ist korrekt, nach Ablauf des Zertifikats wäre die VM dann nicht mehr nutzbar. Hier ging es erstmal nur um einen Wechsel auf einem Test-Host mit Test-VMs, die keine lange Lebenszeit hätten. Möchte man diesen Prozess für einen Produktive-HyperV abbilden, wo die VMs durchaus länger als das Zertifikat sein können, müsste man wesentlich mehr durchführen. Hier wäre es dann ratsam mittels PowerShell den sog. „KeyProtector“ zu exportieren und auf dem Ziel-System wieder zu importieren.
Hier mal ein Beispiel, bei dem eine neue Shielded-VM erstellt wird, anschließend exportiert (inkl. KP) und importiert:
# ================================
# Shielded VM Lab Toolkit (Standalone ohne HGS)
# ================================
function Show-Menu {
Clear-Host
Write-Host "🛡️ Shielded VM Testlab Menu" -ForegroundColor Cyan
Write-Host "1. Neue vTPM-VM erstellen"
Write-Host "2. KeyProtector exportieren"
Write-Host "3. VM exportieren"
Write-Host "4. VM + KeyProtector importieren"
Write-Host "5. Beenden"
}
function Create-ShieldedVM {
$VMName = Read-Host "Name der neuen VM"
$VMPath = "C:\HyperV\ShieldedVMs\$VMName"
$VHDPath = "$VMPath\$VMName.vhdx"
$ISOPath = Read-Host "Pfad zur Installations-ISO"
$SwitchName = Read-Host "Name des virtuellen Switch (z. B. 'Default Switch')"
New-Item -ItemType Directory -Path $VMPath -Force | Out-Null
New-VHD -Path $VHDPath -SizeBytes 60GB -Dynamic
New-VM -Name $VMName -MemoryStartupBytes 4GB -Generation 2 -VHDPath $VHDPath -Path $VMPath -SwitchName $SwitchName
Set-VMFirmware -VMName $VMName -EnableSecureBoot On
Set-VMKeyProtector -VMName $VMName -NewLocalKeyProtector
Enable-VMTPM -VMName $VMName
Set-VMDvdDrive -VMName $VMName -Path $ISOPath
Set-VM -Name $VMName -AutomaticStartAction StartIfRunning
Start-VM -Name $VMName
Write-Host "✅ VM '$VMName' wurde erstellt und gestartet." -ForegroundColor Green
Pause
}
function Export-KeyProtector {
$VMName = Read-Host "Name der VM für Export"
$ExportPath = "C:\ExportedKeys\$VMName"
New-Item -Path $ExportPath -ItemType Directory -Force | Out-Null
Export-VMKeyProtector -VMName $VMName -FilePath "$ExportPath\$VMName.keyprotector"
Write-Host "🔐 KeyProtector exportiert nach: $ExportPath" -ForegroundColor Yellow
Pause
}
function Export-VMFiles {
$VMName = Read-Host "Name der zu exportierenden VM"
$ExportPath = "C:\ExportedVMs\$VMName"
Export-VM -Name $VMName -Path $ExportPath
Write-Host "📦 VM exportiert nach: $ExportPath" -ForegroundColor Yellow
Pause
}
function Import-VMAndKey {
$VMPath = Read-Host "Pfad zur importierten VM (z. B. D:\ImportedVMs\TestShieldedVM)"
$VMName = Read-Host "Name der importierten VM"
$KeyFile = Read-Host "Pfad zum KeyProtector-File (.keyprotector)"
Import-VM -Path $VMPath -Copy -GenerateNewId
Import-VMKeyProtector -VMName $VMName -FilePath $KeyFile
Enable-VMTPM -VMName $VMName
Write-Host "✅ VM importiert und KeyProtector angewendet." -ForegroundColor Green
Pause
}
do {
Show-Menu
$choice = Read-Host "Auswahl (1-5)"
switch ($choice) {
"1" { Create-ShieldedVM }
"2" { Export-KeyProtector }
"3" { Export-VMFiles }
"4" { Import-VMAndKey }
"5" { Write-Host "👋 Skript beendet. Viel Erfolg!" -ForegroundColor Cyan }
default { Write-Host "Ungültige Eingabe." -ForegroundColor Red; Pause }
}
} while ($choice -ne "5")
Alternativ kann über einen sog. „HGS – Host Guardian Service“ nachgedacht werden; dort werden dann die Hyper-V Systeme registriert und dieser verwaltet dann die KeyProtectors. Ich nehme mir das Thema mit dem HGS mal als Notiz mit und würde dazu noch einen Artikel verfassen. Vermutlich aber erst gegen Herbst, wenn die Tage wieder kürzer & kälter werden und man mehr drinnen verbringt, denn aktuell ist die Liste mit Themen recht lang.
Viele Grüße
Ronny