Inhaltsverzeichnis

PXE-Server unter CentOS 6.x einrichten

Im folgenden Kapitel befassen wir uns eingehender mit der Konfiguration unseres PXE-Bootservers.

Grund-Konfiguration

Order und Dateien anlegen

Mit Unterstützung des TFTP-Servers und dem xinet-daemon muss dem anfragendem Client-System ein minimales Betriebssystem mit einem Auswahlmenü über das Netzwerk zur Verfügung gestellt werden. Diese Minimalanforderung werden wir mun im ersten Schritt umsetzen. Hierzu kopieren wir aus dem Verzeichnis /usr/share/syslinux/ nachfolgende Dateien in das Zielverzeichnis /var/lib/tftpboot/:

 # cp -a /usr/share/syslinux/{chain.c32,mboot.c32,memdisk,menu.c32,pxelinux.0,vesamenu.c32} /var/lib/tftpboot

Als nächstes erstellen wir uns noch einen Odrner, in dem die Bootmenüs abgelegt werden, die später beim PXE-Boot dem Client präsentiert werden sollen.

 # mkdir /var/lib/tftpboot/pxelinux.cfg

Im Anschluss daran legen wir uns noch die Verzeichnisse für die Image-Dateien, die beim Bootvorgang benötigt werden, an. Bei unserer Installation wollen wir für folgende CentOS-Versionen und Architekturen später jeweils einen entsprechenden Eintrag im Bootmenü vorhalten.

  1. # mkdir /var/lib/tftpboot/images/centos/5.7/i386 -p 
  2. # mkdir /var/lib/tftpboot/images/centos/6.0/i386 -p 
  3. # mkdir /var/lib/tftpboot/images/centos/6.0/x86_64 -p 

Als abschließenden Punkt werden wir nun in die gerade angelegten und entsprechenden Verzeichnisse jeweils das zugehörige initrd.img und vmlinuz aus dem Repository laden.

  1. # cd /var/lib/tftpboot/images/centos/5.7/i386 
    # wget http://repository.nausch.org/centos/5.7/os/i386/images/pxeboot/initrd.img 
    # wget http://repository.nausch.org/centos/5.7/os/i386/images/pxeboot/vmlinuz 
  2. # cd /var/lib/tftpboot/images/centos/6.0/i386/ 
    # wget http://repository.nausch.org/centos/6.0/os/i386/images/pxeboot/initrd.img 
    # wget http://repository.nausch.org/centos/6.0/os/i386/images/pxeboot/vmlinuz 
  3. # cd /var/lib/tftpboot/images/centos/6.0/x86_64/ 
    # wget http://repository.nausch.org/centos/6.0/os/x86_64/images/pxeboot/initrd.img 
    # wget http://repository.nausch.org/centos/6.0/os/x86_64i386/images/pxeboot/vmlinuz 

einfaches Bootmenü erstellen

Für die Auswahl der unterschiedlichen Systeme, die wir später installieren wollen, benötigen wir noch ein passendes Bootmenü. Dieses Menü wird mit Hilfe der Datei /var/lib/tftpboot/pxelinux.cfg/default bereitgestellt. Wir legen uns also für eine erste „spartanische Variante“ nachfolgende Datei an.

 # vim /var/lib/tftpboot/pxelinux.cfg/default
/var/lib/tftpboot/pxelinux.cfg/default
# Django 2011-11-24
# erstes einfaches Bootmenü für PXE-Boot
 
# Einbinden des User-Interface-Module menu.c32
default menu.c32
# starten des Standardeintrages nach 10 Sekunden
timeout 100
# [0] Boot-Prompt ausblenden [1] Boot-Prompt standardmäßig angezeigen
prompt 0
# [0] Öffnen des Boot mit ESC ermöglichen [1] Funktion deaktivieren.
noescape 0
 
# Definition der Überschrift unseres Bootmenüs
menu title *** PXE Boot-Auswahl Menue ***
# Definition einer Hintergrundgraphik für das Bootmenü (Größe: 640x480 Format: PNG) 
# menu background bootgraphik.png
 
# Definition der einzelnen Booteinträge:
# LABEL      : Eindeutige Bezeichnung eines Booteintrages
# MENU LABEL : Aussagekräftige Beschreibung des LABELs, welche im Mootmenü angezeigt werden soll 
# KERNEL     : Definition des zu bootenden Kernel Images
# APPEND     : Definition von Benutzerspezifischen Kerneloptionen
 
LABEL 1
   MENU LABEL ^1) Boot from ^HD (default)
     localboot 0
 
