PXE-Boot-Server

Dieser Artikel wurde aus meinem alten Blog importiert, ist also unter umständen schon etwas veraltet!

Allgemeines zum HowTo

Ich versuche meine HowTos immer so knapp wie möglich zu halten, so bleiben die Artikel schön kurz und übersichtlich. Einfache Grundlegende Dinge setze ich voraus gebe aber Quellen, Artikel und Bücher an wo man das fehlende Wissen und KnowHow einfach nachlernen kann um auch Einsteigern zu ermöglichen etwas rein zu schnuppern.

Anforderungen und Einleitung

In einer Firma werden verschiedene Workstations eingesetzt. Von Abteilung zu Abteilung ist das Image individuell. Um im Problemfall den Rechner einfach wieder herstellen zu können wird ein Server installiert von dem bei Bedarf (BIOS-PW notwendig) das System wiederhergestellt werden kann. Das ganze wird mit einem PXE-Boot realisiert!

PXE-Testaufbau\

Natürlich wird so was nicht einfach auf das produktive Netzwerk los gelassen, sondern erstmal in einem LAN getestet. Der PXE-Server hgt mit einem Interface im im Test-LAN, mit dem 2ten Interface im Haus-LAN (VLAN der IT-Abteilung). Das zusätzliche Interface ist nur dazu da um bequem von meinem Arbeitsplatz alles testen zu können, in der produktiven Umgebung ist der PXE Server nur an einem Interface angebunden. Bei bedarf wird das Routing auf dem PXE-Server aktiviert, um das Haus-LAN erreichen zu können.

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE

Ob und wie man den Aufbau eines PXE Servers bei sich testet ist jedem selbst überlassen. Wenn man im Produktiven LAN das ganze umsetzt und ein paar Workstations dann per default mit PXE booten und so die MItarbeiter nervt ist nicht angenehm. In einem kleinen Unternehmen ist das vielleicht gerade noch vertretbar aber bei einigen 100 Workstations sollte man erst ausgiebig testen und dann erst alles im Produktiven LAN umsetzen.

Vorhanden ist:

  • Netzwerk mit allen Clients in einem VLAN.
  • Ein DHCP-Server
  • komplette AD-Domäne …
  • viele Baugleiche HP-Workstations

Benötigt für PXE-Boot wird:

  • DHCP Server
  • TFTP-Server
  • NFS-Server

Es wird vom Server einfach gebootet und ein vorkonfiguriertes Clonezilla führt den Restore des entsprechenden Images aus.

Als Betriebssystem kommt Debian zum Einsatz (Im Prinzip funktioniert das alles auch mit jeder anderen Distribution oder Windows). Auf die Debian Installation gehen ich nicht weiter ein. Neulinge sollten sich das Debian GNU/Linux Anwenderhandbuch durchlesen. Installiert wird nur Debian und nur das Standardsystem (kein Desktopumgebung oder sonstiges)

Auf einem Server sollte man die /home /tmp /usr /var /boot -Verzeichnisse auf separate Partitionen legen.

root@clonezilla /home/partimag # df -h
Dateisystem          Größe Benut  Verf Ben% Eingehängt auf
/dev/cciss/c0d0p1     327M  120M  191M  39% /
tmpfs                 2,0G     0  2,0G   0% /lib/init/rw
udev                   10M  800K  9,3M   8% /dev
tmpfs                 2,0G     0  2,0G   0% /dev/shm
/dev/cciss/c0d0p9     116G   23G   88G  21% /home
/dev/cciss/c0d0p8     373M   11M  343M   3% /tmp
/dev/cciss/c0d0p5     4,6G  414M  4,0G  10% /usr
/dev/cciss/c0d0p6     2,8G  212M  2,5G   8% /var
</p>
<p>Welcher Hardware man verwendet ist jedem selbst überlassen. Ein RAID Verbund ist einem Unternehmen auf jedem Fall zu empfehlen.</p>
<p>Als Hardware verwende ich einen "alten" HP ProLiant DL360 G5 mit 4 GB RAM und Intel Xeon 5140, eigentlich vollkommen überdimensioniert aber der steht ungenutzt herum. Zur Zeit mit 2x146GB 10k SAS Platten als RAID1. Später mit 4x146GB 10k SAS als RAID5. Ein alter PC mit 1GB RAM würde aber auch locker reichen.</p>

