Windows PXE Boot
(Autor: Gerd Hofmann, RRZE Abteilung Zentrale Systeme)
Das RRZE bietet für die direkt betreuten Einrichtungen automatische Netzwerkinstallationen über PXE-Boot an. Als Betriebssysteme werden SuSe Linux (SLES, OpenSuSE) und Microsoft Windows (XP, 2003, Vista) unterstützt. Dieser Artikel wendet sich an die Administratoren der nicht direkt durch das RRZE betreuten Einrichtungen an der Universität Erlangen-Nürnberg. Es wird anhand einer Schritt-für-Schritt-Anleitung beschrieben, wie Windows-Bootmedien mit einem bereits bestehenden Linux TFTP-Server und PXELINUX eingerichtet werden.
Auf Microsoft RIS (Remote Installation Service) bzw. den Nachfolger WDS (Windows Deployment Service) wird hier nicht eingegangen. Konsultieren Sie bei Fragen diesbezüglich bitte die Dokumentation von Microsoft.
Übersicht
1. Voraussetzungen
2. Booten von Windows Vista WIM-Images (WinPE 2.0) via Linux tftpd-hpa/pxelinux
2.1 Windows PXE-Bootfiles auf den tftp-Server kopieren
2.2 Windows Vista PE WIM-Image auf den tftp-Server kopieren
2.3 Konfiguration von pxelinux zum Booten des Vista PE WIM-Images
2.4 Anfragen an den tftp-Server während eines PXE Bootvorgangs
2.5 Mehrere verschiedene WIM-Images per PXE Booten
3. Booten von Windows XP/2003 ISOs (WinPE1.x / WinPE2004 / WinPE2005) via Linux tftpd-hpa/pxelinnux
1. Voraussetzungen
Es wird vorausgesetzt, dass sowohl ein DHCP-Dienst (z.B. isc-dhcpd) als auch ein TFTP-Dienst (z.B. tftpd-hpa) bereits vorhanden sind.
Auf die Einrichtung dieser Dienste wird daher in diesem Artikel nicht eingegangen.
In den Beispielen wird der Einfachheit halber angenommen, dass das tftpboot-Verzeichnis als Laufwerksbuchstabe über z.B. ein Samba-Share für den Windows-Administrator erreichbar ist.
Alternativ kann der Dateitransfer auch über SSH/SFTP oder SecureFTP stattfinden.
Bei Fragen bezüglich des DHCP-Dienstes wenden Sie sich bitte an die Netzwerkabteilung des RRZE.
Weitere Informationen zum Einrichten eines DHCP- und TFTP-Dienstes unter Linux finden Sie im Artikel Linux Booten übers Netz (PXE).
Des Weiteren wird vorausgesetzt, dass die notwendigen Bootmedien (Windows PE2005 oder Windows PE 2.0 / WAIK) ebenfalls bereits vorhanden sind.
Bitte achten Sie darauf, dass die Bootmedien möglichst klein sind. Z.B. ist eine voll ausgestattete BartPE CD eher ungeeignet für einen PXE-Boot, da das gesamte ISO-Abbild in den RAM des zu bootenden PCs geladen werden muss. Mit einem ISO-Abbild der WinPE2005 über 512MB bricht der PXE-Bootvorgang mit einer Fehlermeldung ab, auch wenn das Zielsystem über deutlich mehr als 512MB RAM verfügt. Für den PXE-Boot gilt also: Je weniger - umso besser! Alle weiteren notwendigen Dateien sollten daher entweder über http, ftp oder ein Netzlaufwerk verfügbar sein.
Um mehr als eine Version der WinPE per PXE booten zu können, müssen einige Binärdateien angepasst werden.
Die Änderungen können entweder manuell mit einem beliebigen Hexeditor oder wie hier beschrieben per Skript und dem OpenSource Tool namens
gsar (General Search and Replace)
vorgenommen werden.
Für Vista PE ist zusätzlich das Tool editbin, das im frei verfügbaren
Visual Studio 2005 Express
enthalten ist, zum Anpassen der Checksummen notwendig.
2. Booten von Windows Vista WIM-Images (WinPE 2.0) via Linux tftpd-hpa/pxelinux
Im Folgenden wird beschrieben, wie die aktuelle Version des Microsoft Windows Preinstallation Environments (WinPE 2.0) für das Betriebssystem Windows Vista für den PXE-Boot eingerichtet wird.
Im Gegensatz zu den vorhergehenden Windows-Versionen liegt Windows Vista und auch die Windows PE 2.0 in einem Microsoft eigenen Imageformat auf den Installations- bzw. Boot-CDs/DVDs vor.
Für den PXE-Boot wird nicht mehr das komplette ISO-Abbild benötigt, sondern nur noch die WIM-Datei von Windows PE 2.0.
Wie bereits im Abschnitt Voraussetzungen beschrieben wird hier angenommen, dass eine Windows PE 2.0 vorhanden ist.
Falls nicht, kann diese mit dem kostenlos auf den Microsoft Webseiten verfügbaren
Windows Automated Installation Kit (WAIK)
erstellt und angepasst werden.
2.1 Windows PXE-Bootfiles auf den tftp-Server kopieren
Zunächst werden die für den PXE-Boot notwendigen Dateien aus dem WIM-Image und dem Boot-Verzeichnis der WinPE 2.0 CD in ein Verzeichnis am tftp-Server kopiert.
Windows Vista geht dabei von einem Verzeichnis Boot im Wurzelverzeichnis des tftp-servers aus (Groß-Kleinschreibung ist relevant!).
Um die PXE-Bootdateien aus dem WIM-Image kopieren zu können, wird das WIM-Image (in diesem Beispiel die Datei E:\RRZE\Windows-Vista\PE\winpe.wim)
in das leere Verzeichnis E:\RRZE\Windows-Vista\PE\mount gemountet.
Dazu kommt das Tool imagex.exe aus dem
Windows Automated Installation Kit (WAIK)
zum Einsatz.
Für das Mounten und Unmounten ist eine administrative Kennung unter Windows notwendig.
E:\RRZE\Windows-Vista\PE>imagex /mount winpe.wim 1 mount
ImageX Tool for Windows
Copyright (C) Microsoft Corp. 1981-2005. All rights reserved.
Mounting: [E:\RRZE\Windows-Vista\PE\winpe.wim, 1] ->
[E:\RRZE\Windows-Vista\PE\mount]
Successfully mounted image.
Jetzt werden die Dateien aus dem gemounteten Verzeichnis E:\RRZE\Windows-Vista\PE\mount\Windows\Boot\PXE in das Verzeichnis des TFTP-Servers (in diesem Beispiel das Netzlaufwerk T:) kopiert.
E:\RRZE\Windows-Vista\PE>mkdir t:\Boot E:\RRZE\Windows-Vista\PE>xcopy /s mount\Windows\Boot\PXE\*.* t:\Boot mount\Windows\Boot\PXE\abortpxe.com mount\Windows\Boot\PXE\bootmgr.exe mount\Windows\Boot\PXE\hdlscom1.com mount\Windows\Boot\PXE\hdlscom1.n12 mount\Windows\Boot\PXE\hdlscom2.com mount\Windows\Boot\PXE\hdlscom2.n12 mount\Windows\Boot\PXE\pxeboot.com mount\Windows\Boot\PXE\pxeboot.n12 mount\Windows\Boot\PXE\WdsConfig.inf mount\Windows\Boot\PXE\wdsnbp.com mount\Windows\Boot\PXE\cs-CZ\bootmgr.exe.mui mount\Windows\Boot\PXE\da-DK\bootmgr.exe.mui mount\Windows\Boot\PXE\de-DE\bootmgr.exe.mui mount\Windows\Boot\PXE\el-GR\bootmgr.exe.mui mount\Windows\Boot\PXE\en-US\bootmgr.exe.mui mount\Windows\Boot\PXE\es-ES\bootmgr.exe.mui mount\Windows\Boot\PXE\fi-FI\bootmgr.exe.mui mount\Windows\Boot\PXE\fr-FR\bootmgr.exe.mui mount\Windows\Boot\PXE\hu-HU\bootmgr.exe.mui mount\Windows\Boot\PXE\it-IT\bootmgr.exe.mui mount\Windows\Boot\PXE\ja-JP\bootmgr.exe.mui mount\Windows\Boot\PXE\ko-KR\bootmgr.exe.mui mount\Windows\Boot\PXE\nb-NO\bootmgr.exe.mui mount\Windows\Boot\PXE\nl-NL\bootmgr.exe.mui mount\Windows\Boot\PXE\pl-PL\bootmgr.exe.mui mount\Windows\Boot\PXE\pt-BR\bootmgr.exe.mui mount\Windows\Boot\PXE\pt-PT\bootmgr.exe.mui mount\Windows\Boot\PXE\ru-RU\bootmgr.exe.mui mount\Windows\Boot\PXE\sv-SE\bootmgr.exe.mui mount\Windows\Boot\PXE\tr-TR\bootmgr.exe.mui mount\Windows\Boot\PXE\zh-CN\bootmgr.exe.mui mount\Windows\Boot\PXE\zh-HK\bootmgr.exe.mui mount\Windows\Boot\PXE\zh-TW\bootmgr.exe.mui 33 File(s) copied
Anschließend wird das Mounten des WIM-Images rückgängig gemacht (unmount).
E:\RRZE\Windows-Vista\PE>imagex /unmount mount ImageX Tool for Windows Copyright (C) Microsoft Corp. 1981-2005. All rights reserved. Unmounting: [E:\RRZE\Windows-Vista\PE\mount]... Successfully unmounted image.
Nun fehlen noch die Bootfiles von der Vista PE- oder Installations-CD/DVD (in diesem Beispiel G:\boot).
E:\RRZE\Windows-Vista\PE>xcopy /s g:\boot\*.* t:\Boot G:\boot\bcd G:\boot\boot.sdi G:\boot\bootfix.bin G:\boot\bootsect.exe G:\boot\etfsboot.com G:\boot\memtest.exe G:\boot\en-us\bootsect.exe.mui G:\boot\fonts\chs_boot.ttf G:\boot\fonts\cht_boot.ttf G:\boot\fonts\jpn_boot.ttf G:\boot\fonts\kor_boot.ttf G:\boot\fonts\wgl4_boot.ttf 12 File(s) copied
Da die Groß-Kleinschreibung eine Rolle spielt, müssen die Dateinamen ggf. noch angepasst werden. Dies wird am besten direkt in einer Shell am Linux Server gemacht, um Probleme mit der Namensumsetzung durch Samba zu vermeiden.
cslinux /# cd /tftpboot/Boot Directory: /tftpboot/Boot cslinux /tftpboot/Boot# mv bcd BCD cslinux /tftpboot/Boot# mv fonts Fonts
Alle übrigen bisher kopierten Dateien müssen kleingeschrieben sein bzw. bleiben.
Des Weiteren wird die Datei bootmgr.exe im Wurzelverzeichnis des tftp-Servers erwartet.
Daher wird je nach Belieben entweder kopiert, verschoben oder ein symbolischer Link angelegt.
In diesem Beispiel fällt die Wahl auf den symbolischen Link, um die Zugehörigkeit der Datei zum Verzeichnis Boot zu verdeutlichen.
Falls die Internationalisierung erwünscht ist, sollten auch die MUI-Unterverzeichnisse der zu verwendeten Sprachen angepasst werden.
Hier wird dies anhand der englischen Sprachdatei exemplarisch gezeigt.
cslinux /tftpboot/Boot# cd /tftpboot Directory: /tftpboot cslinux /tftpboot# ln -s Boot/bootmgr.exe . cslinux /tftpboot# cd /tftpboot/Boot/en-US Directory: /tftpboot/Boot/en-US cslinux /tftpboot/Boot/en-US# mv bootmgr.exe.mui bootmgr.EXE.MUI ...
Das Verzeichnis Boot wird neben dieser Schreibweise auch noch als kleingeschriebenes Verzeichnis boot referenziert.
Daher wird hier ebenfalls ein symbolischer Link angelegt.
cslinux /tftpboot/Boot/en-US# cd /tftpboot Directory: /tftpboot cslinux /tftpboot# ln -s Boot boot
2.2 Windows Vista PE WIM-Image auf den tftp-Server kopieren
Nachdem die für den Bootvorgang selbst notwendigen Dateien am tftp-Server eingerichtet sind, wird nun das WinPE WIM-Image selbst in das Verzeichnis des tftp-Servers kopiert.
Die WIM-Datei muss dabei boot.wim heißen und wird im Verzeichnis sources erwartet.
Dies kann bei Bedarf mit dem Vista Tool
in der Bootdatei BCD angepasst werden.
In diesem Beispiel soll die Datei BCD unverändert bleiben.
bcdedit.exe
E:\RRZE\Windows-Vista\PE>mkdir t:\sources E:\RRZE\Windows-Vista\PE>copy winpe.wim t:\sources\boot.wim
2.3 Konfiguration von pxelinux zum Booten des Vista PE WIM-Images
Das Vista PE Image soll nun in einem grafischen Auswahlmenü angezeigt werden.
Es wird angenommen, dass bereits ein grafisches pxelinux-Hauptmenü vorhanden ist.
In diesem Beispiel wird für den Windows-PXE-Boot ein eigenes grafisches Untermenü angelegt (/tftpboot/pxelinux.cfg/win.submenu).
DEFAULT vesamenu.c32
PROMPT 0
TIMEOUT 300
MENU BACKGROUND bg.png
MENU TITLE Windows Vista PXE Boot Service for RRZE
LABEL winpevista
MENU LABEL Windows PE 2.0 / Windows Vista AIK
KERNEL Boot/pxeboot.0
LABEL returnfromwinmenu
MENU LABEL Mainmenu
KERNEL vesamenu.c32
APPEND ~
MENU DEFAULT
Die Datei Boot/pxeboot.0 kann dabei entweder die Datei pxeboot.com oder pxeboot.n12 sein.
Die Datei pxeboot.com fordert zum Drücken der F12 Taste auf, während die Datei pxeboot.n12 ohne Nachfrage den PXE-Bootvorgang startet.
In diesem Beispiel wird ein symbolischer Link auf die Datei pxeboot.n12 eingerichtet.
cslinux /tftpboot/Boot# ln -s pxeboot.n12 pxeboot.0
Die Pfadnamen, die beim PXE-Boot angefordert werden, enthalten anstelle dem unter Linux verwendeten Verzeichnistrennzeichen '/' das unter Windows typische Trennzeichen '\'.
Damit die Dateien vom tftp-Server gefunden werden, wird eine sogenannte Remap-Rule eingerichtet, die die Trennzeichen automatisch umsetzt.
Dies wird in diesem Beispiel in der Remap-Rule-Konfigurationsdatei /etc/tftp_remap.conf eingerichtet.
rg \\ /
Da bisher beim Anlegen der Verzeichnisse und Kopieren der PXE-Bootdateien auf Groß-Kleinschreibung geachtet wurde, sind keine weiteren Remap-Rules notwendig. Nun kann Windows Vista PE vom Netzwerk gebootet werden. Falls es dennoch Schwierigkeiten geben sollte, können die tftpd-Meldungen in den Logdateien zur weiteren Fehlersuche konsultiert werden.
2.4 Anfragen an den tftp-Server während eines PXE Bootvorganges
Die Dateien werden bei einem Bootvorgang in folgender Reihenfolge und Groß-Kleinschreibweise vom tftp-Server (relativ zu /tftpboot) angefragt.
Wiederholte Anfragen sind hier ebenfalls dokumentiert.
Die Remap-Rule sorgt dafür, dass das Windows-Verzeichnistrennzeichen "\" zum Linux-Verzeichnistrennzeichen "/" umgesetzt wird.
... /Boot/pxeboot.0 bootmgr.exe \Boot\Fonts\wgl4_boot.ttf \Boot\Fonts\wgl4_boot.ttf \boot.ini wird für den Windows Vista PE PXE Boot nicht benötigt \Boot\BCD \Boot\BCD \Boot\en-US\bootmgr.EXE.MUI \Boot\en-US\bootmgr.EXE.MUI \Boot\Fonts\wgl4_boot.ttf \Boot\Fonts\wgl4_boot.ttf \hiberfil.sys wird für den Windows Vista PE PXE Boot nicht benötigt \sources\boot.wim \boot\boot.sdi \boot\boot.sdi \sources\boot.wim \Boot\Fonts\wgl4_boot.ttf \Boot\Fonts\wgl4_boot.ttf ... die boot.wim-Datei wird in die Ramdisk geladen...
2.5 Mehrere verschiedene WIM-Images per PXE Booten
Das bisherige Beispiel ist wegen hartkodierter Pfade in den Dateien auf ein WIM-Image beschränkt.
Um mehrere WIM-Images direkt im pxelinux-Menü auswählen und booten zu können, ist das editieren einiger Dateien notwendig.
Folgende Batch-Datei kann im Verzeichnis Boot aufgerufen werden und legt 26 Verzeichnisse (a-z) zum Booten von 26 verschiedenen WIM-Images an.
Das Skript funktioniert wegen bcdedit nur mit Windows Vista (nicht mit Windows 2000, Windows XP oder Windows 2003 Server)!
@echo off
rem Vista WinPE 2.0 Multi Boot via pxelinux
rem Gerd Hofmann, 2007
rem script depends on:
rem o gsar (gnuwin32 utilities)
rem o editbin (Microsoft Visual Studio 2005 Express)
rem o bcdedit (Windows Vista Boot Configuration Editor)
FOR /d %%a IN (a b c d e f g h i j k l m n o p q r s t u v w x y z) DO (
mkdir %%a
gsar -f -sbootmgr.exe -rbootm_%%a.exe pxeboot.com %%a\pxebo_%%a.com
gsar -f -sbootmgr.exe -rbootm_%%a.exe pxeboot.n12 %%a\pxebo_%%a.n12
rem "\Boot\BCD": \ B o o t \ B C D
rem ->UNICODE: 00 5c 00 42 00 6f 00 6f 00 74 00 5c 00 42 00 43 00 44
rem \BCD --> \B_%%a
gsar -f -s:x00\:x00B:x00C:x00D -r:x00\:x00B:x00_:x00%%a bootmgr.exe %%a\bootm_%%a.exe
editbin %%a\bootm_%%a.exe /release
copy BCD %%a\B_%%a
bcdedit /store %%a\B_%%a /set {bootmgr} nointegritychecks Yes
bcdedit /store %%a\B_%%a /create {ramdiskoptions} /d "Ramdisk options"
bcdedit /store %%a\B_%%a /set {ramdiskoptions} ramdisksdidevice boot
bcdedit /store %%a\B_%%a /set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi
bcdedit /store %%a\B_%%a /set {default} device ramdisk=[boot]\sources\boot_%%a.wim,{ramdiskoptions}
bcdedit /store %%a\B_%%a /set {default} osdevice ramdisk=[boot]\sources\boot_%%a.wim,{ramdiskoptions}
)
Je nach Bedarf können die erzeugten Dateien direkt in das Verzeichnis Boot am tftp-Server kopiert oder verlinkt werden.
Die Datei bootm_X.exe (X steht hier für eines der Buchstaben aus a-z) wird hier analog zu bootmgr.exe im Wurzelverzeichnis des tftp-Servers erwartet.
Das jeweilig dazugehörige WIM-Image wird im Verzeichnis sources erwartet.
3. Booten von Windows XP/2003 ISOs (WinPE1.x / WinPE2004 / WinPE2005) via Linux tftpd-hpa/pxelinnux
Der folgende Abschnitt beschreibt stichpunktartig das Einrichten des PXE-Boots der älteren Windows PE Bootmedien.
3.1 Extrahieren der PXE-Bootfiles von der original Windows-CD (XP oder 2003 Server)
- Kopieren von Dateien
copy G:\I386\NTDETECT.COM t:\PE2005\ntdetect.com
- Extrahieren von Dateien
expand G:\I386\setupldr.ex_ t:\PE2005\setupldr.exe expand G:\I386\ramdisk.in_ t:\PE2005\ramdisk.inf expand G:\I386\ramdisk.sy_ t:\PE2005\ramdisk.sys expand G:\I386\startrom.co_ t:\PE2005\startrom.com
3.2 Erstellen eines PXELINUX Bootmenues (vesamenu)
- Bootmenuefile z.B. pxelinux.cfg/win.submenu
DEFAULT vesamenu.c32 PROMPT 0 TIMEOUT 300 MENU BACKGROUND bg.png MENU TITLE Windows XP/2003 PXE Boot Service for RRZE LABEL winpe2005 MENU LABEL Windows PE 2005 Boot KERNEL PE2005/startrom.0 LABEL returnfromwinmenu MENU LABEL Mainmenu KERNEL vesamenu.c32 APPEND ~ MENU DEFAULT
3.3 Erstellen der Bootdatei winnt.sif
- PE2005/winnt.sif
[SetupData] BootDevice = "ramdisk(0)" BootPath = "\i386\System32\" OsLoadOptions = "/noguiboot /fastdetect /minint /rdexportascd /rdpath=PE2005\WINPE.ISO"
3.4 Anlegen von symbolischen Links
- Symbolische Links im Pfad PE2005
ln -s startrom.n12 startrom.0
- Symbolische Links im tftpboot Wurzelverzeichnis
ln -s PE2005/ntdetect.com . ln -s PE2005/setupldr.exe NTLDR ln -s PE2005/winnt.sif .