LABEL 2
   MENU LABEL ^2) Installation von CentOS 6.0 (64 Bit)
   KERNEL images/centos/6.0/x86_64/vmlinuz
   APPEND initrd=images/centos/6.0/x86_64/initrd.img ramdisk_size=128000 ip=dhcp method=http://10.0.0.50/centos/6.0/os/x64_86
 
LABEL 3
   MENU LABEL ^3) Installation von CentOS 6.0 (32 Bit)
   KERNEL images/centos/6.0/i386/vmlinuz
   APPEND initrd=images/centos/6.0/i386/initrd.img ramdisk_size=128000 ip=dhcp method=http://10.0.0.50/centos/6.0/os/i386
 
LABEL 4
   MENU LABEL ^4) Installation von CentOS 5.7 (32 Bit)
   KERNEL images/centos/5.7/i386/vmlinuz
   APPEND initrd=images/centos/5.7/i386/initrd.img ramdisk_size=128000 ip=dhcp method=http://10.0.0.50/centos/5.7/os/i386

DHCP-Server anpassen

Damit der TFTP-Server vom DHCP-Server im Netz bei den Clientanfragen veröffentlicht werden kann, müssen wir unseren bestehenden DHCP-Server noch entsprechend erweitern. Hierzu verwenden wir wie immer unseren Lieblingseditor vim.

 # vim /etc/dhcp/dhcpd.conf

Folgende Zeilen tragen wir nach:

        # Django : 2011-11-22 bootflag für PXE-Boot setzen
        allow booting;
        # Django : 2011-11-22 bootp-flag setzen für Antwortmöglichkeit auf bootp-Anfragen der Clients
        allow bootp;
        # Django : 2011-11-22 Adresse des TFTP-Servers für PXE-Boot setzen
        next-server 10.0.0.50;
        # Django : 2011-11-22 Dateinamen auf intitiale Boot-Datei setzen
        filename "pxelinux.0";

Somit ergibt sich eine vorläufige Gesamtkonfigurationsdatei unseres DHCP-Servers.

/etc/dhcp/dhcpd.conf
subnet 10.0.10.0 netmask 255.255.255.192 {
 
        option routers                  10.0.10.1;
        option subnet-mask              255.255.255.192;
 
        option domain-name              "nausch.org";
        option domain-search            "dmz.nausch.org", "intra.nausch.org";
        option domain-name-servers      10.0.10.1;
 
        # Django : 2011-11-22 bootflag für PXE-Boot setzen
        allow booting;
        # Django : 2011-11-22 bootp-flag setzen für Antwortmöglichkeit auf bootp-Anfragen der Clients
        allow bootp;
        # Django : 2011-11-22 Adresse des TFTP-Servers für PXE-Boot setzen
        next-server 10.0.0.50;
        # Django : 2011-11-22 Dateinamen auf intitiale Boot-Datei setzen
        filename "pxelinux.0";
 
        option time-offset              -18000; # Eastern Standard Time
        option ntp-servers              10.0.10.1;
 
        range dynamic-bootp 10.0.10.50 10.0.10.62;
        default-lease-time 21600;
        max-lease-time 43200;
 
        }
 
  host vml010006
  { hardware ethernet 52:54:00:ba:ba:ba;
    fixed-address 10.0.10.6;
  }

Zur Aktivierung unserer Konfigurationsänderungen starten wir unseren DHCP-Server nun einmal durch.

 # service dhcpd restart
 Shutting down dhcpd:                                       [  OK  ]
 Starting dhcpd:                                            [  OK  ]

Paketfilter anpassen

Damit unser PXE-Boot-Server die BootTP aus dem Netz be- und verarbeiten kann, werden wir nun den Paketfilter noch erweitern und anpassen.

Als erstes überprüfen wir unsere aktuelle iptables-Regeln.

 # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:tftp
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Die Konfigurationsdatei unseres Paketfilters passen wir nun wie folgt an.

 # vim /etc/sysconfig/iptables
/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# Django : 2011-11-16 htpp für Apache Webserver freigeschaltet
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
#
# Django : 2011-11-16 Freischalten des TFTP-servers
-A INPUT -m state --state NEW -m udp -p udp --dport 69 -j ACCEPT
#
# Django : 2011-11-22 BootTP Server und Client freigeschaltet
-A INPUT -m state --state NEW -m udp -p udp --dport 67 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 68 -j ACCEPT
#
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Anschließend starten wir den Paketfilter 1x durch.

 # service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
iptables: Loading additional modules: ip_conntrack_tftp ip_[  OK  ] 

