Spielereien mit Nano Server unter Windows Server 2016 (TP5)

Nach Windows 10 ist nun langsam auch der zukünftige Windows Server 2016 in den Fokus meiner Kunden gerutscht. Im Rahmen der Neuigkeiten dieses Systems, u.a. Windows Server Container und Storage Spaces Direct, wird dann auch häufig nach der neuen Installationsmöglichkeit von Windows Server 2016 als Nano Server gefragt.

Nano Server unter Windows Server 2016 sind – ähnlich wie die bereits seit einigen Software-Generationen verwendbare Server Core-Installation – eine im Umfang deutlich reduzierte Bereitstellungsform von Windows Server. Anders jedoch als die bereits weitgehend ohne grafische Oberfläche erscheinende Core-Variante, ist im Nano Server ausschließlich – einige Grundkonfigurationsmöglichkeiten ausgenommen – die Verwaltung von ‚außen‘ via PowerShell Direct, PowerShell Remoting oder grafische Remoteverwaltung vorgesehen.

Eine weitere Möglichkeit besteht darin, die Installation und Konfiguration eines Nano Servers zu kombinieren, sodass im Anschluss an die Bereitstellung keine weiteren Konfigurationsschritte notwendig sind. Ein Szenario, was sich für eine vollautomatisierte Bereitstellung von Nano Server sehr gut eignet.

Die Bereitstellung eines Nano Servers wird vorzugsweise als virtuelle Maschine durchgeführt, doch lässt sich auch eine Installation als physische Maschine realisieren. Im letzteren Fall kann während der Bereitstellungsphase eine WIM-Datei erstellt und diese dann auf dem Zielrechner – nach entsprechender Vorbereitung der Festplatten-Partitionen – angewendet werden. Umfangreiche Informationen zum Thema Nano Server stellt Microsoft hier (Stand: August 2016) zur Verfügung.

Hier also nun einige Grundlagen zur Bereitstellung und Verwaltung eines Windows Server 2016 Nano-Servers am Beispiel der Technical Preview 5 (TP5)…

Bereitstellen eines Nano-Servers als virtuelle Maschine unter Hyper-V

In diesem Szenario möchte ich zunächst eine virtuelle Maschine (VM) mit einem installiertem Nano Server bereitstellen und diese starten können. Anders als beim üblichen Bereitstellungsweg eines virtuellen Windows Server Systems, wird dabei allerdings nicht zuerst die VM erstellt und anschließend das Betriebssystem in der virtuellen Hardware bereitgestellt. Stattdessen muss der Nano Server direkt von der Installationsquelle eines Windows Server 2016 ausgelesen und in einer virtuellen Festplatte – wahlweise im Format VHD oder VHDX – bereitgestellt werden. Anschließend kann nun diese Datei als Festplatte für eine virtuelle Maschine verwendet werden.

In diesem Szenario verwende ich ein System mit Windows 10 (1607) und Hyper-V. Alternativ werden Windows 8.1, Windows Server 2012 R2 und Windows Server 2016 für die Bereitstellung von Nano Server unterstützt. Die verwendete virtuelle Maschine ist konfigurationsseitig eine Version 8.0 der Generation 1 – eine Generation 2 VM lässt sich zwar prinzipiell ebenfalls erstellen, allerdings verhindert hier die Secure Boot Funktion derzeit den fehlerfreien Start…

Zunächst stelle ich mir lokal die Installationsquelle von Windows Server 2016 bereit (hier Laufwerk F:\) und verwende eine PowerShell im administrativen Kontext:

Nano Server 1
Vorbereitung der Nano Server Installation

Mit Hilfe der PowerShell sollen zunächst die Installationsdateien des Nano Server von der Inhaltsquelle gelesen und anschließend lokal als VHD- oder VHDX-Datei abgelegt werden. Dazu benötige ich das Cmdlet ‚New-NanoServerImage‘, welches sich im Modul ‚NanoServerImageGenerator‘ befindet. Dieses wiederum befindet sich – neben anderen notwendigen Dateien – im Verzeichnis ‚NanoServer‘ der Installationsquelle.

