highend01
Goto Top

VMs zurückspielen ohne export

Hallo,

ich hab früher unter Server 2012R2 ein AHK script benutzt, welches alle benötigten Informationen für alle VMs gesichert und bei Bedarf zurückgespielt hat.
Die gesamten Imagedateien liegen natürlich alle auf einem nicht-OS-Laufwerk.

Dadurch konnte ich problemlos z.B. Folgendes tun:
- AHK script für's backup benutzen
- Eine neue VM erstellen, damit arbeiten
- Mein letztes Image (Terabyte IFL) zurückspielen
- AHK script für's restore benutzen

Dadurch hatte ich einen cleanen Zustand, nur die gebackupten VMs (aus dem letzten AHK backup) waren wieder verfügbar,
die zwischenzeitlich erstellte neue VM war vergessen und keinerlei Dateileichen existierten mehr.
Hätte ich nach dem AHK backup eine / mehrere VM(s) gelöscht (ohne die zugehörigen Dateien auf dem nicht-OS-Laufwerk zu entfernen), hätte ich nach dem restore diese wieder gehabt, ohne einen vorherigen export / und späteren import durchführen zu müssen.

Ich habe diese Vorgehensweise geliebt, da sie perfekt das abgebildet hat, was ich brauchte und das Ganze war immer nur ein Vorgang, der 5 Sekunden Zeit und einen Doppelklick brauchte...

So, und was mach ich jetzt unter Windows 10?

Jetzt scheint die Datei "C:\ProgramData\Microsoft\Windows\Hyper-V\data.vmcx" das zu enthalten, was an Informationen zu den existierenden VMs nötig ist.
Nur dummerweise kann man das Ding nicht einfach modifizieren, da sie keine (xml, json, whatever) Struktur hat, sondern binär vorliegt.

Deshalb die Frage: Gibt es noch irgendeine scriptbare Möglichkeit (powershell?), meine alte Vorgehensweise zum Einsatz zu bringen statt darauf angewiesen zu sein, z.B. VMs zu exportieren, damit man sie danach überhaupt wieder einbinden kann? Mir ist klar, dass ich eine neue (AHK) Lösung schreiben müsste, was aber nicht das Problem wäre...

Content-ID: 538110

Url: https://administrator.de/contentid/538110

Ausgedruckt am: 18.12.2024 um 20:12 Uhr

NordicMike
NordicMike 23.01.2020, aktualisiert am 17.02.2020 um 15:12:26 Uhr
Goto Top
Klar, such einfach nach: powershell hyper-v
Erster Treffer...
Highend01
Highend01 23.01.2020 aktualisiert um 10:37:34 Uhr
Goto Top
Aha.

Erster Treffer: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick ...

Ok, wir nehmen mal den letzten link auf der Seite, um weiter zu kommen: https://docs.microsoft.com/en-us/powershell/module/hyper-v/index?view=wi ...

Welches cmlet erlaubt es mir denn, die reine Konfiguration aller VMs zu sichern / zurückzuspielen, ohne ein vorheriges export-vm und nachträgliches import-vm auszuführen, was zur Folge hätte, dass ich 100GB+ an *.vhdx Dateien auf die verwendeten SSDs schreiben lassen müsste?
NordicMike
Lösung NordicMike 23.01.2020 um 11:10:27 Uhr
Goto Top
Ich habe mir noch einmal erlaubt für Dich zu googeln:

https://www.faq-o-matic.net/2017/04/05/hyper-v-vm-als-vorlage-ex-und-imp ...

Der Bereich:

#If you dont want to copy the VHDs and AVHDs
$exp.CopyVmStorage = $false

#If you dont want to copy the Saved state
$exp.CopyVmRuntimeInformation = $false

Eigentlich wäre das gesamte Script für Dich interessant.
Coreknabe
Coreknabe 23.01.2020 um 11:15:35 Uhr
Goto Top
Highend01
Highend01 24.01.2020 aktualisiert um 07:49:40 Uhr
Goto Top
@NordicMike
Danke, ich verwende das script zwar nicht nicht, aber es hat mich auf die (für meine Bedürfnisse) richtige Spur gebracht:
https://www.faq-o-matic.net/2019/12/23/hyper-v-vms-ohne-datenverlust-ent ...

Zuerst habe ich es mit einem:
- Kopiere nur die nötigsten Dateien aus dem Konfigurationsordner einer VM in einen backup Ordner (wenige KB/MB)
- Setze alle snapshot Dateien auf read-only
- Remove-VM
- read-only aufheben
- Alles zurück kopieren
- VM-Import (mit -Register)

Das Ganze funktioniert.

Es geht aber noch einfacher:
- ALLE Dateien im Konfigurationsordner einer VM auf read-only setzen
- Remove-VM (jetzt wird gar keine Datei entfernt)
- read-only aufheben
- VM-Import (mit -Register)

Funktioniert hier gerade auf einem Windows Server 2019...

$imagesFolder = "D:\Images\Hyper-V"  

# Process all existing VMs
foreach ($vm in Get-VM -ErrorAction SilentlyContinue | Select-Object *) {
    # Get necessary properties
    $name = $vm.Name

    # Config folder, e.g.: "D:\Images\Hyper-V\Linux\Debian\Sid x64" 
    # All necessary subfolders are underneath it: Smart Paging, Snapshots, Virtual Hard Disks and Virtual Machines
    $configPath = $vm.ConfigurationLocation

    # Shutdown VM
    if ($vm.State -match "running") {  
        Stop-VM -Name $name -TurnOff -Force
    }

    # Set read-only attribute for ALL files!
    # The files would otherwise be removed by the "Remove-VM" cmdlet! 
    $vmFiles = Get-Childitem -Path $configPath -Recurse -File -Force
    foreach($file in $vmFiles) {
        Set-ItemProperty $file.FullName -Name IsReadOnly -value $true
    }

    # Remove the VM
    Remove-VM -Name $name -Force

    # Remove read-only attribute again...
    foreach($file in $vmFiles) {
        Set-ItemProperty $file.FullName -Name IsReadOnly -value $false
    }
}

# Find all ".vmcx" file(s) for all VMs 
$configFiles = Get-Childitem -Path $imagesFolder -Recurse -Force -ErrorAction SilentlyContinue | Where-Object{$_.DirectoryName -like "*\Virtual Machines" -and $_.Extension -eq ".vmcx"}  
foreach($file in $configFiles) {
    Import-VM -Path $file.FullName -Register
}


@Coreknabe
Nein, sorry, aber das funktioniert vermutlich unter Windows 8, 8.1 / Server 2012 / R2 aber Windows 10 / Server 2019 verwendet keine .xml Dateien mehr...
NordicMike
NordicMike 24.01.2020 um 08:52:31 Uhr
Goto Top
Mal eine andere Frage, warum entfernst und fügst Du so oft die gleiche VM hinzu, dass sich ein Script lohnt? Fahr die VM doch einfach herunter.
Highend01
Highend01 24.01.2020 um 22:11:12 Uhr
Goto Top
Das jetzige script arbeitet mit allen existierenden VMs und da der Rechner (der selbst nur ein Testrechner ist) öfter auf ein altes image zurückgesetzt wird, möchte ich eine Lösung, die mit geringstmöglichen Aufwand (und dazu zählt auch das Kopieren von Dateien auf den SSDs) alle vorher existierenden VMs wieder einbindet.