Dienstag, 25. Mai 2021

Linux Image in Hyper-V starten

Bekommt man ein x86-64 Linux Image direkt in Windows Hyper-V aktiviert?  (OpenWrt gibt es als .img.gz zum Download)

Ja das geht: mit einem Tool, und einem Powershell Script. (Quelle)

  1. openwrt.xx.xx.x-x86-64-combined-ext4.img.gz herunterladen.
  2. gzip auspacken
  3. Mit qemu-img das img nach vhdx konvertieren.
  4. Virtuelle Maschine definieren und die vorhandene vhdx Datei einbinden.

Vorbereitung

Die Erzeugung einer Virtuellen Maschine erfordert erhöhte Rechte: Man muss die Powershell als Administrator starten! 

 Tipp: Mit cd ~ in das User Home Dir wechseln, damit man nicht das Windows System Verzeichnis zumüllt.

Powershell Funktion um gzip zu entpacken. 

Bei einmaligen Gebrauch kann man diese einfach im Powershellfenster "einwerfen".

Function DeGZip-File{
    Param(
        $infile,
        $outfile = ($infile -replace '\.gz$','')
        )

    $input = New-Object System.IO.FileStream $inFile, ([IO.FileMode]::Open), ([IO.FileAccess]::Read), ([IO.FileShare]::Read)
    $output = New-Object System.IO.FileStream $outFile, ([IO.FileMode]::Create), ([IO.FileAccess]::Write), ([IO.FileShare]::None)
    $gzipStream = New-Object System.IO.Compression.GzipStream $input, ([IO.Compression.CompressionMode]::Decompress)

    $buffer = New-Object byte[](1024)
    while($true){
        $read = $gzipstream.Read($buffer, 0, 1024)
        if ($read -le 0){break}
        $output.Write($buffer, 0, $read)
        }

    $gzipStream.Close()
    $output.Close()
    $input.Close()
}

Tools herunterladen und im aktuellen Pfad entpacken 

Wenn man immer im gleichen Verzeichnis arbeitet braucht man diesen Vorgang nur einmalig auszühren. Expand erzeugt einen Pfad mit dem Archivnamen.

$target = "https://cloudbase.it/downloads/qemu-img-win-x64-2_3_0.zip"
wget -O qemu-img.zip $target 
Expand-Archive -Path qemu-img.zip

Image herunterladen und konvertieren

Das geeignete OpenWrt Image ermitteln und herunterladen (anderes Beispiel weiter unten)

$target="https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/"
$img = Invoke-WebRequest $target
$image = $img.Links.href|where {$_ -match 'openwrt.*combined-ext4'}
wget -O $image $target$image

Image entpacken

Hinweis: Die verwendeten Aufrufe in der Function DeGZIP-File lösen im Administrator Modus den Pfad zu C:\windows\system32 auf! Deshalb der Aufruf mit kompletter Pfadangabe! 
DeGZip-File $home\$image "$home\source.img"

Image Datei zu vhdx konvertieren

$vhdd = 'd:\vhd\OpenWrt.vhdx'
.\qemu-img\qemu-img.exe convert source.img -O vhdx -o subformat=dynamic $vhdd

Virtuelle Maschine erzeugen

Die Erzeugung und Administration einer virtuellen Maschine erfordert erhöhte Rechte.

Eine VM Gen 1 erzeugen und die VHDX Datei einbinden.

$vmname = 'OpenWrt'
New-VM -Name $vmname -BootDevice VHD -VHDPath $vhdd -Generation 1 -Switch (get-vmswitch -SwitchType External).name
Set-VM -Name $vmname -StaticMemory -MemoryStartupBytes 512MB
Set-VM -Name $vmname -CheckpointType disabled

Der letzte Befehl deaktiviert Prüfpunkte.

Dieser Tipp für den schnellen Zugriff auf die frisch gestartete OpenWrt Maschine (feste IP Adresse 192.168.1.1) funktioniert auch hier. Allerdings könnte man auch die Anmeldung auf der Konsole der VM benutzen und per Konsole die IP neu setzen:

uci set network.lan.ipaddr='192.168.x.x'
commit network
/etc/init.d/network restart


Update (September 2021)

Mit dem OpenWrt Release 20 hat sich der Dateiname geändert, Beispiel: 

generic-ext4-combined-efi.img.gz 

Es gibt jetzt auch ein EFI Image. Damit kann man auch mit Gen 2 VMs arbeiten, allerdings muss man Secure Boot deaktivieren:

New-VM -Name $vmname -BootDevice VHD -VHDPath $vhdd -Generation 2 -Switch (get-vmswitch -SwitchType External).name
Set-VMFirmware -VMName $vmname -DisableSecureBoot
Set-VM -Name $vmname -StaticMemory -MemoryStartupBytes 512MB

Und vielleicht gleich noch einen zweiten Netzwerkadapter anfügen:

Add-VMNetworkAdapter -VMName $vmname -SwitchName (get-vmswitch -SwitchType Private).name

Routing

OpenWrt verwendet per default eth0 als LAN und eth1 als WAN Interface. Hat man - in einem Testscenario wie hier als VM - beide Interfaces per DHCP konfiguriert, gewinnt offenbar das LAN Interface beim routing. Damit geht der traffic ins Internet über das LAN Interface. Ich hatte diesen Fall meinen Versuchen mit wireguard. Verhindern kann man dies einfach, indem man das LAN Interface mit einer statischen IP konfiguriert (nicht per DHCP Reservierung). Nicht vergessen: den DHCP Service deaktivieren!

Ein paar Notizen

Nur als Beispiel neue VHDX erzeugen.

New-VHD -Path v:\ssd\Test.vhdx -SizeBytes 20GB

Suche der aktuellesten Version auf der Webseite

Die aktuelleste/höchste OpenWrt Release Version suchen und herunterladen (gegenüber der Variante oben: zweistufige Suche. Hinweis: match sucht nach regExp, like sucht nach Platzhalter).

$target= "https://downloads.openwrt.org/"
$img = Invoke-WebRequest $target
$target += ($img.Links.href|where {$_ -like 'releases*'} |measure -Maximum).Maximum + "x86/64/"
$img = Invoke-WebRequest $target
$image = $img.Links.href|where {$_ -match '.*ext4.*' -and $_ -match '.*efi.*'}
wget -O downloads\$image $target$image

ToDo

Code Block

.

Keine Kommentare:

Kommentar veröffentlichen