Mit der HIlfe von einigen Technologien wie TFTP, DHCP,Syslinux und NFS ist es möglich, einen Rechner übers Netzwerk zu booten. Dabei kann man entweder Installationsmedien einfach im Netzwerk bereitstellen oder Live-Systeme (etwa Rescue-Systeme, Memory-Tests oder einen Live-Desktop) starten. Als Basis benötigt man einen Client, der übers Netzwerk booten kann und einen DHCP-Server, der die benötigten Boot-Informationen (bspw. die Informationen über den TFTP-Server) bereitstellen kann. Letzteres wird immer dann zum Problem, wenn man einen Router verwendet, um die IP-Adressen zu verwalten.
Da ich eine Fritz.box verwende, um die IP-Adressen per DHCP zuzuweisen und auf der Box selbst keine Veränderungen vornehmen will, bediene ich mich dem Linux-Programm „dnsmasq“, um einen DHCP-Proxy aufzusetzen, der die Informationen dem DHCP-Protokoll beimischt. Die Software hat glücklicherweise auch einen eingebauten TFTP (trivial file transfer protocol)-Server, was das restliche Verfahren etwas vereinfacht.
Installation der Software
Der erste Schritt ist also die Installation und Konfiguration von dnsmasq. Das kann in CentOS einfach per yum erledigt werden:
yum install dnsmasq
Die Konfiguration von dnsmasq kann daraufhin in der Datei „/etc/dnsmasq.conf“ vorgenommen werden. Die wichtigsten Einstellungen dabei sind:
dhcp-range=192.168.0.0,proxy dhcp-boot=pxelinux.0,192.168.0.1,192.168.0.0 pxe-prompt="Press F8 for menu.", 5 pxe-service=x86PC, "Von Festplatte starten", 0 pxe-service=x86PC,"Vom Netzwerk booten",pxelinux enable-tftp tftp-root=/opt/tftproot log-dhcp conf-dir=/etc/dnsmasq.d port=0
Konfiguration
Wie man dann ein Betriebssystem so installiert, dass man es vom Netzwerk booten kann, ist je nach System ein klein wenig unterschiedlich. Viele gute Beispiele findet man in der Good To Know Database. Prinzipiell sieht der Bootvorgang aber so aus, dass der Client einen PXE-Server im Netzwerk findet, von diesem eine DHCP-Adresse bekommt und darüber dann im Netzwerk einen TFTP-Server finden kann. Dieser TFTP-Server stellt dann per syslinux ein Bootmenü zur Verfügung, in dem Einträge erstellt werden können. Solch ein Eintrag kann dann beispielsweise ein über NFS bereitgestelltes Linux-Live-System sein.
Damit das alles funktionieren kann, muss man aber noch ein paar Einstellungen im Server vornehmen. Beispielsweise muss man die SELinux_Regeln und die Firewall-Einstellungen so abändern, dass die Kommunikation mit dem Client auch funktionieren kann. Zuerst muss man dazu aber den NFS-Dienst so abändern, dass dieser mit fixierten Ports arbeitet. Das macht man am Besten in der sysconfig von nfs:
LOCKD_TCPPORT=32803 LOCKD_UDPPORT=32769 MOUNTD_PORT=892
Danach kann man direkt die für NFS benötigten Ports in der iptables-Firewall freigeben (Ports 111,892,2049,32803, jeweils UDP und TCP). Für den Boot-DHCP Lookup und für TFTP selbst muss man dann noch die Ports 67 und 69 (beide für das UDP-Protokoll) freischalten (das erledigt man am einfachsten per Webmin-Oberfläche).
Beispiel eines Boot-Images
Zum Abschluss hier noch ein Beispiel für ein installiertes Boot-Image. Dabei handelt es sich um die SystemRescueCD. Weitere Installationsanleitungen findet man per Google oder eben der Good To Know Database.
Zuerst laden Sie sich die benötigte Live-CD herunter.
[root@server ~]# wget http://downloads.sourceforge.net/project/systemrescuecd/sysresccd-x86/3.8.0/systemrescuecd-x86-3.8.0.iso
Anschließend mounten Sie das ISO-Image in das Verzeichnis /mnt.
[root@server ~]# mount -o loop systemrescuecd-x86-3.8.0.iso /mnt
Erstellen Sie jetzt ein Verzeichnis in welches Sie den Inhalt des ISO-Images kopieren und später per NFS freigeben.
[root@server ~]# mkdir -p /media/nfs/systemrescuecd3.8.0 [root@server ~]# cp -a /mnt/* /media/nfs/systemrescuecd3.8.0/
Nachdem Sie alle Dateien kopiert haben, hängen Sie das ISO-Image wieder aus.
[root@server ~]# umount /mnt
Jetzt geben wir das Verzeichnis per NFS frei. Dazu bearbeiten wir die Konfigurationsdatei „/etc/exports“. Wir fügen nun am Ende der Datei die beiden folgenden Zeilen ein.
/media/nfs/systemrescuecd3.8.0 192.168.0.0/255.255.255.0(rw)
[root@server ~]# service nfs reload
Jetzt erstellen wir ein Verzeichnis für die PXE-Bootdateien und kopieren die benötigten Dateien.
[root@server ~]# mkdir -p /opt/tftproot/systemrescuecd3.8.0 [root@server ~]# cp /media/nfs/systemrescuecd3.8.0/isolinux/rescue* /media/nfs/systemrescuecd3.8.0/isolinux/initram.igz /opt/tftproot/systemrescuecd3.8.0/
Nun öffnen wir noch die Datei /opt/tftproot/pxelinux.cfg/default mit einem Editor.
[root@server ~]# nano /opt/tftproot/pxelinux.cfg/default
Wir fügen hier die folgenden Abschnitte ein, damit wirdie SystemRescueCD Live-Systeme via PXE booten können.
label systemrescuecd32 menu label SystemRescueCD 3.8.0 i686 kernel /systemrescuecd3.8.0/rescue32 append initrd=/systemrescuecd3.8.0/initram.igz dodhcp setkmap=us rootpass=somepassword nfsboot=192.168.0.1:/media/nfs/systemrescuecd3.8.0/ label systemrescuecd64 menu label SystemRescueCD 3.8.0 amd64 kernel /systemrescuecd3.8.0/rescue64 append initrd=/systemrescuecd3.8.0/initram.igz dodhcp setkmap=us rootpass=somepassword nfsboot=192.168.0.1:/media/nfs/systemrescuecd3.8.0/
Die Konfigurationsdateien (/opt/tftproot/pxelinux.cfg/default) kann man auch client-spezifisch verwalten.
So kann beispielsweise ein Rechner als default eine VDR-Distribution laden, während ein anderes System immer ein Rettungssystem startet.
Dazu benennt man eine Konfigurationsdatei einfach nach der MAC-Adresse des Clients und (mit Prefix „01-„), für welchen man die Einstellungen vornehmen will (so kann eine weitere Konfigurationsdatei etwa /opt/tftproot/pxelinux.cfg/01-00-12-ab-cc-dd-ef heissen).