Installation automatisieren

Wenn man eine ganzen Flotte von Rechnern betreut, lässt sich die Installation vollständig automatisieren. Dazu aktivieren wir im Setup jedes einzelnen Rechners das PXE, welches per DHCP die Adresse eines TFTP-Servers ermittelt. Von dort lädt er das Installationssystem herunter, welches wiederum Voreinstellungen via HTTP lädt und Pakete aus einem lokalen Depot installiert.

Komponenten bei der Installation über das Netzwerk

Pakete installieren

Wir installieren die einzlenen Puzzleteile und eine paketierte Version des Debian Installers.

apt install apt-cacher-ng apache2 dnsmasq debian-installer-12-netboot-amd64
chown apt-cacher-ng /var/log/apt-cacher-ng

Pakete zwischenlagern

Apt-Cacher NG dient als Zwischenlager für das Debian Depot, so dass Pakete nur einmal aus dem Internet heruntergeladen werden müssen. Um den Zwischenspeicher zu füllen, nutzen wir ihn auch für lokal installierte Pakete.

/etc/apt/apt.conf.d/02proxy
Acquire::http::Proxy "http://localhost:3142";

Konfigurationsdatei ausliefern

Der Apache Webserver wiederum stellt die Voreinstellungsdatei zur Verfügung.

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerName nuc10 DocumentRoot /var/www/html <Location /> Require all granted </Location> </VirtualHost>

Adressen zuweisen

Dnsmasq stellt den Bootloader per TFTP auf Kanalnummer 69 bereit.

/etc/dnsmasq.conf
# DHCP log-dhcp dhcp-no-override dhcp-range=192.168.56.2,192.168.56.20 # TFTP enable-tftp tftp-root=/usr/lib/debian-installer/images/12/amd64/text # PXE pxe-service=x86PC, "Install Debian GNU/Linux", pxelinux.0 pxe-service=x86PC, "Boot from local hard disk", 0
# Name Architektur
0 x86PC Intel x86PC
1 PC98 NEC/PC98
2 IA64_EFI EFI Itanium
3 Alpha DEC Alpha
4 Arc_x86 Arc x86
5 Intel_Lean_Client Intel Lean Client
6 IA32_EFI EFI IA32
7 BC_EFI EFI BC
8 Xscale_EFI EFI Xscale
9 X86-64_EFI EFI x86-64
ARM32_EFI
ARM64_EFI

Startmenü gestalten

PXELINUX ist eine Variante des SYSLINUX Bootloaders für den Start des Rechners über ein Netzwerk. Die Initiale Ramdisk des Pakets debian-installer-12-netboot-amd64 enthält das Debian Installationssystem. Der Bootloader unterstützt ein komplexes Menüsystem, über das wir unterschiedliche Varianten der Voreinstellungsdatei anbieten.

/usr/lib/debian-installer/images/12/amd64/text/pxelinux.cfg/default
path debian-installer/amd64/boot-screens/ prompt 0 timeout 0 menu hshift 4 menu width 70 menu title Debian GNU/Linux Installation include debian-installer/amd64/boot-screens/stdmenu.cfg label install menu label ^Manual Installation kernel debian-installer/amd64/linux append initrd=debian-installer/amd64/initrd.gz vga=788 --- quiet label autominimal menu label ^Automatic Minimal kernel debian-installer/amd64/linux append initrd=debian-installer/amd64/initrd.gz \ vga=788 auto=true url=http://192.168.56.1/preseed.cfg hostname=minimal domain= label autognome menu label ^Automatic GNOME Workstation kernel debian-installer/amd64/linux append initrd=debian-installer/amd64/initrd.gz \ vga=788 auto=true url=http://192.168.56.1/preseed-gnome.cfg hostname=gnome domain= default debian-installer/amd64/boot-screens/vesamenu.c32
Parameter Langer Name Beispiel Beschreibung
Farbtiefe 800x600 1024x768 1152x864 1280x1024 1600x1200
8 bit vga=771 vga=773 vga=353 vga=775 vga=796
16 bit vga=788 vga=791 vga=355 vga=794 vga=798
24 bit vga=789 vga=792 vga=795 vga=799
Parameter Langer Name Beispiel Beschreibung
auto auto-install/enable true Fragen verzögern, bis die Voreinstellungsdatei geladen wurde
priority debconf/priority critical Fragen unterbinden (critical | high | medium | low)
fb debian-installer/framebuffer false Bildspeicher des Kernels verwenden
language debian-installer/language de Sprache
country debian-installer/country DE Ländercode
locale debian-installer/locale de_DE.UTF-8 Sprache, Land und Zeichensatz
theme debian-installer/theme dark Farbschema für den GTK-Oberbau
classes auto-install/classes
file preseed/file Pfad für Antwort-Datei
url preseed/url nuc10 Hostname und optionaler Pfad für Antwort-Datei
domain netcfg/get_domain Domäne
hostname netcfg/get_hostname debian Eigener Hostname
interface netcfg/choose_interface auto Netzwerk-Schnittstelle
protocol mirror/protocol http Protokoll beim laden der Pakete
suite mirror/suite stable Debian-Version
modules anna/choose_modules Installer-Module (udeb) laden
recommends base-installer/install-recommends true Empfohlene Pakete installieren
tasks tasksel:tasksel/first gnome Pakete aus Task installieren
desktop tasksel:tasksel/desktop gnome
dmraid disk-detect/dmraid/enable false ATA RAID
keymap keyboard-configuration/xkb-keymap de Tastaturbelegung
preseed-md5 preseed/file/checksum

Bevor der Debian-Installer die Voreinstellungsdatei lädt, fragt er Land, Sprache, Tastaturbelegung, Hostname und diverse Netzwerkeinstellungen ab. Um das zu verhindern, übergibt man diese Daten auf der Kommandozeile des Kernels.

Voreinstellungen festlegen

Der Debian-Installer kann Antworten auf alle Fragen aus einer Voreinstellungsdatei lesen und so die Installation teilweise oder vollständig automatiseren. Es beginnt mit der Lokalisierung.

/var/www/html/preseed.cfg
d-i debian-installer/language string de d-i debian-installer/country string DE d-i debian-installer/locale string de_DE.UTF-8 d-i console-keymaps-at/keymap select de d-i keyboard-configuration/xkb-keymap select de

Die Netzwerkeinstellungen werden via DHCP ermittelt. Die folgenden Angaben verhindern lediglich lästige Rückfragen.

d-i netcfg/choose_interface    select   auto
d-i netcfg/get_hostname        string   Host
d-i netcfg/get_domain          string
d-i netcfg/wireless_wep        string
d-i hw-detect/load_firmware    boolean  false

Als Paketquelle dient der nächstgelegene Spiegelserver.

d-i mirror/country             string   manual
d-i mirror/http/hostname       string   deb.debian.org
d-i mirror/http/directory      string   /debian
d-i mirror/http/proxy          string	http://192.168.56.1:3142

Der Administrator darf sich nicht direkt anmelden. Stattdessen erhält der erste Benutzer Sudo-Rechte.

d-i passwd/root-login          boolean  false
d-i passwd/user-fullname       string   DisplayName
d-i passwd/username            string   User
d-i passwd/user-password       password Password
d-i passwd/user-password-again password Password

Als nächstes wird die Zeitzone eingestellt.

d-i clock-setup/utc            boolean  true
d-i clock-setup/ntp            boolean  true
d-i time/zone                  string   Europe/Berlin

Für die Partitionierung gibt es Rezepts mit folgendem Inhalt:

  1. Minimale Größe in Megabyte
  2. Priorität für Gewichtung
  3. Maximale Größe in Megabyte
  4. Typ des Dateisystems
d-i partman-auto/disk          string   /dev/sda
d-i partman-auto/method        string   regular
d-i partman-auto/choose_recipe select   uefi
d-i partman-auto/expert_recipe string   uefi :: \
        1 1 1 free                                      \
            $bios_boot{ }                               \
            method{ biosgrub }                          \
        .                                               \
        256 1 256 vfat                                  \
            $primary{ }                                 \
            $lvmignore{ }                               \
            method{ efi }                               \
            format{ }                                   \
            mountpoint{ /boot/efi }                     \
        .                                               \
        4096 80 100% ext4                               \
            $primary{ }                                 \
            label{ root }                               \
            method{ format }                            \
            format{ }                                   \
            use_filesystem{ }                           \
            filesystem{ ext4 }                          \
            mountpoint{ / }                             \
        .                                               \
        4096 20 8192 linux-swap                         \
            $primary{ } method{ swap } format{ }        \
        .

Alle weiteren Abfragen werden unterdrückt.

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                               boolean  true
d-i partman/confirm_nooverwrite                   boolean  true
d-i partman-md/device_remove_md                   boolean  true
d-i partman-md/confirm                            boolean  true
d-i partman-lvm/device_remove_lvm                 boolean  true
d-i partman-lvm/confirm                           boolean  true
d-i partman-partitioning/confirm_write_new_label  boolean  true
d-i partman/choose_partition                      select   finish
d-i partman/confirm                               boolean  true
d-i partman/confirm_nooverwrite                   boolean  true
d-i partman/mount_style                           select   label

Schließlich werden die gewünschten Pakete installiert.

d-i apt-setup/non-free                            boolean  true
d-i apt-setup/contrib                             boolean  true
d-i pkgsel/include                                string   joe less tree psmisc
d-i pkgsel/upgrade                                select   full-upgrade
popularity-contest popularity-contest/participate boolean  false
d-i finish-install/reboot_in_progress             note
d-i preseed/late_command                          string   in-target \
	echo "Welcome"

Literatur

  1. Debian Wiki: Installing Debian using network booting
  2. Debian Installationsanleitung Anhang B: Automatisieren der Installation mittels Voreinstellung