Arch Linux: Automatischer Start in den Installer

Ich bin aktuell dabei ein Playbook für Ansible zu schreiben, dass mir einen Arch Server ohne Nutzerinteraktion installiert. Eine große Baustelle war der automatische start in den Installer. Nach dem Booten vom USB Stick oder CD erscheint folgendes Menü:

Und da bleibt es leider hängen. Für eine vollautomatische Installation wäre es toll wenn direkt der Installer startet. Arch bietet neben der ISO noch weitere Möglichkeiten: Ein Netinstall Image oder ein PXE. Via Netinstall startet zwar direkt der Installer, jedoch muss manuell der zu verwendende Pacman Mirror ausgewählt werden. Es gibt keinen Parameter, mit dem man das machen könnte. Damit ist diese Variante unbrauchbar. Ein PXE Setup ist zu aufwendig.

Die Lösung war: Die ISO so aufbohren, damit direkt der Installer startet. Zudem sollte das Live System direkt mit einer festen IP Adresse starten und SSH Keys besitzen, damit er direkt per Ansible provisioniert werden kann. Und wie ich das gemacht habe möchte ich euch nun zeigen.

Hinweis: Ich habe das alles auf einer Arch Büchse gemacht. Folgende Pakete braucht man dafür: squashfs-tools arch-install-scripts cdrtools

Download des ISO Images

Downloade das offizielle ISO Image. Entweder direkt von der Arch Homepage oder hier: http://mirror.rackspace.com/archlinux/iso/latest/

Zum Zeitpunkt dieses Artikels hatte die ISO folgenden Namen: archlinux-2017.06.01-x86_64.iso

Das tolle an Arch: Die Distribution basiert auf dem „Rolling Release“ Verfahren. Dadurch muss man die ganzen Schritte nur ein mal machen und muss nicht bei jedem Release neu durchgeführt werden.

Nach dem Download kann das Image also CD ins Filesystem gemounted werden:

:~$ mkdir /tmp/arch
:~$ mount archlinux-2017.06.01-x86_64.iso /tmp/arch

Da wir hier sozusagen eine Virtuelle CD eingelegt habe ist diese nicht schreibbar. Deswegen kopieren wir den Inhalt nun in ein Verzeichnis in dem wir arbeiten können:

:~$ cp -r /tmp/arch ~/arch
:~$ cd arch
:~$ ls
arch EFI isolinux loader

Nun kommt die eigentliche Arbeit.

Bearbeiten des root Filesystems

Das Root Filesystem der Live CD befindet sich unter arch/x86_64/airootfs.sfs und ist vom Typ SquashFS. Dieses müssen wir nun erst entpacken:

:~$ unsquashfs arch/x86_64/airootfs.sfs

Nun existiert im Ordner squashfs-root die entpackte Root Partition. Mit Hilfe von arch-chroot chrooten wir rein:

:~$ arch-chroot squashfs-root /bin/bash

Für Ansible brauche ich root-Zugriff. Dazu muss ich erstmal ein Passwort setzen.

:~$ passwd

Damit eine feste IP Zugeordnet werden kann brauchen wir zwei Services: sshd und systemd-networkd:

:~$ systemctl enable systemd-networkd sshd

Damit sshd beim starten wartet bis das Netzwerk Interface up ist müssen wir noch eine Kleinigkeit ändern. Öffne die Datei /etc/systemd/system/multi-user.target.wants/sshd.service und ändere die Zeile „After=network.target“ ab zu „After=network-online.target“.

Für sshd müssen noch HostKeys erzeugt werden:

:~$ ssh-keygen -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
:~$ ssh-keygen -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
:~$ ssh-keygen -N "" -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
:~$ ssh-keygen -N "" -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

Für die feste IP legen wir ein entsprechendes network-File an:

:~$ vim /etc/systemd/network/wan.network

In meiner Datei steht zum Beispiel so etwas drinnen:

[Match]
Name=ens3

[Network]
DNS=192.168.3.2
Address=192.168.2.10/30
Gateway=192.168.2.9

Damit beim starten keine DHCP Anfrage gesendet wird war ich der Meinung, dass ein Service File für dhcpcd existieren muss. Das habe ich aber nirgendwo gefunden :-) Deswegen habe ich das Problem anders gelöst:

:~$ rm /usr/bin/dhcpcd

Nun geht man aus der chroot Umgebung raus mit Hilfe von „exit“. Die veränderte Root Partition müssen wir nun in die alte Datei packen:

:~$ rm arch/x86_64/airootfs.sfs
:~$ mksquashfs squashfs-root arch/x86_64/airootfs.sfs
:~$ rm -r squashfs-root

Nun muss noch das Boot Menu umgeschrieben werden. Öffne dazu die Datei arch/boot/syslinux/archiso.cfg und füge folgenden Inhalt ein:

DEFAULT select
PROMPT 0
TIMEOUT 50
DEFAULT arch64

LABEL arch64
TEXT HELP
Boot the Arch Linux (x86_64) live medium.
It allows you to install Arch Linux or perform system maintenance.
ENDTEXT
MENU LABEL Boot Arch Linux (x86_64)
LINUX boot/x86_64/vmlinuz
INITRD boot/intel_ucode.img,boot/x86_64/archiso.img
APPEND archisobasedir=arch archisolabel=ARCH_201706

Hier müssen wir aber noch etwas umändert. Das orange Hinterlegte Feld muss je nach verwendeter ISO abgeändert werden. Wenn die originale ISO Datei „archlinux-2017.06.01-x86_64.iso“ heißt, dann steht hier 201706.
Würde die originale ISO Datei „archlinux-2017.07.01-x86_64.iso“ heißen, dann müsste da 201707 stehen.

Damit wäre das ISO entsprechend abgeändert.

Das neue ISO Image packen

Damit wir nun unsere eigenes ISO Image verwenden können muss es noch neu gepackt werden:

genisoimage -l -r -J -V "ARCH_201706" -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o /tmp/arch-autoboot.iso ./

Auch hier wieder: Das Disklabel muss angepasst werden. Nachdem das passiert ist befindet sich unter /tmp/arch-autoboot.iso die Datei, die wir nun zum Installieren verwenden können. Es folgt noch ein kleiner Cleanup:

:~$ cd
:~$ umount /tmp/arch
:~$ rm -rf /root/arch

Quellen / Further Reading

,

Written by  veloc1ty

Fachinformatiker, Alleswisser, Politikinteressiert und des öfteren immer mehr schockiert von der Welt. Eigentlich bin ich ausgebildeter Anwendungsentwickler, aber mein Blog dreht sich hauptsächlich um die Systemadministration. Dabei versuche ich so neutral wie möglich zu sein und bin um eine gute Artikelqualität bemüht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.