Hyper-V Switch wechselt nach Reboot von extern auf intern.

Antworten
Andreas Kapust
Administrator
Beiträge: 1092
Registriert: 29.02.2004, 15:51
Wohnort: Hamburg
Kontaktdaten:

Hyper-V Switch wechselt nach Reboot von extern auf intern.

Beitrag von Andreas Kapust »

Vorweg, der Autor ist kein Experte für Hyper-V oder Netzwerke, wenn es bessere Wege gibt, bitte mailen.

Dieser Artikel befasst sich mit einem Sonderfall. Normalerweise läuft Hyper-V auf einem Server, auf den man sich mit Desktop oder Notebook einloggt. Dort wird das Problem nicht zum Tragen kommen.

In diesem Fall wird Hyper-V „lokal“ auf einem Notebook betrieben, in dem VMs mit unterschiedliche Visual Studio-Konstellationen laufen. Diese binden ein oder mehrere Laufwerke des Host und Server-Pfade ein.

Da das Weiterreichen in die VM leider mit unsäglich langsamen Zugriffszeiten verbunden ist, werden diese Laufwerke als Share über das Netzwerk durchgereicht.

Die Anbindung vom Host zum Server läuft über eine 10 G-Verbindung. Da das Notebook, diese selber nicht anbietet, sondern nur über 2 Thunderbold 4 , einen HDMI, USB A 3.2 Anschlüsse verfügt, hängt dieses an einem Sonnettech Echo 20 (diese bietet 2.5 Gbe) und daran ein Sonnettech Solo 10 G Addapter und Monitore.

Am anderen Thunderbold Anschluss ist ein Thunderbold Hub mit einer NVME (c. a. 3600mbs, Bitlocker), hierauf liegen die Test-VS-VMs.
Da der Standard Switch sich leider unkonfigurierbar mit dem ersten Adapter verbindet ist die Geschwindigkeit sehr gering. Darum wurde ein weiterer (externer) Switch angelegt und dieser nutzt den 10G-Adapter. Und somit steht 10 G für Netzwerk und Host-Shares zur Verfügung (die vollen 6700mbs der Host-SSD wären schön, aber es lässt sich damit arbeiten).

Wenn das System einmal läuft, klappt alles Reibungslos – bis zu einem Neustart (spätestens am nächsten Morgen).
Da Hyper-V vor dem Adapter startet ist dieser "scheinbar" nicht vorhanden und Windows 11 meint, klug wie es ist, es müsse den Switch anpassen (laut Event-Log).

Worauf die VM keine Verbindung zum Host und Server erhält, und das nach jedem Neustart des Hosts! Nach dem Einschalten des Notebooks und des Besorgens einer heißen Tasse Tees kann man also leider nicht frisch ans Werk, da die Konfiguration verstellt wurde.

Erste Versuche, dieses einfach wieder umzustellen und zu starten, lieferten leider keine Erfolge (Brückentreiber entfernen, wie vielerorts geraten, überlebt den Neustart nicht und war erfolglos).

Nach etlichem ausprobieren erschloss sich dieser Weg (bei jedem Schritt Anwenden + Ok):

Switch aus den VM(s) entfernen.
Switch entfernen
Switch 10 G, anlegen, Adapter einstellen
Switch in VM zuweisen
VM Starten, einloggen
Switch 10 G auf Privat stellen, 10 Sek warten
Switch 10 G auf Extern stellen, 10 Sek warten
Neue einloggen.

In den wenigen Fällen, wo dieses nicht funktionierte, wurde der Adapter deaktiviert und wieder aktiviert.

Umständlich? Definitiv!!! Sowas von!!!
Also hat der Autor all diese Anforderungen ChatGPT geschildert und am Ende (also nach etlichen Anpassungen) kam das Skript unten heraus.
ChatGPT rät dieses erst mit einer Kopie auszuprobieren, darum wurde vor dem ersten Test ein Backup der System- und VM-Partition angeworfen.

Nach weiteren Tassen Tee und diverser Anpassungen und Neustarts funktioniert dieses Skript auf der beschriebenen Hardwarekonstellation ohne Probleme.

Eine Nutzung geschieht auf eigene Gefahr.

Code: Alles auswählen


# Konfigurierbare Variablen
$vmName = "VisualStudio_Test" # Name der VM
$switchName = "Hyper-V 10 G Verbindung" # Name des virtuellen Switches
$netAdapterName = "Sonnettech 10 G"  # Name des physischen Netzwerkadapters


# Anmerkung von A. Kapust:
# Getestet auf Windows 11 23H2, 11.2024
# Hyper-V läuft auf einem Notebook, an einem Sonnettech Dock mit Sonnettech Solo 10G Thunderbold Adapter
# Die VM liegt auf einer portablen SSD (ca. 3600MBs), das Arbeitslaufwerk ebenfalls (geBitlockert)
#
# Da Hyper-V keine Laufwerke mit vernünftiger Geschwindigkeit durchreichen kann 
# (Leseraten von 50-70 MBs, wo die Platte doch 3600MBs liefert), ist in der VM eine
# Netzwerk-Freigabe als D:\ (Arbeitslaufwerk) eingerichtet.
#
# Dummerweise verbindet sich der Standard-Switch mit dem langsamsten ersten Adapter und die 
# Netzwerk-Verbindung ist somit sehr, sehr träge. 
# (Brückentreiber entfernen, wie vielerorts geraten, überlebt den Neustart nicht).
#
# Es wurde also ein neuer Switch mit dem 10G-Adapter eingerichtet und in der VM gesetzt,
# sowie in der VM eine passende IP vergeben.
# Einmal lauffähig eingerichtet, läuft die Verbindung mit dem maximalen 10 G, C: mit 
# ca. 3600MBs, D: und Verbindung zum Server (Git, etc.) mit ca. 700-1000 MBs.
#
# Bis zu einem Neustart - leider.
#
# Da Hyper-V vor dem Adapter startet ist dieser "scheinbar" nicht vorhanden und Windows 11
# meint, klug wie es ist, es müsse den Switch anpassen (laut Event-Log).
# Worauf die VM keine Verbindung zum Host und Server erhält, nach jedem Neustart des Hosts!
#
# Achtung!:
# Das Skript wurde mit Chat-GPT erstellt, die KI rät, dieses erst mit einer Kopie zu testen.
# Vor dem Testen wurde also eine komplettes Image von Windows und der Hyper-V-Platte erstellt.
#
# Auf dem System des Autors funktioniert das Skript.
# Die Nutzung auf Ihrem System geschieht auf EIGENE Gefahr!
#
# Das Skript darf frei verwendet werden, wenn diese Anmerkungen nicht geändert werden!
# Erweitern ist ok.


#ChatGpt-Skript mit Anmerkungen und Ergänzungen

# Funktion, um auf den Standardswitch zu setzen
function Set-DefaultSwitch 
{
    $defaultSwitch = Get-VMSwitch | Where-Object {$_.SwitchType -eq "Internal"} | Select-Object -First 1
    if ($defaultSwitch) 
        {
        Write-Host "Setze VM auf den Standard-Switch: $($defaultSwitch.Name)"
        Connect-VMNetworkAdapter -VMName $vmName -SwitchName $defaultSwitch.Name
        } 
    else 
        {
        Write-Host "Kein interner Standard-Switch gefunden. Erstelle einen neuen internen Switch."
        $newInternalSwitch = New-VMSwitch -Name "InternalDefaultSwitch" -SwitchType Internal
        Connect-VMNetworkAdapter -VMName $vmName -SwitchName $newInternalSwitch.Name
        }
}

# Schritt 1: Prüfen, ob der virtuelle Switch vorhanden ist
$switchExists = Get-VMSwitch | Where-Object { $_.Name -eq $switchName }

if ($switchExists) 
    {
    Write-Host "Switch '$switchName' gefunden. Vorbereitung auf das Entfernen."

    # Schritt 2: VM auf Standard-Switch setzen
    Set-DefaultSwitch

    # Schritt 3: Virtuellen Switch entfernen
    Write-Host "Entferne virtuellen Switch: $switchName"
    Remove-VMSwitch -Name $switchName -Force

    # Warten, damit Änderungen übernommen werden
    Start-Sleep -Seconds 5
    } 
else 
    {
    Write-Host "Switch '$switchName' nicht gefunden. Kein Entfernen erforderlich."
    }

# Schritt 4: Neuen externen Switch erstellen
Write-Host "Erstelle den externen Switch: $switchName"
New-VMSwitch -Name $switchName -NetAdapterName $netAdapterName -AllowManagementOS $true

# Schritt 5: Netzwerkadapter neu starten
Write-Host "Starte den Netzwerkadapter '$netAdapterName' neu."
Disable-NetAdapter -Name $netAdapterName -Confirm:$false
Start-Sleep -Seconds 5
Enable-NetAdapter -Name $netAdapterName -Confirm:$false
Write-Host "Netzwerkadapter '$netAdapterName' wurde neu gestartet."
Start-Sleep -Seconds 5

# Anmerkung: könnte entfallen, weil nach dem Reboot die VM aus ist.
# Schritt 6: VM verwalten
$vmState = Get-VM -Name $vmName | Select-Object -ExpandProperty State

if ($vmState -eq "Running") 
    {
    Write-Host "Die VM '$vmName' läuft bereits. Fahre sie jetzt herunter."
    Stop-VM -Name $vmName -Force -Confirm:$false

    # Warte, bis die VM vollständig heruntergefahren ist
    while ((Get-VM -Name $vmName).State -ne "Off") 
        {
        Write-Host "Warte, bis die VM vollständig heruntergefahren ist..."
        Start-Sleep -Seconds 5
        }
    Write-Host "Die VM '$vmName' wurde erfolgreich heruntergefahren."
    }

# Starten der VM
Write-Host "Starte die VM '$vmName' und warte 30 Sekunden."
Start-VM -Name $vmName

# Anmerkung: Das Netzwerk braucht manchmal sehr lange.
Start-Sleep -Seconds 30

# Anmerkung: 7-9 sind scheinbar nötig, ohne läuft es nicht.

# Schritt 7: Switch auf Privat setzen
Write-Host "Setze den Switch '$switchName' auf Privat."
Set-VMSwitch -Name $switchName -SwitchType Private
Start-Sleep -Seconds 10

# Schritt 8: Switch wieder auf Extern setzen
Write-Host "Setze den Switch '$switchName' wieder auf Extern."
Set-VMSwitch -Name $switchName -NetAdapterName $netAdapterName
Start-Sleep -Seconds 10

# Schritt 9: VM wieder mit dem neuen Switch verbinden
Write-Host "Verbinde die VM '$vmName' mit dem neuen Switch: $switchName"
Connect-VMNetworkAdapter -VMName $vmName -SwitchName $switchName

Write-Host "Prozess abgeschlossen."
pause
Mit freundlichen Grüßen,
AKApplications, Andreas Kapust
Antworten