Dieses Verzeichnis (F:\NanoServer) kopiere ich mir samt Inhalt in ein temporäres Arbeitsverzeichnis meiner Festplatte (D:\) und importiere von dort das PowerShell-Modul:

Copy-Item -Path F:\NanoServer -Destination D:\ -Recurse
Set-Location -Path D:\NanoServer\
Import-Module -Name .\NanoServerImageGenerator
Achtung - Backslash
Achtung bei Verwendung der automatischen Ergänzungsfunktion der PowerShell mit Hilfe der TAB-Taste: hierbei wird hinter den Ordnernamen NanoServerImageGenerator richtigerweise ein Backslash eingefügt (.\NanoServerImageGenerator\) – dann allerdings schlägt das Laden des Moduls fehl…

Nun steht das Cmdlet ‚New-NanoServerImage‘ zur Verfügung und kann mit einer Reihe verschiedener Parameter genutzt werden. In diesem Szenario habe ich folgende Variante verwendet:

New-NanoServerImage -Edition Standard -DeploymentType Guest -MediaPath F:\ -BasePath .\Base -TargetPath D:\Hyper-V\VHDs\Nano1.vhd -ComputerName nano1 -AdministratorPassword (ConvertTo-SecureString -String 'Pa$$w0rd' -AsPlainText -Force)
Administratives Kennwort
Die Übergabe des lokalen administrativen Kennworts fällt hier etwas unkonventionell aus und es gibt natürlich bessere Alternativen. Eine Variante in diesem Szenario ist auf den Parameter ‚AdministratorPassword‘ zu verzichten. Da es sich um einen bedingten Parameter handelt, fragt die PowerShell zur Ausführung des Cmdlet ‚New-NanoServerImage‘ nach diesem…

Die übergebenen Parameter im Detail:

ParameterErläuterung
Edition'Standard' oder 'Datacenter'
DeploymentType'Guest' oder 'Host'
MediaPathVerzeichnis zur Installationsquelle
BasePathTemporäres Arbeitsverzeichnis - optional
TargetPathZielpfad und Dateiname der virtuellen Festplatte. VHD- oder VHDX-Endung
ComputerNameComputername der Installation
AdministratorPasswordKennwort des lokalen Administrator-Kontos

Interessant ist dabei die Verwendung des Parameters ‚TargetPath‘, da durch die Angabe der Dateiendung der virtuellen Festplatte (.vhd oder .vhdx) gleichzeitig festgelegt ist, ob der Nano Server mit einer MBR- (VHD-Datei) oder einer GPT-typischen Partitionierung (VHDX-Datei) bereitgestellt wird. Dementsprechend muss die virtuelle Maschine als Generation 1 (BIOS) oder Generation 2 (UEFI) erzeugt werden.

Ist die virtuelle Festplatte dann einmal erstellt, kann eine neue virtuelle Maschine mit der entsprechenden Konfiguration diese als Boot-Datenträger einbinden.

Dies geschieht wie folgt:

Import-Module -Name Hyper-V
New-VM -Name 'Nano1' -SwitchName 'NAT' -VHDPath 'D:\Hyper-V\VHDs\Nano1.vhd' -Generation 1 -MemoryStartupBytes 512MB

Der Parameter ‚Name‘ gibt den Namen der VM im Hyper-V Manager an, während der Parameter ‚SwitchName‘ den für diese VM zu verwendenden virtuellen Switch benennt. Der Parameter ‚Generation‘ stellt wahlweise eine VM der ersten oder zweiten Generation bereit (BIOS & IDE bzw. UEFI & SCSI), während ‚MemoryStartupBytes‘ den RAM-Anteil der VM deklariert. Über ‚VHDPath‘ wird auf die im Vorfeld erzeugte virtuelle Festplatte verwiesen.