Überprüfen wir anschließend unseren Paketfilter, werden unsere neuen Regeln entsprechend angezeigt.

 # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:tftp 
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:bootps 
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:bootpc 
LOG        all  --  anywhere             anywhere            LOG level warning 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Clienttest

Starten wir nun einen neuen vHOST dann wird uns ein entsprechends Bootmenü angezeigt.

Bildschirmhardcopy des Bootmenüs

Zur Versorgung unserer Maschinen reicht dies natürlich, die Optik ist natürlich nicht gerade umwerfend.

erweiterte Konfiguration

graphisches Bootmenü erstellen

Wie bei der Grundkonfiguration bereits angeschnitten, macht unser Bootmenü noch einen spartanischen nicht individualisierten Eindruck. Diesen „Mangel“ wollen nun abstellen.

Wir bearbeiten also wieder unsere Menüdatei /var/lib/tftpboot/pxelinux.cfg/default mit unserem Lieblingseditor vim.

 # vim /var/lib/tftpboot/pxelinux.cfg/default
/var/lib/tftpboot/pxelinux.cfg/default
# Django 2011-11-24
# erweitertes graphisches Menü für PXE-Boot
 
# Einbinden des User-Interface-Module vesamenu.c32
default vesamenu.c32
# starten des Standardeintrages nach 10 Sekunden
timeout 100 
# [0] Boot-Prompt ausblenden [1] Boot-Prompt standardmäßig angezeigen
prompt 0
# [0] Öffnen des Boot mit ESC ermöglichen [1] Funktion deaktivieren.
noescape 0
 
# Definition der Überschrift unseres Bootmenüs
menu title *** PXE Boot-Auswahl Menue ***
# Definition einer Hintergrundgraphik für das Bootmenü (Größe: 640x480 Format: PNG) 
menu background bootgraphik.png
 
menu color title 1;36;44        #0824b5 #00000000 std 
menu color sel *                #00000000 #0824b5 *
menu color hotsel 1;7;37;40     #00000000 #999999ff *
menu color unsel 1;36;44        #0824b5 #00000000 std
menu color hotkey 1;36;44       #0824b5 #00000000 std
menu color tabmsg 1;36;44       #ed7500 #00000000 std
menu color cmdline 1;36;44      #0824b5 #00000000 std
menu color timeout_msg 1;36;44  #0824b5 #00000000 std
menu color timeout 1;36;44      #0824b5 #00000000 std
 
# Definition der einzelnen Booteinträge:
# LABEL      : Eindeutige Bezeichnung eines Booteintrages
# MENU LABEL : Aussagekräftige Beschreibung des LABELs, welche im Mootmenü angezeigt werden soll 
# KERNEL     : Definition des zu bootenden Kernel Images
# APPEND     : Definition von Benutzerspezifischen Kerneloptionen
 
LABEL 1
   MENU LABEL ^1) Boot from ^HD (default)
     localboot 0
 
LABEL 2
   MENU LABEL ^2) Installation von CentOS 6.0 (64 Bit)
   KERNEL images/centos/6.0/x86_64/vmlinuz
   APPEND initrd=images/centos/6.0/x86_64/initrd.img ramdisk_size=128000 ip=dhcp method=http://10.0.0.50/centos/6.0/os/x64_86
 
LABEL 2
   MENU LABEL ^3) Installation von CentOS 6.0 (32 Bit)
   KERNEL images/centos/6.0/i386/vmlinuz
   APPEND initrd=images/centos/6.0/i386/initrd.img ramdisk_size=128000 ip=dhcp method=http://10.0.0.50/centos/6.0/os/i386
 
LABEL 2
   MENU LABEL ^4) Installation von CentOS 5.7 (32 Bit)
   KERNEL images/centos/5.7/i386/vmlinuz
   APPEND initrd=images/centos/5.7/i386/initrd.img ramdisk_size=128000 ip=dhcp method=http://10.0.0.50/centos/5.7/os/i386

Als Graphik verwenden wir eine passende selbstgemachte Graphik mit den Abmessungen 640 x 480 und speichern diese im Format PNG ab.

Clienttest

Starten wir nun erneut einen neuen vHOST, dann wird uns ein entsprechends Bootmenü angezeigt.

Bildschirmhardcopy des Bootmenüs

Im Vergleich zur reinen Textvariante sieht dies schon wesentlich ansprechender und für das Einsatzgebiet individueller aus.

automatische Installation

Einen weiteren Schritt zur Komfortablen und automatisierten Installation werden wir mit Hilfe einer Kickstartdatei vornehmen. Wie dies geht, ist im Kapitel PXE-Server unter CentOS 6.x optimieren (Kickstartfile) beschrieben.

Links