weidner/archives/2011/10/28/

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:

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
Tags: