Sonntag, 16. Februar 2020

Windows Server 2012 Foundation - Hyper-V Treiber installieren

Microsoft hat irgendwie umfangreich verhindert, dass man Windows Server 2012 Foundation in Hyper-V virtualisieren kann. Blöd wenn man eine produktiven Server hat, mit dem man ein paar Untersuchungen anstellen will. Virtualisierung / Hyper-V ist dafür nun mal eine Super Sache.
Es gibt einen guten Artikel, der mir sehr weiter geholfen hat.
Da die Situation nach einer Virtualisierung erstmal dramatisch ist, habe ich eine Weg gesucht und gefunden, es zu vereinfachen.
Das Hauptproblem ist die fehlende Installation der Hyper-V Treiber.

Das notwendige Paket windows6.2-hypervintegrationservices-x64.cab kann man bei Microsoft herunterladen. Die ursprüngliche existierende vmguest.iso wird nicht mehr ausgeliefert.
Für den Rest habe ich ein paar Powershell Scripts erstellt.
Zunächst brauchen wir die entpackten Dateien in einem temporären Pfad.
# cab Datei entpacken und in allen inf Dateien eine Zeile ergaenzen
$cabFile="E:\support\amd64\Windows6.2-HyperVIntegrationServices-x64.cab"
# Zielpfad frisch machen
$DestDir = (split-path $cabFile -leaf) -replace '.cab'
if (Test-Path -Path $DestDir) {rm $DestDir}
md $DestDir
# cab datei auspacken
cmd.exe /c "C:\Windows\System32\expand.exe -F:* $cabFile $DestDir"
Damit die Treiber später installiert werden können, muss die inf Datei um die eine Zeile ($rString) ergänzt werden. Zusätzlich muss "neben" der inf Datei die Datei update.cat liegen.
# replace in den inf Dateien
$fString=[regex]::Escape('[Version]') # escapen wegen der Klammer []
$rString="$&`nCatalogFile=update.cat" # Der String der gefunden wurde + NL + Text
gci -Recurse $DestDir |where {$_.name -like "*.inf"}|% {(Get-Content $_.fullname) -replace $fString, $rString| Set-Content $_.fullname;copy-item "$DestDir\update.cat"  (split-path $_.fullname)}
Die mit Windows Server 2012 Foundation vorbereitete virtuelle Disk (VHD Datei) kann man per Doppelklick einfach einbinden. Die Treiber werden dann ins Offline Image integriert.
# Treiber in offline Image integrieren
$offDir="F:"
$driverDir="\\omv1\Shares\Software\vmguest"
Add-WindowsDriver -Path $offDir -Driver $driverDir -Recurse -ForceUnsigned
Sollte was schiefgegangen sein, kann man auch alles wieder entfernen, oder sich nur vergewissern das die Treiber vorhanden sind.
# Alle Treiber wieder entfernen 
$dArray=gci -Recurse $driverDir |where {$_.name -like "*.inf"}|% {$_.name}
Get-WindowsDriver -path $offDir|% {if ($dArray -match (split-path $_.OriginalFileName -leaf)){Remove-WindowsDriver -path $offDir -Driver $_.driver}}
Zum Abschluss die VHD Datei auswerfen und die virtuelle Maschine starten. Es sind keine weiteren Arbeiten erforderlich.

Für die Virtualisierung einer produktiven Server 2012 Foundation Maschine hat man damit folgenden simplen Weg:
  1. Image ziehen, entweder offline mit dem USB Stick von hier, oder online mit disk2vhd.
  2. Das Image auf eine neue VHD anwenden, oder die VHD Datei von disk2vhd verwenden.
  3. VHD Datei als Laufwerk mounten und die Hyper-V Treiber integrieren. 
  4. VHD Datei Auswerfen und in Hyper-V verwenden.
Damit funktioniert:
  • Gen 2 Virtuelle Maschine
  • EFI Boot
  • SCSI Disk, Netzkarte usw.

Was leider bleibt:
  • Die Hyper-V Dienste (vmic...) laufen nicht. 
 

Mittwoch, 5. Februar 2020

Windows Core Server verwalten

Eigentlich gibt es ein simples Dokument vom Hersteller, aber das hat so viele Lücken und Fehler, ich schreibe einfach mal auf wie es kurz und knapp geht.

Verwaltung eines Core Servers (Hyper-V 2019) ohne Domäne

