Linux automatisch installieren via PXE-Boot
Debian Linux auf einem Rechner zu installieren mag für den einen oder anderen ja eine interessante Erfahrung sein. Vielleicht ist es auch eine willkommene Abwechslung zum Alltag. Je nach Temperament wird es aber nach der zweiten, fünften oder x-ten Installation langweilig. Dann entsteht der Wunsch nach automatischer Installation des Betriebssystems.
Hierfür gibt es bei Debian das altgediente FAI. Dieses ist sehr flexibel und kann einerseits recht viele Rechner gleichzeitig installieren, erlaubt andererseits die unterschiedlichsten Anpassungen. Zumindest das letztere braucht etwas Einarbeitungszeit, darum wollte ich es eine Nummer kleiner.
Ausgangspunkt ist für mich als Hardware ein PC Engines ALIX-Rechner und als Betriebssystem Voyage Linux, eine Distribution, die direkt von Debian abgeleitet und durch das per Voreinstellung readonly eingehängte Dateisystem sehr gut für unbeaufsichtigt laufende Systeme geeignet ist.
In einem Posting von 2009 auf der Mailingliste [voyage-linux] fand ich einen Hinweis zu jra-initrd von Jeff R. Allen. Er hatte seinerzeit bit-xpe genommen und für seine Zwecke angepasst. Bei meinen Tests musste ich leider feststellen, dass die Scipts mit der momentan aktuellen Version 0.7.5 von Voyage Linux nicht mehr funktionieren.
Das war für mich nicht übermäßig schlimm, ich wollte sowieso etwas dabei lernen. Das Ergebnis meiner Bemühungen habe ich in pxe-initrd zusammengefasst und hier abgelegt.
Nachfolgend beschreibe ich, wie ich mit pxe-initrd Linux automatisch auf PC Engines ALIX Rechnern installiere.
Als erstes besorge ich die Software und entpacke sie:
$ wget http://www.voyage.hk/download/voyage/voyage-0.7.5.tar.bz2
$ wget .../pxe-initrd-0.1.tar.gz
$ sudo tar xjf voyage-0.7.5.tar.bz2
$ sudo tar -C voyage-0.7.5/root xzf pxe-initrd-0.1.tar.gz
Ich entpacke pxe-initrd innerhalb von Voyage Linux, weil die RAM-Disk genau auf das System abgestimmt sein soll.
$ sudo chroot voyage-0.7.5
# depmod -a 2.6.38-voyage
# apt-get update
# apt-get install parted busybox rsync
# cd /root/pxe-initrd-0.1
# cat > /etc/lsb-release << EOT
DISTRIB_ID=Voyage
DISTRIB_RELEASE=0.7.5
DISTRIB_DESCRIPTION="Voyage 0.7.5"
EOT
# kern=2.6.38-voyage sh build.sh
Der Aufruf von depmod ist wichtig, damit die Modulabhängigkeiten bekannt sind, wenn am Ende die RAM-Disk in build.sh erzeugt wird. Anschließend aktualisiere ich die Paketverwaltung und stelle sicher, dass parted, rsync und busybox für die RAM-Disk zur Verfügung stehen. Ein paar Fehlermeldungen wegen fehlender mtab-Dateien beim Bau der RAM-Disk ignoriere ich.
Nun habe ich die passende RAM-Disk zum Kernel und kopiere beide in den TFTP-Bereich.
$ sudo mkdir -p /var/tftpd
$ sudo cp voyage-0.7.5/boot/vmlinuz-2.6.38-voyage /var/tftpd
$ sudo cp voyage-0.7.5/root/pxe-initrd-0.1/initrd.gz \
/var/tftpd/initrd.img-2.6.38-voyage
Zusätzlich brauche ich noch einen PXE-Bootlader, den ich bei syslinux finde.
$ sudo apt-get install syslinux
$ sudo cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpd
Der Bootlader braucht noch Konfigurationsdateien.
$ sudo -i
# mkdir /var/tftpd/pxelinux.cfg
# cat > /var/tftpd/pxelinux.cfg/default << EOT
default localboot
label localboot
localboot 0
EOT
# cat > /var/tftpd/pxelinux.cfg/voyage-0.7.5 << EOT
serial 0 38400
console 0
label linux
KERNEL vmlinuz-2.6.38-voyage
APPEND initrd=initrd-2.6.38-voyage console=ttyS0,38400n1 root=/dev/hda1
EOT
Die Standardkonfiguration default weist den Bootlader an, den Rechner
von der lokalen Platte zu starten. Die andere lädt den Kernel und die
von mir erzeugte RAM-Disk.
Damit ein Rechner via Netz installiert wird, lege ich einen Link zu
dieser Konfigurationsdatei an.
# cd /var/tftpd/pxelinux.cfg
# ln -s voyage-0.7.5 01-00-0d-b9-22-7d-24
Der Bootlader pxelinux.0 sucht auf dem TFTP-Server nach einer Datei, deren Dateiname mit 01- beginnt und auf die MAC-Adresse des Rechners, auf dem der Bootlader läuft endet. Das heisst der Bootlader auf dem Rechner mit der MAC-Adresse 00:0d:b9:22:7d:24 fragt nach der Datei 01-00-0d-b9-22-7d-24 und bekommt darüber die Installationsanweiseungen. Für andere MAC-Adressen muss ich entsprechend andere Dateinamen verwenden.
Nun brauche ich noch ein Verzeichnis, das ich über Netz zur Installation anbiete. Dazu nehme ich das entpackte Verzeichnis voyage-0.7.5, in dem ich bereits die initiale RAM-Disk erzeugt hatte.
$ sudo mkdir -p /var/local
$ sudo cp -a voyage-0.7.5 /var/local
$ sudo chroot /var/local/voyage-0.7.5
# rm -rf /root/pxe-initrd-0.1
# apt-get install ntpd psmisc telnet
# apt-get install busybox-syslogd
# chmod a-x /etc/init.d/busybox-*logd
# apt-get -f install
# chmod a+x /etc/init.d/busybox-*logd
# vi /etc/inittab
Ich kopiere das Verzeichnis, weil ich noch ein paar kleinere Änderungen vornehmen will:
- Die Scripte zum Erzeugen der RAM-Disk können weg.
- Ich installiere noch ein paar Programme, die ich gern verfügbar habe.
- Das postinst Script von busybox-syslogd versucht, den Daemon zu starten und bricht dann mit Fehler ab. Durch chmod a-x ... kann ich es davon abhalten, so dass *apt-get -f install funktioniert.
In der inittab stehen noch die virtuellen Konsolen, die kommentiere ich aus und verwende stattdessen die serielle Konsole.
#1:2345:respawn:/sbin/getty 38400 tty1 #2:23:respawn:/sbin/getty 38400 tty2 #3:23:respawn:/sbin/getty 38400 tty3 #4:23:respawn:/sbin/getty 38400 tty4 #5:23:respawn:/sbin/getty 38400 tty5 #6:23:respawn:/sbin/getty 38400 tty6 T0:23:respawn:/sbin/getty -L ttyS0 38400 vt100
Damit ist das Installationsverzeichnis vorbereitet.
Als nächstes setze ich den rsync Server mit der Konfigurationsdatei pxe-initrd-0.1/rsyncd.conf auf, in der ich den Pfad (path) zum Installationsverzeichnis angepasst habe.
[voyage]
path = /var/local/voyage-0.7.5
use chroot = no
max connections = 4
uid = root
gid = root
read only = true
Der Aufruf lautet:
$ sudo rsync --daemon \
--config voyage-0.7.5/root/pxe-initrd-0.1/rsyncd.conf
Schließlich brauche ich noch einen TFTP- und einen DHCP-Server, wofür ich, wie von Jeff R. Allen beschrieben, dnsmasq verwenden kann. Dazu muss ich das Script pxe-initrd-0.1/run-dnsmasq anpassen:
#!/bin/sh
dnsmasq --enable-tftp --tftp-root=/var/tftp \
--dhcp-range=192.168.2.10,192.168.2.20,24h \
--dhcp-boot=/var/tftp/pxelinux.0 \
--bootp-dynamic -d -i eth1
Anschließend rufe ich das Script auf:
$ sudo voyage-0.7.5/root/pxe-initrd-0.1/run-dnsmasq
Nun brauche ich nur noch meinen ALIX-Rechner starten und in PXE-Boot-Modus zu versetzen.
Posted 2011-10-28