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-Key: 538110

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

Printed on: April 19, 2024 at 06:04 o'clock

Member: NordicMike
NordicMike Jan 23, 2020, updated at Feb 17, 2020 at 14:12:26 (UTC)
Goto Top
Klar, such einfach nach: powershell hyper-v
Erster Treffer...
Member: Highend01
Highend01 Jan 23, 2020 updated at 09:37:34 (UTC)
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?
Member: NordicMike
Solution NordicMike Jan 23, 2020 at 10:10:27 (UTC)
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.
Member: Coreknabe
Coreknabe Jan 23, 2020 at 10:15:35 (UTC)
Goto Top
Member: Highend01
Highend01 Jan 24, 2020 updated at 06:49:40 (UTC)
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...
Member: NordicMike
NordicMike Jan 24, 2020 at 07:52:31 (UTC)
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.
Member: Highend01
Highend01 Jan 24, 2020 at 21:11:12 (UTC)
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.