<h3>Grundlegende Dienste Installieren</h3>
<p>Der Server läuft und das Netzwerk ist eingerichtet, alles ist "up to date", es kann also los gehen. Installiert wird ein SSH Server, und ein paar persönliche Anpassungen werden gemacht (ich verwende die zsh gerne).</p>
<p>apt-get install openssh-server

Wenn man möchte kann die ZSH auch probieren.

apt-get install zsh
wget -O ~/.zshrc http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc
chsh -s /bin/zsh</p>

<h3>Installieren und konfigurieren der benötigten Dienste</h3>

<p>root@pxe-server ~ # apt-get install tftpd-hpa nfs-kernel-server syslinux

Ein DHCP Server ist in meinem Fall nicht notwendig da bereits einer Vorhanden ist der dementsprechend konfiguriert werden kann. Ist ein solcher Server auch notwendig kann der mit dem Paket dhcp3-server installiert werden.

Konfiguration TFTP-Server

Der TFTP-Server soll als Deamon laufen das muss in der /etc/defaults/tftpd-hpa geändert werden! Als Std wird der Dienst vom inet.d gestartet. Zusätzlich wird das Root-Verzeichnis des TFTP-Server auf /home/tftpboot verlegt, weil dort mehr Platz zu Verfügung steht

#Defaults for tftpd-hpa
RUN_DAEMON="yes"
OPTIONS="-l -s /home/tftpboot"

Natürlich müssen die Rechner auch was zum Booten am TFTP-Server haben. Ich verwende dafür PXELINUX (ist im syslinux Paket enthalten)

root@pxe-server ~ # mkdir /home/tftpboot

root@pxe-server ~ # cp /usr/lib/syslinux/pxelinux.0 /home/tftpboot

Um Menüs zu erzeugen benötigt man noch menu.c32

root@pxe-server ~ # cp /usr/lib/syslinux/menu.c32 /home/tftpboot

Zum testen ob die Rechner auch booten brauchen wir natürlich ein Image das die Rechner dann booten sollen (normalerweise den Kernel). Zum testen nehmen wir da einfach memtest. memtest findet man auf vielen LinuxDistriCDs oder auf www.memtest.org.

root@pxe-server ~ # wget http://www.memtest.org/download/4.00/memtest86+-4.00.bin.gz

root@pxe-server ~ # gunzip memtest86+-4.00.bin.gz

root@pxe-server ~ # mkdir /home/tftpboot/memtest

root@pxe-server ~ # mv memtest86+-4.00.bin /home/tftpboot/memtest/memtest

Das root-Verzeichis des TFTP Servers sollte nun so aussehen:

root@pxe-server /home/tftpboot # tree
.
|-- memtest
|&nbsp;&nbsp;&nbsp;`-- memtest
|-- menu.c32
`-- pxelinux.0

Gut, alle Files wären dort wo sie hin gehören, nun muss PXELINUX auch konfiguriert werden. Also wird ein Konfigurationsverzeichnis und ein Konfigurationsfile erstellt.

Vorläufig wird nur ein default Konfigurationsfile erstellt. Später kommen für die einzelnen Rechner-IP-Ranges extra Konfigfiles hinzu.
Zum Beispiel jeder EDV Saal einer Schule hat eine eigene IP-Bereich, es gibt Säle für CAD Konstruktionen, zum Programmieren, PC als Oszilloskope im Labor … der Bootserver soll aufgrund der IP Range entscheiden welches Image auf den PC gehört. Zu dieser genaueren Konfiguration komme ich noch später. Jetzt soll ein einfacher memtest zum testen reichen.

root@pxe-server ~ # mkdir /home/tftpboot/pxelinux.cfg

root@pxe-server ~ # nano /home/tftpboot/pxelinux.cfg/default
default menu.c32
prompt 0
timeout 600
menu title -= Card Complete - Workstation restore =-
<br />label memtest
&emsp;menu label memtest
&emsp;kernel memtest/memtest

Nun finden die Rechner auch die Konfigurationsfiles um richtig zu booten. Jetzt fehlt nur noch der DHCP Server um den ersten einfachen Test durch zu führen

