Debian-Installation über PXE, TFTP und Preseed

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Installation von Debian ‹ Debian-Installation über PXE, TFTP und Preseed


Getestet.png 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 Debianpackage.png dnsmasq, einigen Regeln für Debianpackage.png 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 Debianpackage.png 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 Debianpackage.png 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 Debianpackage.png 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