Debian-Installation über PXE, TFTP und Preseed
Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.
|
Auf der Basis von Bullseye wird hier das Einrichten eines PXE/TFTP-Servers für das Netboot-Image und die unbeaufsichtigte Installation über eine integrierte "preseed.cfg" beschrieben.
Einführung
Ausgehend von einem Wheezy-Server mit zwei Netzwerkkarten (eth0 und eth1) wird mit der Software dnsmasq, einigen Regeln für iptables und einer "preseed.cfg" das Booten über PXE und eine unbeaufsichtigte Installation realisiert. Die Clients werden über eth1 (IP 192.168.56.1) und DHCP mit einer IP ausgestattet und ziehen einen Kernel und eine "initrd.gz" über TFTP, das Gerät eth0 hat eine Verbindung zum Internet. Die nachfolgende Installation startet automatisch und benötigt keinen Eingriff, lediglich vor dem ersten Boot in das neue System muss auf dem Client von PXE-Boot auf booten von HD umgestellt werden.
Diese Anleitung kann auch auf einem Desktop-Rechner mit nur einer Netzwerk- oder WLAN-Karte umgesetzt werden, wenn Virtualisierungssoftware, wie z.B. Virtualbox verwendet wird. Hierzu muss in Virtualbox in den globalen Einstellungen unter "Netzwerk" ein Host-only Netzwerk (vboxnet0) eingerichtet werden, das dann per default die IP 192.168.56.1 hat. Der integrierte DHCP-Server wird deaktiviert. Die virtuelle Maschine muss dann den Adapter "vboxnet0" als Netzwerkadapter erhalten und unter "System" sollte die Boot-Reihenfolge auf "Netzwerk" gestellt werden.
Benötigte Software
Installation
Die Software wird zunächst installiert:
root@debian:~# apt-get install dnsmasq
Die Konfigurationsdatei von dnsmasq wird beiseite gelegt und eine angepasste Version erstellt:
root@debian:~# mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
/etc/dnsmasq.conf
enable-tftp tftp-root=/var/lib/tftpboot dhcp-boot=/pxelinux.0,0.0.0.0 domain-needed bogus-priv listen-address=192.168.56.1 expand-hosts dhcp-range=192.168.56.10,192.168.56.15,12h
Der TFTP- und der DHCP-Server in dnsmasq werden aktiviert. Sie lauschen an eth1 (192.168.56.1).
TFTP
Der TFTP-Server im Verzeichnis "/var/lib/tftpboot" muss jetzt mit einer Struktur versehen werden, die im Debian "netboot.tar.gz" enthalten ist.
root@debian:~# mkdir /var/lib/tftpboot
root@debian:~# cd /var/lib/tftpboot
root@debian:~# wget http://ftp.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/netboot.tar.gz
root@debian:~# tar xzvf netboot.tar.gz
root@debian:~# chown nobody:nogroup -R .
Das Verzeichnis "tftpboot" wird erstellt und das "netboot.tar.gz" heruntergeladen und entpackt. Abschliessend werden die Rechte angepasst. Bitte den Punkt am Ende des chown-Befehls beachten.
iptables
Da mit "netboot.tar.gz" eine Installation über das Internet erfolgt, muss an dieser Stelle ein Forwarding auf eth0 (oder eine andere Leitung in das Internet) hergestellt werden. Hier bietet sich iptables an.
root@debian:~# echo 1 > /proc/sys/net/ipv4/ip_forward
root@debian:~# iptables -A FORWARD -o eth0 -i eth1 -s 192.168.56.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
root@debian:~# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
root@debian:~# iptables -A POSTROUTING -t nat -j MASQUERADE
Das System ist nach einem Neustart von dnsmasq einsatzbereit, schon jetzt kann ein Client über PXE eine Debian-Installation durchführen.
root@debian:~# service dnsmasq restart
Modifizieren der "initrd.gz"
Um mit "netboot.tar.gz" eine Installation mit einer "preseed.cfg" durchzuführen, ist es notwendig die "preseed.cfg" in die "initrd.gz" zu integrieren. Ausserdem muss das Laden des Debian-Installationsmenüs durch Bearbeiten der "syslinux.cfg" modifiziert werden.
root@debian:~# mkdir /tmp/initrd
root@debian:~# cd /tmp/initrd
root@debian:~# cat /var/lib/tftpboot/debian-installer/amd64/initrd.gz | gzip -d | cpio -i
root@debian:~# cp /root/preseed.cfg .
root@debian:~# find | cpio -o --format=newc | gzip -9c > ../initrd.gz
root@debian:~# cp ../initrd.gz /var/lib/tftpboot/debian-installer/amd64/
Die "netboot.tar.gz" wird im Verzeichnis "/tmp/initrd" entpackt und die preseed.cfg wird in das Root-Verzeichnis der initrd gelegt. Dann wird alles wieder eingepackt und in "tftpboot" zurückkopiert. Der Punkt am Ende des cp-Befehls ist zu beachten.
Anpassen von syslinux.cfg
Damit das Installationsmenü nicht im Weg ist, muss die "syslinux.cfg" angepasst werden.
root@debian:~# vi /var/lib/tftpboot/debian-installer/amd64/boot-screens/syslinux.cfg
# D-I config version 2.0 include debian-installer/amd64/boot-screens/menu.cfg default debian-installer/amd64/boot-screens/vesamenu.c32 prompt 0 timeout 0 DEFAULT wheezy LABEL wheezy kernel debian-installer/amd64/linux append vga=normal initrd=debian-installer/amd64/initrd.gz auto=true interface=auto netcfg/dhcp_timeout=60 netcfg/choose_interface=auto priority=critical preseed/file=/preseed.cfg IPAPPEND 2
Hier werden die für eine unbeaufsichtigte Installation erforderlichen Parameter eingefügt. Der Parameter "IPAPPEND 2" erleichtert der initrd das Auswählen des Interfaces für den PXE-Boot. Die "preseed.cfg" wird beim Bootvorgang bereits eingelesen. Beim Erstellen der "preseed.cfg" ist es manchmal erforderlich zu erforschen warum der Installer doch noch eine Frage hat. Hier hilt der Bootparameter "DEBCONF_DEBUG=5", der am Ende der append-Zeile angefügt wird. Jetzt kann über Konsole 4 (Alt - F4) dem Fehler nachgespürt werden.
preseed.cfg
Für die Eiligen hier beispielhaft eine "preseed.cfg", die eine Wheezy-Grundinstallation durchführt. Der Rechner ist anschliessend über ssh zu erreichen. Es wird eine Boot- und eine Root-Partition eingerichtet (100 MB und 2 GB).
# Locale / Keymap d-i debian-installer/locale string de_DE.UTF-8 d-i debian-installer/keymap select de-latin1 d-i console-keymaps-at/keymap select de d-i languagechooser/language-name-fb select German d-i countrychooser/country-name select Germany d-i console-setup/layoutcode string de_DE # Netzwerk-Konfiguration d-i netcfg/dhcp_timeout string 30 d-i netcfg/choose_interface select eth0 d-i netcfg/hostname string Testrechner # Installationsquelle d-i mirror/country string manual d-i mirror/http/hostname string ftp.de.debian.org d-i mirror/http/directory string /debian d-i mirror/codename string wheezy d-i mirror/suite string wheezy d-i mirror/udeb/suite string wheezy d-i mirror/http/proxy string d-i mirror/noarch error # Installer / Apt-Setup d-i debian-installer/allow_unauthenticated string true d-i finish-install/reboot_in_progress note d-i prebaseconfig/reboot_in_progress note d-i apt-setup/non-free boolean true d-i apt-setup/contrib boolean true # Uhr und Zeitzone d-i clock-setup/utc boolean true d-i clock-setup/ntp boolean true d-i clock-setup/ntp-server string 0.pool.ntp.org d-i time/zone string Europe/Berlin # Partitionierung / Grub d-i partman-auto/disk string /dev/sda d-i partman-auto/method string regular d-i partman-lvm/device_remove_lvm boolean true d-i partman-auto/purge_lvm_from_device boolean true d-i partman-lvm/confirm boolean true d-i partman/alignment select cylinder d-i partman/confirm boolean true d-i partman-basicfilesystems/no_swap boolean false d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm_nooverwrite boolean true d-i grub-installer/only_debian boolean true # Boot/Root-Partition, Zahlen in MB d-i partman-auto/expert_recipe string \ condpart :: \ 100 100 100 ext3 \ $primary{ } $bootable{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext3 } \ mountpoint{ /boot } \ . \ 2048 2048 2048 ext4 \ $primary{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ / } \ . \ # Root User anlegen d-i passwd/root-login boolean true d-i passwd/root-password-crypted password $6$7IzN3skX$wwQZswuKxdmw3rhm6B3MgAom3lfbmViqMmwStrm/GDcKIRshxmRfVeDh72og5qkOPvHdR5pfiCWL671x9vbdG0 # User anlegen d-i passwd/user-fullname string Hans Dampf d-i passwd/username string hans # User-Passwort (hier im Klartext, s.u.) d-i passwd/user-password password secret_word d-i passwd/user-password-again password secret_word # Software Selections tasksel tasksel/first multiselect ssh-server standard d-i pkgsel/include string ssh vim ethtool sysstat ntp ntpdate # Mail-Konfiguration exim4-config exim4/no_config boolean true exim4-config exim4/exim3_upgrade boolean true # SSH-Server ssh ssh/new_config boolean true ssh ssh/use_old_init_script boolean true ssh ssh/protocol2_only boolean true ssh ssh/run_sshd boolean true ssh ssh/SUID_client boolean true ssh ssh/disable_cr_auth boolean false # Pop-Contest popularity-contest popularity-contest/participate boolean false
Es ist am Anfang etwas gruselig so eine "preseed.cfg" zu erstellen, da das ganze nicht besonders intuitiv ist. Das Netz ist voll von mehr oder weniger tauglichen Informationen hierzu. Ein Tip zum Erstellen der verschlüsselten Passworte in der "preseed.cfg". Im Internet (und auch der offiziellen Debian-Dokumentation) wird immer noch von MD5-Hashes ($1) ausgegangen. Wir haben aber inzwischen SHA-512-Hashes in der Shadow-Datei ($6), sodass ein Passwort folgendermassen gehasht wird:
root@debian:~# printf "secret_word" | mkpasswd -s -m sha-512
Weblinks
https://wiki.debian.org/DebianInstaller
https://wiki.debian.org/DebianInstaller/Preseed
https://www.debian.org/releases/stable/example-preseed.txt
Quellen
Manpages
man dnsmasq
man iptables