Die folgende Abbildung zeigt die entsprechenden Vorgänge und Ausgaben im Überblick:

Nano Server 2
Bereitstellen eines Nano Servers und Erstellen einer virtuellen Maschine

Nach diesen Schritten sollte sich die neu erstellte VM dann erfolgreich starten lassen:

Nano Server 3
Erster Start eines Nano Servers
Netzwerkkonfiguration

Ist nun der Nano Server erfolgreich installiert, sollte man sich Gedanken um die entsprechende Netzwerkkonfiguration machen. Zwar habe ich parallel zum Nano Server einige weitere virtuelle Systeme gestartet und via DHCP für eine dynamische IP-Zuordnung gesorgt – als zukünftigem Dienstleister im Netzwerk wollte ich dem Nano Server jedoch eine vollständig statische IP-Konfiguration vorgeben.

Dazu hätte praktisch noch die Schnittstelle des Nano Server ausgereicht, da dieser über eine – recht spartanische – Möglichkeit der IP-Konfiguration verfügt. Unter Windows 10 Hyper-V habe ich dazu allerdings lieber PowerShell Direct verwendet.

Zunächst habe ich von meinem Windows 10 Host via administrativer PowerShell und dem Cmdlet ‚Enter-PSSession‘ eine Remote-Sitzung mit der VM ‚Nano 1‘ aufgebaut:

Enter-PSSession -VMName 'Nano 1' -Credential Administrator

Anschließend konnte ich nun auf dem Server ‚Nano 1‘ mit Hilfe des Cmdlet ‚Get-NetAdapter‘ die Index-Nummer der Netzwerkkarte (hier 3) in Erfahrung bringen.

Get-NetAdapter

Dann konnte es losgehen: IP-Adresse, Netzwerkmaske, Gateway und DNS-Server habe ich nun mit folgendem Zweizweiler definiert:

New-NetIPAddress -InterfaceIndex 3 -IPAddress 192.168.0.110 -PrefixLength 24 -DefaultGateway 192.168.0.1 -AddressFamily 'IPv4'

Set-DNSClientServerAddresses -InterfaceIndex 3 -ServerAddresses 192.168.0.101,192.168.0.100

Hier die Ein- und Ausgaben im Detail:

Nano Server 4
Netzwerkkonfiguration
Anpassung der Zeitzone und Domänenbeitritt unter Active Directory

Nun sollte der Nano Server mit meiner übrigen virtuellen Infrastruktur zusammenarbeiten. Vorhandene Domänencontroller für eine Testdomäne ‚firma.local‘ sollten dem Nano Server Domänenanschluss gewähren. Dieser dümpelte derzeit allerdings noch in einer Arbeitsgruppe in der Zeitzone ‚Pacific Standard Time‘ vor sich hin:

Nano Server 5
Nano Server als Mitglied einer Arbeitsgruppe

Um dies in dieser Situation zu ändern, muss der Nano Server mittels Offline Domain Join in die Domäne gebracht werden. Dazu habe ich zunächst auf einem der Domänencontroller eine entsprechende Datei mit Hilfe des Tools djoin.exe erstellt:

djoin.exe /provision /domain firma.local /machine nano1 /savefile D:\Shares\DomainJoin\odjblob

In Active Directory wurde in diesem Zusammenhang automatisch ein neues Computerobjekt ’nano1′ erstellt.

Nano Server 6
Vorbereitung des Offline Domain Join

Anschließend musste diese Datei seitens des Nano Servers eingelesen und somit die Domänenaufnahme abgeschlossen werden. Für diesen Vorgang habe ich erneut die Variante PowerShell Direct verwendet.

Zunächst habe ich die Zeitzone des Servers unter Verwendung von ‚tzutil‘ angepasst – zugegebener Maßen, ein rein kosmetisches Problem:

tzutil /s "W. Europe Standard Time

Nun musste der Nano Server noch auf die Freigabe des Domänencontrollers zugreifen, die Datei ‚odjblob‘ kopieren und der Domäne ‚firma.local‘ beitreten:

New-PSDrive -PSProvider FileSystem -Name S -Root \\dc1\DomainJoin -Credential FIRMA\Administrator

New-Item -ItemType Directory -Path C:\ -Name temp
Copy-Item -Path S:\odjblob -Destination C:\temp\odjblob
djoin.exe /requestodj /loadfile C:\temp\odjblob /windowspath C:\Windows -localos

Dieser Vorgang via PowerShell Direct sieht auf dem Host-System dabei wie folgt aus:

Nano Server 7
Zeitzone konfigureiren und Domänenaufnahme
Konfiguration während der Installation
Alternativ hätte die Domänenaufnahme und die Korrektur der Zeitzone auch bereits während der Erstellung der Nano Server-Installation geschehen können. Dabei kommt eine Antwortdatei ‚unattend.xml‘ für die unbeaufsichtigte Installation zum Einsatz. Ausführliche Informationen dazu finden sich hier.

Der Nano Server befand sich nun nach einem Neustart in der Domäne ‚firma.local‘:

Nano Server 8
Nano Server als Domänenmitglied
Aktualisierung mit Windows Update

Etwas umständlich gestaltet sich derzeit noch die Aktualisierung eines laufenden Nano Servers, da dies über PowerShell und WMI gesteuert wird.

Dazu habe ich erneut eine Verbindung zur Nano Server PowerShell aufgebaut, diesmal allerdings via PowerShell Remote seitens des Domänencontrollers. Nun konnte ich unter Verwendung der Cmdlets ‚New-CimInstance‘ und ‚Invoke-CimMethod‘  die zur Verfügung stehenden Updates online abfragen und installieren.

Zur Überprüfung auf vorhandene Updates steht dabei die folgenden Befehlsfolge zur Verfügung:

$session = New-CimInstance -Namespace root/Microsoft/Windows/WindowsUpdate -ClassName MSFT_WUOperationsSession

$scanResults = Invoke-CimMethod -InputObject $session -MethodName ScanForUpdates -Arguments @{SearchCriteria="IsInstalled=0";OnlineScan=$true}

Ruft man anschließend die Variable ‚$scanResults‘ auf, evtl. durch ‚Format-List‘ formatiert, erfährt man mehr über etwaige vorhanden Updates.

$scanResults | Format-List -Wrap -AutoSize

Nun können die erkannten Updates geladen und installiert werden:

Invoke-CimMethod -InputObject $session -MethodName ApplyApplicableUpdates

Dieses Cmdlet kann unmittelbar nach der Erkennung von Updates verwendet werden. Daher habe ich hier auch die Variable ‚$session‘ nicht neu deklariert. Sollte die PowerShell-Sitzung zwischenzeitlich beendet worden sein, muss die Variable $session u.U. vor der Anwendung von Updates neu definiert werden.

Hier der gesamte Vorgang im Überblick:

Nano Server 9
Update-Prüfung und -Installation

Wenn es im Anschluss der Installation und evtl. eines Neustarts um die Überprüfung der installierten Updates geht, kann eine etwas abgewandelte Befehlsstruktur die gewünschten Ergebnisse liefern:

$session = New-CimInstance -Namespace root/Microsoft/Windows/WindowsUpdate -ClassName MSFT_WUOperationsSession

Invoke-CimMethod -InputObject $session -MethodName ScanForUpdates -Arguments @{SearchCriteria="IsInstalled=1";OnlineScan=$true}

Die Ausgabe verhält sich dabei wie folgt – das Cmdlet ‚Get-WindowsPackage‘ gibt darüber hinaus Auskunft über den Installationsstand einzelner Komponenten:

Nano Server 10
Auslesen installierter Updates

Inwieweit diese Art der Aktualisierung im finalen Produkt enthalten sein wird, bleibt abzuwarten. Auch die Kombination mit WSUS oder SCCM dürfte dann interessant werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.