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/:
- chain.c32
- mboot.c32
- memdisk
- menu.c32
- pxelinux.0
- vesamenu.c32
# 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.
- CentOS 5.7 - i386
- CentOS 6.0 - i386
- CentOS 6.0 - x86_64
# mkdir /var/lib/tftpboot/images/centos/5.7/i386 -p
# mkdir /var/lib/tftpboot/images/centos/6.0/i386 -p
# 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.
# 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
# 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
# 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.
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.
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.