root@PXE-Server /var/lib/tftpboot # tree
.
|-- memtest
|&nbsp;&nbsp;&nbsp;`-- memtest
|-- menu.c32
|-- pxelinux.0
`-- pxelinux.cfg
&nbsp;&nbsp;&nbsp;&nbsp;`-- default

Konfiguration DHCP-Server

Der DHCP Server läuft bei mir auf einer getrennten Maschine (weil es in der Produktiven Umgebung genau so ist). Hat man einen DHCP-Server den man verwenden kann muss man den entsprechend konfigurieren, kann man seinen DHCP-Server nicht so genau konfigurieren, wie daß bei den meisten SOHO-Routern der Fall ist. Deaktiviert man einfach den DHCP am Router und lässt den DHCP-Server auch auf einem Server im LAN laufen. Wird ein DHCP Server benötigt installiert man den einfach mit

root@dhcp-server ~ # apt-get install dhcp3-server

Damit ist der DHCP-Server installiert und muss nur noch konfiguriert werden. Als erstes legen wir fest auf welches Interface der DHCP-Server lauschen soll. Das wird in der /etc/default/dhcp3-server festgelegt.

root@dhcp-server ~ # nano /etc/default/dhcp3-server</kpd>

# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/dhcp3-server by the maintainer scripts
<br />#
# This is a POSIX shell fragment
#
<br /># On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1"
INTERFACES="eth0"

Ist festgelegt auf welches Interface der DHCP Server lauschen soll, kann man ihn schon konfigurieren. Der dhcp3-server wird mit der /etc/dhcp/dhcpd.conf konfiguriert. Das Beispiel file ist recht gut Dokumentiert, mit Beispielen und Erklärungen, die wichtigen Einträge für den PXE-Boot habe ich hervorgehoben.

root@dhcp-server ~ # cat /etc/dhcp3/dhcpd.conf
#
# Sample configuration file for ISC dhcpd for Debian
#
# $Id: dhcpd.conf,v 1.1.1.1 2002/05/21 00:07:44 peloy Exp $
#
<br />ddns-update-style none;
<br />option domain-name "visa-ad.at";
option domain-name-servers 10.10.10.10, 10.10.10.20;
<br />default-lease-time 600;
max-lease-time 7200;
<br />authoritative;
<strong><br />allow booting;
allow bootp;</strong>
<br />log-facility local7;
<br />#Definition des ersten Subnets
subnet 172.16.26.0 netmask 255.255.255.0 {
        range 172.16.26.128 172.16.26.254;
        #Lease-Zeit in Sekunden
        default-lease-time 600;
        max-lease-time 7200;
        option domain-name "visa-ad.at";
        option domain-name-servers 172.16.26.1;
        option broadcast-address 172.16.26.255;
        option subnet-mask 255.255.255.0;
        #Gateway
        option routers 172.16.26.1;
<strong>	#TFTP-Server - PXE
	next-server 172.16.26.1;
	filename "/pxelinux.0";</strong>
}

Hat man DHCP-Server konfiguriert kann man nach einem restart des DHCP-Servers schon mal testen ob memtest auf den Clients startet.

root@dhcp-server /home/flo # /etc/init.d/dhcp3-server restart
Stopping DHCP server: dhcpd3.
Starting DHCP server: dhcpd3.

Bis jetzt wurde also

  • der DHCP-Server installiert und konfiguriert
  • der tftp-Server installiert und konfiguriert
  • PXE-Linux auf den TFTP-Server kopiert und konfiguriert
  • memtest zum testen auf den TFTP gestellt

Gut damit lassen sich einfache Programme (memtest …) bereits booten und man kann einen ersten Test wagen.

Memtest benötigt ja nur einen kleinen Kernel sonst nichts nur was wenn ein initrd-Image geladen werden soll? Was wenn auch noch andere Betriebssysteme geladen werden sollen?

NFS-Server

Der NFS ist eine der möglichkeiten um Files nach zu laden, auch die Images der Workstations werden auf den NFS-Share gelegt. Ein NFS-Server sollte daher auf unserem PXE-Server nicht fehlen. Installiert wurde der NFS-Server schon zu beginn des HowTos mit dem Paket nfs-kernel-server, es muss also nur noch festgelegt werden was freigeben wird, das geschieht in der Datei /etc/exports

root@pxe-server ~ # nano /etc/exports
root@pxe-server ~ # cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#		to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/home/nfsroot 172.16.26.0/255.255.255.0(rw,no_root_squash,async)
/home/partimag 172.16.26.0/255.255.255.0(rw,no_root_squash,async)

root@pxe-server ~ # chown nobody.nogroup /home/nfsroot
root@pxe-server ~ # exportfs -rv 

Clonezilla Installation

Erst mal wird die aktuelle Version von Clonezilla heruntergeladen und entpackt (wenn eine aktuellere Version als 1.2.2-31 verfügbar ist bitte diese verwenden)

wget http://surfnet.dl.sourceforge.net/sourceforge/clonezilla/clonezilla-live-1.2.2-31.zip
unzip /path-to-file/clonezilla-live-1.2.2-14.zip -d /home/nfsroot/clonezilla/
cp /home/nfsroot/clonezilla/live/filesystem.squashfs /home/tftpboot/clonezilla/
cp /home/nfsroot/clonezilla/live/vmlinuz1 /home/tftpboot/clonezilla/
cp /home/nfsroot/clonezilla/live/initrd1.img /home/tftpboot/clonezilla/

Ist das erledigt muss noch die PXELINUX-Konfiguration angepasst werden

root@pxe-server ~ # nano /home/tftpboot/pxelinux.cfg/default
root@pxe-server ~ # cat /home/tftpboot/pxelinux.cfg/default
default menu.c32
prompt 0
timeout 600
menu title -= CardComplete Workstationrestore =-

label memtest
	menu label 	^memtest
	kernel 		memtest/memtest

label clonezilla
	menu label 	^Clonezilla Live 1.2.2-31
	kernel		clonezilla/vmlinuz1
	append		initrd=clonezilla/initrd1.img boot=live nolocales noprompt ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang="" vga=791 ip=frommedia fetch=tftp://172.16.26.1/clonezilla/filesystem.squashfs nfsroot=172.16.26.1:/home/nfsroot/clonezilla

Bitte drarauf achten das die korrekte IP (vom TFTP) angegeben ist. Das wars eigentlich schon Clonezilla kann jetzt übers Netzwerkgestartet werden.

Genauere Informationen wie man die PXELINUX-Konfigurationsdateien verfasst, findet man auf der Projektseite von SYSLINUX. Die Konfiguration von SYSLINUX, ISOLINUX, EXTLINUX und PXELINUX funktioniert bei allen gleich. Man kann also Problemlos die isolinux.cfg einer Bestehenden Distribution übernehmen und für den PXE-Boot etwas anpassen.

Clonezilla anpassen

Die Images der Workstations liegen immer am gleichen Ort. Daher kann Clonezilla Problemlos so angepasst werden das automatisch das richtige Verzeichnis mit den Images gemountet wird und man nur das Image auswählen muss das man verwenden möchte. Das hört sich erst mal kompliziert an ist aber recht einfach. Clonezilla besteht eigentlich aus vielen einzelenen Programmen die von Shellskripts aufgerufen werden. Die einzelenen Shellskripte die Clonezilla verwendet werden von einem allgemeinen Shellskript gestartet. Das Skript ocs-live-general, das normalerweise beim start von Clonezilla aufgerufen wird. Dieses Skript kann aber einfach durch ein eigenes Skript ersetzt werden und beim booten dem Kernel übergeben werden ocs_live_run=“/tmp/custom-ocs“. Also müssen wir ein eigenes Skript verfassen und das statt dem Standard Shellskript starten.

Als Vorlage kopiert man sich am besten den bestehenden Eintrag von Clonezilla aus der pxelinux.cfg/default und passt ihn an.

default menu.c32
prompt 0
timeout 600
menu title -= CardComplete Workstationrestore =-
<br />label clonezilla-custom1
	menu label 	^restore Workstation
	menu default
	kernel		clonezilla/vmlinuz1
	append		initrd=clonezilla/initrd1.img boot=live nolocales noprompt <strong>ocs_prerun="busybox tftp -g -b 10240 -r clonezilla-custom/custom-ocs -l /tmp/custom-ocs 172.16.26.1"</strong> ocs_live_run="<strong>bash /tmp/custom-ocs</strong>" ocs_live_extra_param="" ocs_live_keymap="<strong>/usr/share/keymaps/i386/qwertz/de-latin1.kmap.gz</strong>" ocs_live_batch="no" ocs_lang="<strong>en_US.UTF-8</strong>" vga=791 ip=frommedia fetch=tftp://172.16.26.1/clonezilla/filesystem.squashfs nfsroot=172.16.26.1:/home/nfsroot/clonezilla-custom
<br />label clonezilla
	menu label 	^Clonezilla Live 1.2.2-31
	kernel		clonezilla/vmlinuz1
	append		initrd=clonezilla/initrd1.img boot=live nolocales noprompt ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang="" vga=791 ip=frommedia fetch=tftp://172.16.26.1/clonezilla/filesystem.squashfs nfsroot=172.16.26.1:/home/nfsroot/clonezilla
<br />label memtest
	menu label 	^memtest
	kernel 		memtest/memtest

Zum Verständnis erkläre isch die Änderungen etwas

  • ocs_prerun=“busybox tftp -g -b 10240 -r clonezilla-custom/custom-ocs -l /tmp/custom-ocs 172.16.26.1″
    Bevor das custom-ocs-Skrip gestartet werden kann muss es ja irgendwo her kommen. Im filesystem.squashfs ist es ja nicht enthalten und immer ein neues squashfs-Image zu bauen ist recht mühsam. Also legt man das Shellskript auf den TFTP-Server und kopiert sich das beim booten von Clonezilla auf das live-System
  • ocs_live_run=“bash /tmp/custom-ocs“
    Natürlich muss auch angeben werden welches Skript gestartet werden soll
  • ocs_live_keymap=“/usr/share/keymaps/i386/qwertz/de-latin1.kmap.gz“
    Das auswählen des Tastaturlayouts möchte man sich ja auch sparen
  • ocs_lang=“en_US.UTF-8″
    Die Wahl der Sprache geschieht auch automatisch

Das custom-ocs erstellen

#!/bin/bash
# Author: Steven Shiau
# License: GPL
#
# In this example, it will allow your user to use clonezilla live to choose
# (1) A samba server as clonezilla home image where images exist.
# (2) Choose an image to restore to disk.
<br /># When this script is ready, you can run
# /opt/drbl/sbin/ocs-iso -g en_US.UTF-8 -k NONE -s -m ./custom-ocs-1
# to create the iso file for CD/DVD. or
# /opt/drbl/sbin/ocs-live-dev -g en_US.UTF-8 -k NONE -s -c -m ./custom-ocs-1
# to create the zip file for USB flash drive.
<br /># Begin of the scripts:
# Load DRBL setting and functions
DRBL_SCRIPT_PATH="${DRBL_SCRIPT_PATH:-/opt/drbl/}"
<br />. $DRBL_SCRIPT_PATH/sbin/drbl-conf-functions
. $DRBL_SCRIPT_PATH/conf/drbl-ocs.conf
. $DRBL_SCRIPT_PATH/sbin/ocs-functions
<br /># load the setting for clonezilla live.
[ -e /etc/ocs/ocs-live.conf ] && . /etc/ocs/ocs-live.conf
# Load language files. For English, use "en_US.UTF-8". For Traditional Chinese, use "zh_TW.UTF-8"
ask_and_load_lang_set en_US.UTF-8
<br /># The above is almost necessary, it is recommended to include them in your own custom-ocs.
# From here, you can write your own scripts.
<br /># 1. Configure network
dhclient
<br /># 2. Mount the clonezilla image home. Available types:
# local_dev, ssh_server, samba_server, nfs_server
# prep-ocsroot -t samba_server
mount -t nfs 172.16.26.1:/home/partimag /home/partimag
<br /># 3. Restore the image
if mountpoint $ocsroot &>/dev/null; then
  ocs-sr -g auto -e1 auto -e2 -c -r -j2 -p choose restoredisk "ask_user" "ask_user"
else
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo "Fail to find the Clonezilla image home $ocsroot!"
  echo "Program terminated!"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
fi
<br />#
umount $ocsroot &>/dev/null

Jetzt kann jeder Client im LAN einfach mit PXE gebootet werden und o einfach wiederhergestellt werden. Wenn man Windows Clients verwendet sollte man sich noch überlegen wie man verhindert das Rechner mit dem gleichen Rechnernamen und der gleichen SID im LAN vorhanden sind. Eine einfache und effektive Lösung ist, am Image für die WorkstationsDRBL-Winroll zu installieren. Wichtig bei DRBL-winroll ist das die Workstations nicht in der Domäne hengen, wenn das Image erstellt wird.

Images erstellen

Images kann man über ein ähnliches Skript automatisiert erstellen. Allerdings hängt mein Server zusätzlich in einer ActiveDirectory Domain um auf den Server schreibend zugreifen zu können muss sich ein Domain-Administrator am Server authentifizieren (Samba Server). Erst dann kann ein Image erstellt werden. Das Skript und die genaue Konfiguration des Servers (Samba, winbind, PAM …) würde in einem kleinem Buch ausarten.

About Florian