Um ohne lokale Konsole arbeiten zu können braucht man RDP. Das aktiviert man schnell:
  • entweder im Dialog der blauen Box von %windir%\System32\sconfig.cmd (bzw. %windir%\System32\%language%\sconfig.vbs) 
    • Dialog: 7 e 1
  • oder über ein vorhandenes Script:
cscript %WinDir%\System32\Scregedit.wsf /ar 0
REM Dieser Befehl noch für alte RDP Clients
Cscript %WinDir%\System32\Scregedit.wsf /cs 0
Man sollte den Server noch umbenennen, entweder im Dialog (2) oder
netdom renamecomputer %computername% /force /NewName:ComputerName
Danach muss man den Server neu starten!

Ab hier geht es auch Remote

Das "Netzwerkprofile" steht per default auf public, das stellt man um auf private und ermöglicht die Reaktion auf Ping. Dazu eine Powershell im "schwarzen Fenster" starten:
start Powershell
Ping funktioniert mit dem Regelset -DisplayGroup "File and Printer Sharing" (Sprachabhängig: "Datei- und Druckerfreigabe") oder "codiert" in Group.
Set-NetConnectionProfile -InterfaceIndex (Get-NetConnectionProfile).InterfaceIndex -NetworkCategory Private
Enable-NetFirewallRule -Group "@FirewallAPI.dll,-28502"

Am Client

Eine "Remote Verwaltung" funktioniert nur mit etwas Vorbereitung.

  • Der Zielcomputer muss als TrustedHost eingetragen und 
  • das Konto vom Zielcomputer muss hinterlegt werden. 

Verwirrend: Für den Hyper-V Manager muss der TrustedHost mit FQDN hinterlegt werden! Man kann sich entscheiden oder beides hinterlegen.
$server = "ComputerName"
$user = "administrator"
$pwd = Read-Host "Enter Password"
$fqdn=[System.Net.Dns]::GetHostByName($server).Hostname
Start-Service -Name winrm
Set-Item WSMan:\localhost\Client\TrustedHosts -Concatenate -Value $server
Set-Item WSMan:\localhost\Client\TrustedHosts -Concatenate -Value $fqdn
Stop-Service -Name winrm
cmdkey /add:$server /user:$user /pass:$pwd
cmdkey /add:$fqdn /user:$user /pass:$pwd

Ist alles ordentlich eingerichtet kann man eine Powershell Remotesitzung aufbauen.
Enter-PSSession -ComputerName $server

Neben Powershell und dem Hyper-V Manager funktionieren auch andere "lokale" Snap-Ins in der mmc, mir ist aber noch nicht klar nach welchem Schema was funktioniert und was nicht.
Die Hyper-V Verwaltungstools kann man besser über die grafische Schnittstelle installieren, die Powershell Schnittstelle funktioniert nur Hyper-V komplett oder gar nicht.
Mann sollte dafür die RSat Tools verwenden, oder eben alles über RDP und Powershell machen.

Informationen

Es gibt ein Tool für die Kommandozeile, welches knapp und übersichtlich die System Informationen darstellt:
systeminfo.exe
Auf dem Windows Server ist PSRemoting von Haus aus aktiviert, auf anderen Ziel Systemen kann man sie mit Enable-PSRemoting aktivieren. Ob aktiviert oder nicht lässt sich leicht von jeder Maschine aus testen:
Test-WSMan -ComputerName ComputerName
Die schon existierenden Zielsysteme kann man abfragen
Start-Service -Name winrm
(Get-Item WSMan:\localhost\Client\TrustedHosts).value
Stop-Service -Name winrm
Die existierenden Konten kann man anzeigen lassen
cmdkey /list

Auf dem Server kann man sich Profil und die aktivierten Firewall Regeln anschauen:
Get-NetConnectionProfile
Get-NetFirewallRule -DisplayGroup "Windows Remote Management"|select Name,enabled
Get-NetFirewallRule -Group "@FirewallAPI.dll,-28502"|select name,enabled
Mit der Tastenkombination Ctrl+Alt+Ende öffnet sich ein Fenster von wo aus man z.B. den Taskmanager starten kann.

ToDo Ist da noch was?
Code Block
System Volume nach der Installation auf 60GB schrumpfen und den Rest als Volume V einrichten.
$disk=Get-Partition -DriveLetter C
Resize-Partition -DiskNumber $disk.DiskNumber -PartitionNumber $disk.PartitionNumber -Size 60GB
New-Partition -DiskNumber $disk.DiskNumber -UseMaximumSize -DriveLetter v|Format-Volume

Weiteres

Insgesamt zu diesem Thema gibt es auch schon ein paar Artikel hier im Blog
Link

Sonntag, 2. Februar 2020

Altes Board von NVMe starten

M.2 SSDs sind ganz erschwinglich, einen PCIe M.2 Adapter gibt es für ein paar Euro und ein PCIe Steckplatz auf dem älteren Board ist auch noch frei. Das wäre doch was ...

Die Sache hat einen oder mehrere Haken:
  • der simple PCIe M.2 Adapter kann nur M-Key SSDs (NVMe SSDs) aufnehmen.
  • erst das EFI-BIOS der neueren Boards erkennt damit auch ein Laufwerk, die älteren kennen es bestenfalls als irgendein PCIe Gerät.
    • Die aktuellen Betriebssysteme können die NVMe SSD ohne Probleme als richtiges Laufwerk "sehen" und damit umgehen. Das geht soweit, dass man Windows installieren kann - es merkt nicht, dass das BIOS dieses Laufwerk nicht starten kann.
  • Damit kann man zwar ein System auf die neuen SSD aufspielen, aber starten kann man es nicht.
Wie so oft ist es eine Sache des Treibers: ein NVMe Treiber ist im alten BIOS nicht vorhanden.
Schade - Oder? 
Ich habe eine nicht ganz neue und simple Lösung gefunden, aber wie so oft keine aktuellen Beschreibungen. Ich musst ein paar Tage "forschen" - deswegen der Artikel.

Der "Trick" - eine kurze Umleitung


Das BIOS kann NVMe nicht direkt starten, aber Sata und USB Laufwerke. Also erstmal einen Bootloader von USB oder einer anderen EFI Partition starten, der hat den Treiber und der startet das System von NVMe. Wahrscheinlich geht das mit jedem Bootloader, wenn man weiß wie. Gefunden habe ich aber den clover efi bootloader und ein Boot Disk Utility zur einfachen Installation. Das Tool baut ohne viel Federlesen einen USB Boot Stick mit einer 200 MB EFI Bootpartition. Darin befinden sich ca. 15 MB Dateien.
Was dann nirgendwo so direkt und aktuell stand:

Die kleine Modifikation:


Es gibt in dem entstandenen Bootfähigem Laufwerk ein Verzeichnis EFI. In dem Verzeichnis <LW>:\EFI\CLOVER\drivers\UEFI müssen offenbar die notwendigen Treiber für den Start liegen.  In dem Verzeichnis <LW>:\EFI\CLOVER\drivers\off liegen offenbar die optionalen Treiber. Von dort muss man den Treiber für die NVME Disk - NvmExpressDxe.efi - in das Verzeichnis mit den notwendigen Treiber kopieren.
Das war es im Groben schon. Einfach den Stick in den PC einstecken, ihn als Boot Device konfigurieren und starten. Dann erscheint nach wenigen Sekunden ein neues Bootmenü, dort dann "Boot Microsoft EFI Boot from EFI" (oder was man starten möchte) auswählen.
Man kann den 5 sec Countdown noch verkürzen, ein Timeout 0 schaltet die GUI komplett ab und bootet sofort.
Die XML Datei kann man mit einem Texteditor bearbeiten.
<LW>\EFI\CLOVER\config.plist

Bei meinem Asrock E350M1 dauert es ca 6 sec um den Stick zu booten, die gesamte Zeit bis von der NVMe gestartet wird beträgt damit 14 sec. Ein Option Rom auf einer Sata Erweiterungskarte braucht auch ein paar Sekunden, insofern ist diese Methode kein wirklicher Nachteil.

Man braucht nicht unbedingt ein Tool um den Boot Stick zu erstellen. Man kann die gepackte ISO Datei herunterladen, entpacken und einfach wie bei einem Windows Setup Stick den Inhalt der ISO Datei auf den vorbereiten Stick kopieren.

Den Laufwerksbuchstaben kann man im laufenden Windows System mit Powershell entfernen und den Stick damit etwas verstecken.
$drive=(Get-Volume |where DriveType -eq Removable).DriveLetter
$disk=Get-Partition -DriveLetter $drive
Remove-PartitionAccessPath -DiskNumber $disk.DiskNumber -PartitionNumber $disk.PartitionNumber -AccessPath $drive":"


ToDo Ich muss noch weiter forschen....