Windows-PE des WAIK für Windows 7 via PXELinux aus dem Netz
Windows-PE (Preinstallation Environment) ist kein Betriebssystem zur normalen Nutzung durch den Endanwender. Es wird zur Installation des eigentlichen Windows-Betriebssystems benutzt, darüber hinaus aber auch für Reparatur und Imaging-Zwecke. Es ist Bestandteil des WAIK (Windows Automated Installation Kit) von Microsoft für Windows Vista und neuer. Man kann es von verschiedensten Medien booten, u.A. aus dem Netz via PXE. Auf PXE an sich oder Windows-PE wird hier nicht weiter eingeganen. Hier liegt der Fokus auf das Booten von Windows-PE von einem unter Linux laufenden Server, das Boot inkl. Boot-Menü erfolgt zunächst via PXELinux (Bestandteil des SYSLinux-Paketes).
Für unseren Ausbildungsraum (PC-Pool) haben wir bisher das Windows-PE von Windows-Vista per PXE von einem Linux-Server via PXELinux gebootet. Dazu gibt es eine gute und ausführliche Anleitung des RZ der Uni-Erlangen. Nun haben wir diese Umgebung für Windows-7-Tests aktualisiert. Dabei booten wir mit einem PXELinux-Booteintrag in einen Windows-Bootmanager, der die Auswahl für ein 32- und ein 64-Bit-System anbietet (nach einem Timeout wird standardmäßig die 32-Bit-Variante gewählt).
Die wesentlichen (Informations-) Quellen bei der Einrichtung sind:
- Das WAIK selbst: Windows Automated Installation Kit (AIK) for Windows 7 (dieser Doku liegt die Version 1.0 vom 6.8.2009 deutsch zugrunde, noch die aktuellste Version am 21.7.2011)
- Anleitung von Microsoft zur Konfiguration eines Drittanbieter-PXE-Servers (Walkthrough: Deploy an Image by Using PXE) auf MS-TechNet, fast identisch zu finden in der WAIK-Dokumentation (im Index der waik.chm nach PXE suchen),
- Anleitung zu SYSLinux bzw. PXELinux, insbesondere dass PXE-Bootstrap-Programme, die PXELinux bootet, auf ".0" enden müssen,
- Diverse Quellen und Online-Hilfe zu bcdedit (auf Vista an der Kommandozeile: \windows\system32\bcdedit /?).
Datei aus dem WAIK
Man muss mithilfe des WAIK Dateien zusammenstellen (hierbei folgt man grob dem o.g. Walkthrough-Guide von Microsoft), die man auf ein anzulegendes tftp-Unterverzeichnis Boot auf den Linux-Server kopiert. Bis auf die eigentliche Windows-PE-Image-Datei (Endung .wim) stellten sich die Boot-Dateien nicht als 32-/64-Bit-abhängig heraus.
- Man startet zunächst aus dem Start-Programme-Menü die Eingabeaufforderung für Bereitstellungscode des WAIK als Administrator (unter Vista/Windows7 ggf. mit rechter Maustaste)
- Ausführen folgender Kommandos:
rem Erstellung von WinPE-Images und Rauskopieren der benoetigten Dateien rem vgl. Microsoft-TechNet, Walkthrough: Deploy an Image by Using PXE rem Auszufuehren innerhalb der WAIK-Eingabeaufforderung f. Bereitst. rem 20090826-HH rem Zielverzeichnis anlegen, da spaeter Dateien fuer PXE-Server rausholen: if exist C:\pxe-tftp rmdir C:\pxe-tftp /s /q mkdir C:\pxe-tftp mkdir C:\pxe-tftp\Boot rem WinPE-Quellimages erstellen if exist C:\winpe-x86 rmdir C:\winpe-x86 /s /q call copype.cmd x86 C:\winpe-x86 if exist C:\winpe-x64 rmdir C:\winpe-x64 /s /q call copype.cmd amd64 C:\winpe-x64 rem Rauskopieren von Dateien aus Images rem sind architekturunabhaengig, amd64 hat aber zusaetzlich wdsmgfw.efi imagex /mount C:\winpe-x64\winpe.wim 1 C:\winpe-x64\mount xcopy C:\winpe-x64\mount\Windows\Boot\PXE\*.* C:\pxe-tftp\Boot /s /e imagex /unmount C:\winpe-x64\mount copy "%ProgramFiles%\Windows AIK\Tools\PETools\x86\boot\boot.sdi" C:\pxe-tftp\Boot rem architekturabhaengige Dateien kopieren copy C:\winpe-x86\winpe.wim C:\pxe-tftp\Boot\winpex86.wim copy C:\winpe-x64\winpe.wim C:\pxe-tftp\Boot\winpex64.wim echo Verzeichnis Boot (inkl. Unterverz.) in C:\pxe-tftp in das echo tftp-Verzeichnis des Servers uebertragen.
- Verzeichnis Boot mit Dateien und Unterverzeichnissen vom Windows-Rechner aus C:\pxe-tftp auf das tftp-Verzeichnis auf dem Linux-Server übertragen
BCD-Erstellung mit bcdedit auf einem Vista-PC
Grob ist das in der o.g. Technet-Anleitung beschrieben. Da wir aber sowohl 32- als auch 64-Bit Windows-PE haben wollen, mussten wir es modifizieren. Zudem haben wir die Befehle in eine Batch-Datei gesteckt (^ am Zeilenende bedeutet nur Zeilenumbruch innerhalb eines einzelnen Kommandos, ähnlich zu \ unter Unix; wenn es zu Fehlermeldungen kommt, die Zeilen wieder im Editor zusammenfügen ohne ^ und ohne Umbruch versuchen):
rem BCD-Erstellung fuer PXE-Boot von WAIK-Windows-7
rem vgl. http://www.rrzn.uni-hannover.de/anl-waikpxe.html
rem 20100716-HH
del BCD
c:\windows\system32\bcdedit -createstore BCD
c:\windows\system32\bcdedit -store BCD -create {ramdiskoptions}
c:\windows\system32\bcdedit -store BCD -set {ramdiskoptions} ramdisksdidevice boot
c:\windows\system32\bcdedit -store BCD -set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi
for /f " usebackq delims={} tokens=2" %%i IN ^
(`c:\windows\system32\bcdedit -store BCD -create /d "WinPE-x86 Boot Image" /application osloader`) ^
do set GUIDx86=%%i
for /f " usebackq delims={} tokens=2" %%i IN ^
(`c:\windows\system32\bcdedit -store BCD -create /d "WinPE-x64 Boot Image" /application osloader`) ^
do set GUIDx64=%%i
echo GUID x86: %GUIDx86%
echo GUID x64: %GUIDx64%
echo GUIDs gemaess bcdedit:
c:\windows\system32\bcdedit -store BCD -enum
c:\windows\system32\bcdedit -store BCD -set {%GUIDx86%} systemroot \Windows
c:\windows\system32\bcdedit -store BCD -set {%GUIDx86%} detecthal Yes
c:\windows\system32\bcdedit -store BCD -set {%GUIDx86%} winpe Yes
c:\windows\system32\bcdedit -store BCD -set {%GUIDx86%} osdevice ramdisk=[boot]\Boot\winpex86.wim
c:\windows\system32\bcdedit -store BCD -set {%GUIDx86%} device ramdisk=[boot]\Boot\winpex86.wim,{ramdiskoptions}
c:\windows\system32\bcdedit -store BCD -set {%GUIDx64%} systemroot \Windows
c:\windows\system32\bcdedit -store BCD -set {%GUIDx64%} detecthal Yes
c:\windows\system32\bcdedit -store BCD -set {%GUIDx64%} winpe Yes
c:\windows\system32\bcdedit -store BCD -set {%GUIDx64%} osdevice ramdisk=[boot]\Boot\winpex64.wim
c:\windows\system32\bcdedit -store BCD -set {%GUIDx64%} device ramdisk=[boot]\Boot\winpex64.wim,{ramdiskoptions}
c:\windows\system32\bcdedit -store BCD -create {bootmgr} /d "WinPE BootManager"
c:\windows\system32\bcdedit -store BCD -timeout 30
c:\windows\system32\bcdedit -store BCD -default {%GUIDx86%}
c:\windows\system32\bcdedit -store BCD -displayorder {%GUIDx86%} {%GUIDx64%}
Die resultierende Datei BCD muss in das tftp-Unterverzeichnis Boot auf dem Linux-Server kopiert werden.
Nacharbeiten auf dem Linux-Server
Das einfache Reinkopieren des Unterverzeichnisses Boot in das tftp-Verzeichnis reicht noch nicht aus. Man muss noch zwei Links setzen:
- Die Datei pxeboot.n12 ist die erste, die von PXELinux gestartet
werden soll (pxeboot.com geht auch, die bootet aber
default-mäßig
von Festplatte und man muss F12 für die Fortsetzung des Netzboots
drücken). PXELinux muss dabei pxeboot.n12 aber als
PXE-Bootloader behandeln. Damit PXELinux das tut, muss die Datei auf
.0 enden. Daher im tftp-Unterverzeichnis Boot einmal eingeben:
ln -s pxeboot.n12 pxeboot.0 - Die Datei bootmgr.exe muss nicht in Boot sondern
direkt im tftp-Wurzelverzeichnis liegen. Wir behelfen uns mit einem Link,
da es auch implizit die Zugehörigkeit der Datei zu Win-PE dokumentiert.
Im tftp-Wurzelverzeichnis aufrufen:
ln -s Boot/bootmgr.exe .
Zudem gibt es ein generells Problem mit Pfaden, der Trenner für Pfadangaben ist unter Windows der Backslash (\) und unter Unix der normale Schrägstrich (/). Da das bootende WAIK vom tftp-Server Dateien in Windows-Notation abfragt, muss der tftp-Server das in Unix-Angaben umsetzen. Unter Debian haben wir dafür den HPA-tftpd benutzt (aptitude install tftpd-hpa) und wie folgt konfiguriert:
- Anlegen einer Datei /etc/tftp_remap.conf mit Übersetzungsregeln. Für die Slash-Umsetzung muss die Datei die Zeile rg \\ / enthalten.
- In der Datei /etc/default/tftpd-hpa wird dann die eben erstellte
Übersetzungsregel mit der Option -m /etc/tftp_remap.conf
aktiviert (bei uns steht dann in der Datei die Zeile
OPTIONS="-v -l -s /srv/tftpboot -m /etc/tftp_remap.conf").
Dies gilt für Debian, in anderen Distributionen oder beim Start über Inetd steht Ähnliches evt. in /etc/inetd.conf oder in /etc/xinetd.d/tftp.
Das WAIK braucht zwingend eine next-server-Option im DHCP, während es für PXELinux bei dhcpd und tftpd auf dem gleichen Server entbehrlich ist. Falls das im dhcpd fehlt, kommt nur eine ganz allgemeine tftp-betreffende Fehlermeldung vom WAIK am Client.
Inhalt des tftp-Verzeichnis auf dem Linux-Server
Gelistet sind im Folgenden nur die neu durch Windows-PE hinzugekommenen Dateien und Verzeichnisse, nicht z.B. pxelinux.0.
tftp-Wurzelverzeichnis (bei uns /srv/tftpboot/)
drwxr-xr-x 25 root root 4096 2009-08-28 14:41 Boot lrwxrwxrwx 1 root root 16 2009-07-29 12:01 bootmgr.exe -> Boot/bootmgr.exe
Windows-PE-Verzeichnis Boot/ (bei uns /srv/tftpboot/Boot/)
-rw-r--r-- 1 root root 79 2009-06-10 23:44 abortpxe.com -rw-r--r-- 1 root root 16384 2009-07-29 13:31 BCD -rw-r--r-- 1 root root 523328 2009-07-14 03:26 bootmgr.exe -rw-r--r-- 1 root root 3170304 2009-06-10 14:44 boot.sdi drwxr-xr-x 2 root root 4096 2009-08-26 16:50 cs-CZ drwxr-xr-x 2 root root 4096 2009-08-26 16:50 da-DK drwxr-xr-x 2 root root 4096 2009-08-26 16:50 de-DE drwxr-xr-x 2 root root 4096 2009-08-26 16:50 el-GR drwxr-xr-x 2 root root 4096 2009-08-26 16:50 en-US drwxr-xr-x 2 root root 4096 2009-08-26 16:50 es-ES drwxr-xr-x 2 root root 4096 2009-08-26 16:50 fi-FI drwxr-xr-x 2 root root 4096 2009-08-26 16:50 fr-FR -rw-r--r-- 1 root root 26076 2009-06-10 23:15 hdlscom1.com -rw-r--r-- 1 root root 26060 2009-06-10 23:15 hdlscom1.n12 -rw-r--r-- 1 root root 26076 2009-06-10 23:15 hdlscom2.com -rw-r--r-- 1 root root 26060 2009-06-10 23:15 hdlscom2.n12 drwxr-xr-x 2 root root 4096 2009-08-26 16:50 hu-HU drwxr-xr-x 2 root root 4096 2009-08-26 16:50 it-IT drwxr-xr-x 2 root root 4096 2009-08-26 16:50 ja-JP drwxr-xr-x 2 root root 4096 2009-08-26 16:50 ko-KR drwxr-xr-x 2 root root 4096 2009-08-26 16:50 nb-NO drwxr-xr-x 2 root root 4096 2009-08-26 16:50 nl-NL drwxr-xr-x 2 root root 4096 2009-08-26 16:50 pl-PL drwxr-xr-x 2 root root 4096 2009-08-26 16:50 pt-BR drwxr-xr-x 2 root root 4096 2009-08-26 16:50 pt-PT lrwxrwxrwx 1 root root 11 2009-08-28 15:00 pxeboot.0 -> pxeboot.n12 -rw-r--r-- 1 root root 25772 2009-06-10 23:15 pxeboot.com -rw-r--r-- 1 root root 25772 2009-06-10 23:15 pxeboot.n12 drwxr-xr-x 2 root root 4096 2009-08-26 16:50 ru-RU drwxr-xr-x 2 root root 4096 2009-08-26 16:50 sv-SE drwxr-xr-x 2 root root 4096 2009-08-26 16:50 tr-TR -rw-r--r-- 1 root root 1347 2009-06-10 23:06 WdsConfig.inf -rw-r--r-- 1 root root 527360 2009-07-14 01:30 wdsmgfw.efi -rw-r--r-- 1 root root 31124 2009-06-10 23:44 wdsnbp.com -rw-r--r-- 1 root root 135712770 2009-07-13 22:19 winpex64.wim -rw-r--r-- 1 root root 114676416 2009-07-13 21:03 winpex86.wim drwxr-xr-x 2 root root 4096 2009-08-26 16:50 zh-CN drwxr-xr-x 2 root root 4096 2009-08-26 16:50 zh-HK drwxr-xr-x 2 root root 4096 2009-08-26 16:50 zh-TW
Die Unterverzeichnisse mit den Fonts und Sprach-Dateien listen wir hier nicht auf, man kann sie auch komplett weglassen (Windows-PE versucht zwar, Fonts etc. zu laden, funktioniert aber auch ohne).
Bootmenü-Eintrag für PXELinux
In die PXELinux-Konfiguration pxelinux.cfg/default (o.Ä.) trägt man zusätzlich Boot/pxeboot.0 als Kernel ein:
... LABEL winpe7 MENU LABEL Windows PE WAIK-Win7 (Vers. 1.0) 32&64-Bit KERNEL Boot/pxeboot.0 ...
32- oder 64-Bit WAIK?
Ist das WAIK-Booten eingerichtet, stellt sich natürlich die Frage, wann man denn bei der Benutzung die 32- oder die 64-Bit-Variante wählen soll. Unsere Tests ergaben:
- 32-Bit
Für alle Versionen von XP, 2003 und Vista muss das 32-Bit WAIK gewählt werden (egal ob das zu installierende Windows ein 32- oder ein 64-Bit ist). Gleiches gilt für Windows-7 bei dem üblichen Installationsmedium, das sowohl die 32- als auch die 64-Bit-Variante von Windows-7 enthält. Auch wird Windows-Server 2008 vor R2 vom 32-Bit-WAIK installiert.
- 64-Bit
Uns ist bisher nur Windows-Server 2008-R2, das es ja selbst auch nur in einer 64-Bit-Version gibt, bekannt, das das 64-Bit-WAIK benötigt.
Generell richtet sich das zu wählende WAIK natürlich nach den Anforderungen des Installationsprogramm und nicht nach der Version des zu installierenden Betriebssystems. Eine Überprüfung des Executables mit dem Unix-Programm file bringt im Zweifelsfall Klarheit. Die Meldungen sind aber nicht unbedingt direkt verständlich, in den oben genannten Fällen hatten wir je nach Programmversion von file:
- 32-Bit
- MS-DOS executable PE for MS Windows (GUI) Intel 80386 32-bit
oder PE32 executable for MS Windows (GUI) Intel 80386 32-bit - 64-Bit
- MS-DOS executable PE for MS Windows (GUI) Mono/.Net assembly
oder PE32+ executable for MS Windows (GUI) Mono/.Net assembly
Kein Support
Für diesen Tipp / die Software bzw. Skripte leistet das RRZN keinen Support. Beachten Sie bitte die Hinweise auf der Anleitungen-Seite.

