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)
- openwrt.xx.xx.x-x86-64-combined-ext4.img.gz herunterladen.
- gzip auspacken
- Mit qemu-img das img nach vhdx konvertieren.
- 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
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