Ubuntu 10.04 „Lucid Lynx“
Ubuntu 8.04 „Hardy Heron“
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
PXE heißt nichts anderes als Preboot eXecution Environment - was soviel bedeutet wie "Umgebung zum Ausführen von XYZ vor dem eigentlichen Bootvorgang". PXE bezeichnet dabei den Vorgang, um mit Hilfe einer PXE-fähigen Netzwerkkarte via DHCP eine Netzwerkkonfiguration (IP-Adresse, Adresse eines TFTP-Servers, ...) zu erhalten, und anschließend vom TFTP-Server einen Bootloader zu laden und auszuführen.
Auf diese Weise kann ein Betriebssystem geladen werden, ohne dass ein Datenträger (Festplatte, Diskette, CD etc.) auf dem Rechner (Client) benötigt wird. Alternativ kann man beispielsweise eine "Rettungsdistribution" laden, um sein System wieder herzustellen.
Wenn es lediglich darum geht, Ubuntu über PXE zu installieren, wird der Artikel PXE-Installation empfohlen. Dort sind alle notwendigen Schritte für genau diese Problemstellung zusammengefasst.
Zusätzliche Software muss nur auf dem Server installiert [1] werden, da der Client alle benötigten Daten vom Server erhält.
dhcp3-server
tftpd-hpa
nfs-kernel-server
syslinux
mit apturl
Paketliste zum Kopieren:
sudo apt-get install dhcp3-server tftpd-hpa nfs-kernel-server syslinux
sudo aptitude install dhcp3-server tftpd-hpa nfs-kernel-server syslinux
Zum Einrichten des DHCP-Server empfiehlt sich der Artikel ISC-DHCPD. An die dortige Beispielkonfiguration müssen lediglich die Anpassungen für das eigene Netzwerk gemacht werden und die beiden unten stehenden Zeilen angefügt werden [4]:
next-server 192.168.2.2; filename "/pxelinux.0";
Die folgende Konfiguration bezieht sich auf diesen Artikel. Selbstverständlich können die Netze auch anders aufgeteilt werden. Jedoch ist dann in den nachfolgenden Beispielen darauf zu achten. dass die entsprechenden Adressen angepasst werden.
# If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. authoritative; allow booting; allow bootp; #Definition des ersten Subnetzes subnet 192.168.2.0 netmask 255.255.255.0 { range 192.168.2.220 192.168.2.240; #Lease-Zeit in Sekunden default-lease-time 600; max-lease-time 7200; option domain-name-servers 192.168.2.1; option broadcast-address 192.168.2.255; option subnet-mask 255.255.255.0; #Gateway option routers 192.168.2.1; } # tftp-Server Einstellungen für PXE next-server 192.168.2.2; filename "/pxelinux.0"; # force the client to this ip for pxe. # This is only necessary assuming you want to send different images to different computers. host pxe_client { hardware ethernet xx:xx:xx:xx:xx:xx; fixed-address 192.168.2.23; }
Als Parameter für hardware ethernet
sollte natürlich die echte MAC-Adresse eines Clients eingegeben werden.
sudo mkdir /nfsroot
In der Datei /etc/exports muss noch folgende Zeile angehängt werden. Diese gibt das Verzeichnis /nfsroot für alle IP-Adressen von 192.168.2.0 bis 192.168.2.255 mit Lese- und Schreibzugriff frei.
/nfsroot 192.168.2.0/255.255.255.0(rw,no_root_squash,async)
Mit dem folgenden Befehl [3] [5] wird dann die /etc/exports neu eingelesen
sudo exportfs -rv
Weitere Informationen über die Konfigurationsmöglichkeiten des NFS-Servers sind hier zu finden.
Der Abschnitt "Einrichten des TFTP-Servers" ist dem Artikel PXE-Installation entnommen.
Der TFTP-Server kann entweder über den Inetd oder beim Systemstart als Server gestartet werden. Je nach Anwendungsfall hat jede Startmethode ihre Vorzüge.
Die Installationsroutine von tftpd-hpa schreibt nach /etc/inetd.conf folgenden Eintrag:
tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
und enthält damit einen Bug, siehe http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=404760
In einem Editor [3] mit Root-Rechten [5] muss diese Zeile deshalb angepasst werden (einzige Änderung: aus udp
wird udp4
):
tftp dgram udp4 wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
Dazu ist zuerst die Datei /etc/default/tftpd-hpa zu bearbeiten [3],[5].
#Defaults for tftpd-hpa RUN_DAEMON="yes" OPTIONS="-l -s /var/lib/tftpboot"
Die Option RUN_DAEMON="yes"
ermöglich es zum einen, dass der TFTP-Server manuell wie im folgenden Schritt gestartet werden kann und zum anderen, dass der TFTP-Server beim Systemstart mit startet.
sudo /etc/init.d/tftpd-hpa start
bzw. ab 10.04 Lucid Lynx
sudo start tftpd-hpa
dafür, dass der TFTP-Server gestartet wird.
Jetzt muss nur noch die Datei /usr/lib/syslinux/pxelinux.0 in das tftp Bootverzeichnis kopiert werden und das Konfigurationsverzeichnis pxelinux.cfg erstellt werden.
sudo cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/ && sudo mkdir /var/lib/tftpboot/pxelinux.cfg
Nach der bisher beschriebenen Installation gibt es nun einige neue interessante Verzeichnisse:
/var/lib/tftpboot/ ist das Rootverzeichnis des tftp-Servers. Hier werden die Kernel bzw. die zu bootenden Daten hinterlegt. Des Weiteren beinhaltet dieses Verzeichnis das Konfigurationsverzeichnis pxelinux.cfg.
/var/lib/tftpboot/pxelinux.cfg/ ist das Konfigurationsverzeichnis. Darin muss die Datei default enthalten sein. Auch werden hier alle clientspezifischen Konfigurationen abgelegt. Die Datei default wird nicht automatisch erstellt, sondern muss manuell angelegt werden, zur Syntax siehe unter Beispielkonfigurationen.
/nfsroot/ - dieses Verzeichnis ist das Rootverzeichnis des Clients. An dieser Stelle werden die Dateisysteme des Clients hinterlegt.
Es gibt zum einen die Datei mit dem Namen default. Diese Datei wird immer geladen, wenn keine client-spezifische Konfigurationsdatei gefunden werden kann. Somit kommen wir zu den client-spezifischen Dateien. Diese Dateien sind auf identische Art und Weise zu erstellen [3] wie die default-Datei, haben jedoch einen anderen Dateinamen.
Diese Dateinamen, können entweder die MAC-Adresse der clientseitigen Netzwerkkarte mit vorangestellter 01
sein (01-XX-XX-XX-XX-XX-XX) oder die IP des Clients in hexadezimaler Form. Beispielweise entspricht die IP-Adresse 192.0.2.91 dem hexadezimalem Wert/Dateiname C000025B. wobei dieser Dateiname auch am Ende gekürzt werden kann, um eine Konfiguration auch für mehrere Clients zu haben. Dies wird Anhand des folgenden grauen Kastens aufgezeigt, denn in diesem Kasten wird die Reihenfolge der Konfigurationsdateiaufrufe angeführt. Wenn eine Konfigurationsdatei nicht vorhanden ist, dann wird die Nächste aufgerufen.
/var/lib/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd /var/lib/tftpboot/pxelinux.cfg/C000025B /var/lib/tftpboot/pxelinux.cfg/C000025 /var/lib/tftpboot/pxelinux.cfg/C00002 /var/lib/tftpboot/pxelinux.cfg/C0000 /var/lib/tftpboot/pxelinux.cfg/C000 /var/lib/tftpboot/pxelinux.cfg/C00 /var/lib/tftpboot/pxelinux.cfg/C0 /var/lib/tftpboot/pxelinux.cfg/C /var/lib/tftpboot/pxelinux.cfg/default
An dieser Stelle ein paar Möglichkeiten, wie die Konfigurationsdateien unter verschiedenen Bedingungen aussehen könnten.
Bei dieser Konfigurationsdatei wird als Defaultwert das Label memtest
gewählt. Da keine weiteren Parameter wie PROMPT
oder TIMEOUT
angegeben sind, wird direkt memtest
und damit der Kernel mt86plus im Verzeichnis memtest/ aufgerufen.
DEFAULT memtest LABEL memtest KERNEL memtest/mt86plus
Bei dieser Konfiguration kommen zusätzlich noch die Parameter PROMPT
und TIMEOUT
hinzu. Wenn PROMPT auf 1
gesetzt, erscheint eine Eingabezeile beim Bootvorgang, in der dann das zu bootende Label eingegeben werden kann. Bei dem Parameter TIMEOUT
handelt es sich um die Zeitangabe, wie lange auf eine Eingabe gewartet werden soll, bevor das mit DEFAULT gesetzte LABEL aufgerufen wird. Die Einheit für TIMEOUT
ist 1/10 Sekunde.
Beispiel:
Würde man memtest in die Befehlszeile eintippen, dann würde sofort der Kernel mt86plus gestartet werden. andernfalls würde die Ubuntu LiveCD nach 10 Sekunden geladen werden.
Des Weiteren, sieht man an dieser Stelle das erste Mal den Parameter APPEND
. Mit diesem Parameter werden dem Kernel zusätzliche Informationen übergeben, beispielsweise, dass der nfsroot im Verzeichnis "192.168.2.2:/nfsroot/ubuntu-904" zu finden ist.
DEFAULT ubuntu-904 PROMPT 1 TIMEOUT 100 LABEL ubuntu-904 KERNEL ubuntu-904/vmlinuz APPEND boot=casper ide=nodma netboot=nfs nfsroot=192.168.2.2:/nfsroot/ubuntu-904 fetch=tftp://192.168.2.2/ubuntu-904/filesystem.squashfs initrd=ubuntu-904/initrd.gz LABEL memtest KERNEL memtest/mt86plus
Man kann pxelinux auch dazu anweisen, eine Textdatei vor dem Prompt anzuzeigen. Die hierzu benötigte Direktive lautet DISPLAY
, gefolgt von einem Leerzeichen und dem Namen der Textdatei. Ebenfalls lassen sich, wie von diversen Linux Installations-CDs (z.B. Debian) bekannt, auch die Funktionstasten belegen. Hierzu nutzt man den Namen der Funktionstaste als Direktive, sprich F1
bis F10
, ebenfalls gefolgt von einem Leerzeichen und einem Dateinamen.
Wenn man es etwas komfortabler haben möchte, kann man mit Hilfe von menu.c32 auch ein einfaches Menü erstellen. Hier jedoch zuvor die Datei /usr/lib/syslinux/menu.c32 in das Rootverzeichnis des TFTP-Servers kopieren, in unserem Falle: /var/lib/tftpboot/.
Das ^
markiert in dem Menü den "HotKey" zur Anwahl der entsprechenden Zeile.
An dieser Stelle ist in der Beispielkonfiguration nur ein sehr einfaches Menü angelegt worden. Auf dieser Seite lassen sich die vielfältigen Einstellmöglichkeiten bezüglich des Menüs nachlesen.
DEFAULT menu.c32 ALLOWOPTIONS 0 PROMPT 0 TIMEOUT 0 MENU TITLE Server PXE Boot Menu LABEL ubuntu-904 MENU LABEL ^Ubuntu 9.04 Desktop Live KERNEL ubuntu-904/vmlinuz APPEND boot=casper ide=nodma netboot=nfs nfsroot=192.168.2.2:/nfsroot/ubuntu-904 fetch=tftp://192.168.2.2/ubuntu-904/filesystem.squashfs initrd=ubuntu-904/initrd.gz LABEL memtest MENU LABEL ^Memtest86+ v2.11 KERNEL memtest/mt86plus
Für die Variante mit vesamenu.c32 liegen noch keine praktischen Erfahrungen vor. Hierbei sollte es dann, wenn man alles richtig macht, in etwa so aussehen, wie wenn man eine beliebige LiveCD einlegt und sich dann mal das Bootmenü anschaut. Um es kurz zu sagen: das Vesamenü ist sehr mächtig, jedoch auch komplizierter.
Die folgenden Konfigurationsbeispiele sind für menu.c32
Menüs gedacht.
Um über PXE vom lokalen System zu booten gibt es die Anweisung "LOCALBOOT 0
". Hierfür sind die folgenden Zeilen in die Konfigurationsdatei einzufügen.
LABEL localhdd1 MENU LABEL Local ^HDD LOCALBOOT 0
Das Booten des lokalen Systems über PXE mag zwar auf den ersten Blick unsinnig erscheinen jedoch macht es Sinn wenn der Client nicht die Möglichkeit hat über einen Hotkey beim Aufstarten über die Netzwerkkarte zu booten und man sich das umstellen im BIOS ersparen will. Des Weiteren währe denkbar, dass man dem Benutzer nicht die Möglichkeit geben will in das Bios zu gelangen, bzw. die Bootreihenfolge zu ändern.
Memtest86+ ist ein Programm, mit dem man den Arbeitsspeicher eines PCs auf Fehler überprüfen kann. Es eignet sich hervorragend zum Testen der Einstellungen des DHCP- sowie des TFTP-Servers, da man keine grossen Kopieraktionen oder andere grossartige Manipulationen an den PXE-Einstellungen vornehmen muss. Des Weiteren ist dieses Programm auf vielen Linux-CDs wie auch auf der Ubuntu Desktop CD zu finden.
Zuerst erstellt man im Verzeichnis tftpboot das Unterverzeichnis memtest und kopiert anschliessend die Datei mt86plus von der Ubuntu CD dort hinein. Die Datei mt86plus ist auf der Ubuntu CD im Verzeichnis /install zu finden.
sudo mkdir /var/lib/tftpboot/memtest && sudo cp /path-to-ubuntu-cd/install/mt86plus /var/lib/tftpboot/memtest/
Anschliessend noch in der default Konfigurationsdatei unter /var/lib/tftpboot/pxelinux.cfg/ folgende Zeilen anzufügen und dann kann es auch schon mit dem ersten PXE-Boot losgehen.
LABEL memtest MENU LABEL ^Memtest86+ v2.11 KERNEL memtest/mt86plus
Für Ubuntu NetInstall wird auf den Artikel PXE-Installation verwiesen, da an dieser Stelle schon eine gute Anleitung speziell für diesen Fall vorhanden ist.
Dieser Abschnitt der Anleitung ist der Seite Ubuntu.com entnommen und lediglich weitestgehend ins Deutsche übersetzt.
Es gibt diverse Möglichkeiten, eine komplette Ubuntuinstallation über das Netzwerk zu booten:
debootstrap (um direkt eine Installation über das Netzwerk aufzusetzen)
die Installation des Servers kopieren
[K/X]Ubuntu auf dem Client von CD installieren. Nachdem Alles installiert ist und läuft, das Netzlaufwerk /nfsroot mounten und das komplette System dort hin kopieren.
Wir werden an dieser Stelle auf Letzteres näher eingehen.
Die Installation kann selbsverständlich auch auf einem USB-Stick erfolgen, um das ursprüngliche System nicht zu beeinflussen oder zu beschädigen. Diese Installation muss aber dann mit der Alternate CD erfolgen, da es sonst nicht möglich ist festzulegen, wo der Bootloader installiert werden soll.
Die hier aufgeführten Befehle sind auf den Client-Rechner mit dem bereits installierten und funktionsfähigem System auszuführen, es sei denn, es ist explizit etwas Anderes erwähnt. Auf dem Client muss zusätzlich noch das Paket nfs-common installiert werden [1], damit später der Client seine Daten über das Netzwerk beziehen kann.
Zuerst findet man mit uname heraus, welcher Kernel aktiv ist. Die dazugehörige initrd.img... wird dann in das /home-Verzeichnis kopiert:
ls -ltr /boot/initrd*
-rw-r--r-- 1 root root 3,4M 2009-04-17 05:41 /boot/initrd.img-2.6.28-11-generic -rw-r--r-- 1 root root 3,4M 2009-06-02 11:41 /boot/initrd.img-2.6.28-13-generic
sudo cp /boot/initrd.img-2.6.28-13-generic /home/<USERNAME>
Jetzt muss eine neue initrd.img-Datei erstellt werden. Dafür muss das Bootflag in der Datei initramfs.conf von local
nach nfs
geändert werden. Die Konfigurationsdatei befindet sich im Verzeichnis /etc/initramfs-tools/.
# # BOOT: [ local | nfs ] # # local - Boot off of local media (harddrive, USB stick). # # nfs - Boot using an NFS drive as the root of the drive. # BOOT=nfs
Mit dem untenstehenden Befehl wird dann die neue initrd.img erzeugt:
mkinitramfs -o /home/<USERNAME>/initrd.img-2.6.28-13-generic
Nun wird das /nfsroot Verzeichnis vom Server gemountet und das komplette System auf den Server kopiert:
mount -tnfs -onolock 192.168.2.2:/nfsroot /mnt cp -ax /. /mnt/ubuntu-diskless/. cp -ax /dev/. /mnt/ubuntu-diskless/dev/.
Jetzt muss der Kernel und die initrd.img... in das Rootverzeichnis des tftp-Servers kopiert werden.
Die folgenden Befehle sind auf dem Server mit Root-Rechten auszuführen!
mkdir /tftpboot/ubuntu-diskless cp /nfsroot/ubuntu-diskless/home/<USERNAME>/vmlinuz-2.6.28-13-generic /var/lib/tftpboot/ubuntu-diskless/ cp /nfsroot/ubuntu-diskless/home/<USERNAME>/initrd.img-2.6.28-13-generic /var/lib/tftpboot/ubuntu-diskless/
Wenn ein Computer per PXE ein System bootet, hat er bereits eine Adresse über den DHCP-Server bezogen. Da wäre es fatal, wenn während des Bootvorgangs die Netzwerkkarte vom Betriebssystem neu konfiguriert werden würde. Aus diesem Grund muss die Datei /nfsroot/ubuntu-diskless/etc/network/interfaces dahingehend modifiziert werden, dass die Neukonfiguration verhindert wird. Dafür muss die Netzwerkkarte auf manual
und nicht auf dhcp
oder auto
konfiguriert werden.
# The loopback network interface auto lo iface lo inet loopback # The primary network interface, commented out for NFS root #auto eth0 #iface eth0 inet dhcp iface eth0 inet manual
Die Datei /nfsroot/ubuntu-diskless/etc/fstab beinhaltet, wo welches Laufwerk / Partition beim Systemstart gemountet werden soll. Die fstab sollte in etwa wie die unteren Beispiele aussehen, je nachdem, ob schon tmpfs Dateisysteme eingebunden sind oder nicht.
Zu beachten ist, dass es keine swap-Partition gibt!
# <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/nfs / nfs defaults 1 1
# /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/nfs / nfs defaults 1 1 none /tmp tmpfs defaults 0 0 none /var/run tmpfs defaults 0 0 none /var/lock tmpfs defaults 0 0 none /var/tmp tmpfs defaults 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
Die dazugehörige Konfiguration in der /var/lib/tftpboot/pxelinux.cfg/default sieht dann wie folgt aus:
LABEL ubuntu-904-diskless MENU LABEL Ubuntu 9.04 ^Diskless gup159xp KERNEL ubuntu-diskless/vmlinuz-2.6.28-13-generic APPEND netboot=nfs nfsroot=192.168.2.2:/nfsroot/ubuntu-diskless rw initrd=ubuntu-diskless/initrd.img-2.6.28-13-generic
Nach erfolgter Erstellung der Konfiguration kann das Bootmedium am Client entfernt werden und dieser dann über PXE das System Booten. Es ist darauf zu achten, dass nur der Client, auf dem das System installiert war, auch das System bootet. Hierfür eignet sich eine spezielle Konfigurationsdatei, die anhand der IP- oder der MAC-Adresse nur von diesem Client geladen werden kann (Siehe Abschnitt "Die Konfigurationsdateien.
Folgende Schritte sind der Reihe nach auszuführen, um Clonezilla über PXE booten zu können.
Zuerst muss das Clonezilla Live zip-File
besorgt werden. Dabei ist darauf zu achten, dass es sich um die Version 1.2.0-25 oder neuer handelt (je neuer desto besser):
Für das Klonen/Wiederherstellen von Ubuntu 9.10 sollte Clonezilla Live 1.2.3-24 oder neuer verwendet werden, da ab dieser Version die Wiederherstellung des Bootloaders GRUB2 unterstützt wird.
In neueren Versionen von Clonezilla wurden die Dateien vmlinuz1
und initrd1.img
umbenannt in vmlinuz
und initrd.img
. Die unten genannten Pfade sind daher je nach Version ggf. anzupassen.
wget http://surfnet.dl.sourceforge.net/sourceforge/clonezilla/clonezilla-live-1.2.2-14.zip
Nun wird die Datei nach /nfsroot/clonzilla/ entpackt:
sudo unzip /path-to-file/clonezilla-live-1.2.2-14.zip -d /nfsroot/clonezilla/
Jetzt werden die Dateien, welche über den tftp-Server geladen werden sollen, in das tftp-Verzeichnis kopiert:
sudo cp /nfsroot/clonezilla/live/filesystem.squashfs /var/lib/tftpboot/clonezilla/ sudo cp /nfsroot/clonezilla/live/vmlinuz1 /var/lib/tftpboot/clonezilla/ sudo cp /nfsroot/clonezilla/live/initrd1.img /var/lib/tftpboot/clonezilla/
Zusätzlich zu der Anleitung auf Clonzilla.org muss man in die APPEND-Zeile noch den nfsroot-Parameter angefügt. Ohne diesen Parameter blieb das System beim Aufstarten von Clonezilla an der Stelle "Begin tying nfsmount ...." stehen und gibt als Fehler aus: "Unable to find a live file system on the network".
LABEL clonezilla MENU LABEL ^Clonezilla Live 1.2.2-14 KERNEL clonezilla/vmlinuz1 APPEND initrd=clonezilla/initrd1.img boot=live union=aufs noswap noprompt vga=788 fetch=tftp://192.168.2.2/clonezilla/filesystem.squashfs nfsroot=192.168.2.2:/nfsroot/clonezilla
Der fetch
-Parameter unterstützt nicht nur tftp
, sondern auch ftp
und http
. Wenn man ftp oder http verwenden möchte, dann muss tftp nach dem fetch-Parameter durch ftp oder http ersetzt werden und die Datei filesystem.squashfs in das entsprechende Verzeichnis des ftp- oder http-Servers kopiert werden.
In der APPEND-Zeile können Clonezilla noch weitere Parameter zum Booten übergeben werden. Beispielsweise
ocs_live_keymap=NONE ocs_lang=en_US.UTF-8
, was dazu führt, dass automatisch das Standard-Tastaturlayout und Englisch als Sprache ausgewählt wird.
Mit dem Einfügen von ocs_live_keymap="/usr/share/keymaps/i386/qwertz/de-latin1-nodeadkeys.kmap.gz"
in die APPEND-Zeile wird das Deutsche Tastaturlayout gewählt.
Am Client an sich muss eigentlich so gut wie nichts eingerichtet werden. Es muss lediglich im BIOS eingestellt werden, dass man per PXE booten möchte. Hierzu muss u.U. das BootRAM der Netzwerkkarte zuerst aktiviert werden, bevor man die Option "Network" als (erstes) Bootmedium wählen kann.
Viele Systeme besitzen eine weitere Taste, die nicht ins BIOS, sondern in ein Auswahlmenü für das Bootmedium führt. Bei dieser Variante wird nur für den jeweiligen Bootvorgang von dem entsprechenden Medium gebootet. Bei einem aktuellen Dell Notebook ist die Bootmenütaste F12 , bei HP F9 , bei ASUS F8 und bei IBM Thinkpads ebenfalls F12 .
Wikipedia:
PXE Netzwerk-Boot mit Ubuntu Client & Debian Server - deutsche Anleitung von Lars Schenk, 09/2006
SYSLinux / PXELinux:
Memtest:
CloneZilla: