Automatisierte Ubuntu Installation Teil 1

Für ein Projekt suchte ich eine Möglichkeit, ein Linux Grundsystem automatisiert in einer virtuellen Umgebung zu installieren. Das ganze sollte für den Anwender einfach und für mich als Entwickler flexibel funktionieren. Nach etwas Recherche war klar, dass dies wohl am besten mit der Voreinstellungsmöglichkeit des Debian bzw. Ubuntu Installers umzusetzen sein sollte. Allerdings ist die Dokumentation der automatisierten Installation etwas dürftig und man muss nicht gerade wenig die Google Suche bemühen, bis man am Ende alle Infos zusammen hat.

Software

hilfreiche Links

einfach Booten

Nachdem ich mich etwas über die die internen Abläufe des Debian Installers informiert hatte ging es an die konkrete Umsetzung. Prinzipiell kann man die Voreinstellungskonfiguration auf 3 Arten dem Installer übergeben. Entweder legt man eine Datei preseed.cfg im Root Verzeichnis der initrd an oder man übergibt den Namen der Konfigurations Datei im Bootloader mit den anderen Kernel Parametern entweder mit file= oder url= je nachdem ob man die Datei auf dem Installationsmedium oder einem Webserver abrufen möchte. Für mich ist der Webserver die flexibelste Lösung, da man so nicht jedes mal das Bootmedium ändern muss bei einer anderen Konfiguration. Die nächste Frage war, wie ich den Bootvorgang für den Anwender gestalte. Die übliche Vorgehensweise, die BootCD in Virtualbox einzubinden und zu starten, wollte ich noch etwas vereinfachen. Die Installation sollte direkt von der virtuellen Festplatte booten. Wie bekommt man nun eine leere Festplatte dazu, einen Kernel mit einer Ramdisk zu booten? Nun dafür gibt es im netboot Verzeichnis von Ubuntu ein 12MB kleines hd-image aus dem man mit Hilfe des Virtualbox Komandozeilenprogramm VboxManage.exe schnell und einfach eine Virtualbox .vdi Festplatte erstellen kann.
vboxmanage.exe convertdd boot.img boot.vdi
vboxmanage.exe modifyhd boot.vdi --resize 10000
Der erste Befehl konvertiert die Datei in eine vbox virtuelle Festplatte, der 2. Befehl vergrößert die Festplatte auf 10GB, natürlich nicht direkt auf die volle Größe, sondern nur intern als dynamisch wachsendes Medium. Diese Festplatte bindet man nun in eine neu erstellte Virtuelle Maschine ein, wo man die Vorgaben für Ubuntu nehmen kann mit ein paar kleinen Änderungen gegenüber der Standardkonfiguration. Unter System/Prozessor sollte man PAE/NX aktivieren und als Festplattencontroller den IDE-Controller wählen, falls man den virtual Kernel von Ubuntu anstatt des generic Kernel verwenden möchte, der wohl keine SATA Treiber dabei hat. Als letzte Änderung wähle ich in der Netzwerkkonfiguration „Netzwerkbrücke“ statt „NAT“, damit die virtuelle Maschine unter einer eigenen IP erreichbar ist. Nun kann man direkt den Installer booten, der natürlich noch nicht automatisiert abläuft. Die komplette virtuelle Maschine mit Festplatte und Einstellungen kann man dann praktisch als Appliance exportieren und hat eine kleine 12MB große .ova Datei, die der Anwender ganz einfach importieren und starten kann und dies nicht nur in Virtualbox sondern auch anderen Virtualisierungsumgebungen die das Open Virtualization Format unterstützen.

Anpassen des BootImage

Die Dokumentation ist leider nicht immer hilfreich, um die ganzen Preseed Parameter im debconf Format zu überblicken. Viele Einstellungen findet man gar nicht in der Doku, einige ändern sich und andere funktionieren nicht so wie sie sollen. Daher braucht man schon etwas Geduld bis man endlich die Datei fertig hat und wirklich alles automatisiert abläuft wie man es gerne hätte. Die erste kleine Hürde waren die Länder- und Spracheinstellung. Ich wolle so viel wie möglich in die Pressed Datei auslagern und nur die absolut notwendigen Parameter in der Kernel Konfiguration angeben. Will man die Spracheinstellungen nicht beim Kernel Aufruf angeben kann man
auto=true priority=critical
angeben, was dafür sorgt, dass die Spracheinstellung, die normalerweise ganz am Anfang erfolgt, erst nach der Hardware und Netzwerkerkennung und damit erst nach dem Abrufen der Seed Datei durchgeführt wird, so dass man diese Einstellung auch in der Seed Datei vornehmen kann. Die Angabe der Bootparameter erfolgt in der Datei syslinux.cfg. Diese befindet sich im boot.img, das man einfach mit dem ImDisk Virtual Disk Driver als Laufwerk mounten und so die Dateien bearbeiten kann. Da ich einen einfachen Installer möchte, benötige ich auch nur einen einzigen Menüpunkt. Somit kann man die Dateien löschen bis auf initrd.gz, ldlinux.sys, linux, splash.png, syslinux.cfg und vesamenu.c32.
# syslinux.cfg
default vesamenu.c32
prompt 0
timeout 50
menu title Auto Installation
menu background splash.png

label install
 menu label Start
 kernel linux
 menu default
 append initrd=initrd.gz vga=788 quiet auto=true priority=critical url=%PRESEED URL% --

menu width 49
menu rows 10
menu margin 8
menu vshift 12
menu hshift 13
menu cmdlinerow 16
menu timeoutrow 16
syslinux.cfg ist nun übersichtlich und einfach, es gibt nur noch einen Menüpunkt „Start“ der nach 5 Sekunden automatisch ausgeführt wird. Nach der Bearbeitung Unmountet man die boot.img, wandelt sie wieder in .vdi und hat nun schon eine Automatisierung bis zum Abrufen der preseed Datei vom Webserver.

Die Voreinstellungsdatei

Nun erfolgt die Hauptarbeit der automatisierten Installation in der Voreinstellungsdatei, die vom Webserver abgerufen wird. Diese ist im debconf Format organisiert und liefert praktisch die Antworten, die der Installer normalerweise abfrägt. Die meisten Probleme hatte ich bei den Spracheinstellungen, da sich da wohl mit Ubuntu 11.04 die Einstellung beim Tastaturlayout geändert hat und dem Hinweis auf die unvollständige Übersetzung, für den ich nicht gleich die Einstellung finden konnte. Auch musste ich erst länger nach einer Lösung suchen, damit die 3 vbox Kernel Module nicht installiert werden, die eine Menge Abhängigkeiten haben und die Installation unnötig vergrößern. Da ich ja erst mal nur ein absolutes Minimalsystem haben wollte, war ich froh über einen passenden Workaround, den ich in einer einer Mailingliste fand. Hier die fertige preseed.cfg:
# preseed.cfg
# Ubuntu Minimalsystem mit virtual Kernel
# by MisterBoo

# Lokale Einstellungen
d-i debian-installer/locale string de_DE
d-i keyboard-configuration/layoutcode string de
d-i localechooser/translation/warn-light boolean true

# Workaround 
d-i preseed/early_command string echo -e '#! /bin/sh\necho >/usr/lib/pre-pkgsel.d/20install-hwpackages' >/usr/lib/pre-pkgsel.d/19remove-install-hwpackages; chmod 755 /usr/lib/pre-pkgsel.d/19remove-install-hwpackages

### Mirror Einstellungen
d-i mirror/country string manual
d-i mirror/http/hostname string de.archive.ubuntu.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string

### Zeiteinstellungen
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Berlin
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string time.fu-berlin.de

### Partitionierung
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
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

### User Einstellungen
d-i passwd/root-login boolean false
d-i passwd/make-user boolean true
d-i passwd/user-fullname string Ubuntu User
d-i passwd/username string ubuntu
d-i passwd/user-password password ubuntu
d-i passwd/user-password-again password ubuntu
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false

### Softwareauswahl
d-i base-installer/kernel/image string linux-virtual
d-i base-installer/kernel/headers boolean false
tasksel tasksel/skip-tasks string standard 
tasksel tasksel/first multiselect none
d-i pkgsel/language-pack-patterns string
d-i pkgsel/language-packs multiselect none
d-i pkgsel/install-language-support boolean false
d-i pkgsel/include string openssh-server mc
d-i pkgsel/update-policy select none
d-i pkgsel/updatedb boolean false
d-i pkgsel/upgrade select none

# No boot splash screen.
d-i debian-installer/splash boolean false

### GRUB-Installation
d-i grub-installer/only_debian boolean true

### Abschluss der Installation
d-i finish-install/keep-consoles boolean true
d-i finish-install/reboot_in_progress note
d-i debian-installer/exit/poweroff boolean true
Somit hat man das Grundgerüst fertig für eine vollautomatische Linux Installation. Der Anwender muss nur doch eine 12Mb kleine OVA Appliance Datei importieren und starten, der Rest erfolgt ohne weitere Benutzereingaben. Das Ergebnis kann wie hier ein virtuelles Minimalsystem sein oder auch ein ausgewachsenes System mit Desktopumgebung sein. Die Voreinstellungsdatei für den Installation Prozess ist dann leicht für die jeweiligen Projekte anzupassen.

Tags:,