QVINTVS · SCRIBET

Debian Live-USB-Stick

Ein paar Hinweise zu der Frage, wie man einen voll funktionstüchtigen Live-USB-Stick für Debian erstellt.

Von Zeit zu Zeit kommt es vor, dass man bei Bekannten Nothilfe am PC leisten muss. Dazu gibt es keine bessere Möglichkeit, als einen USB-Stick zu benutzen, der selbst ein voll funktionsfähiges System ist (also nicht nur so ein Ausprobiersystem wie die Live-Ubuntus). Bisher habe ich dafür ArchLinux benutzt, aber da das System auf dem USB-Stick fast nie aktualisiert wird und ArchLinux sehr empfindlich reagiert, wenn man nach über einem Jahr mal ein pacman -Syu anstößt, habe ich mich bis auf weiteres entschieden, ein Debian auf dem Stick zu installieren, das damit erheblich weniger Probleme haben sollte. Für diese Anleitung habe ich das fast fertige Debian Jessie benutzt.

Wie erwähnt besteht die Aufgabe darin, ein voll funktionstüchtiges Debian-System aufzusetzen, also kein Netinstall-Medium, von dem aus man installiert. Eine Möglichkeit bestünde darin, wie bei jedem System eine normale Installation mithilfe des Debian-Installers durchzuführen und dort als Zielfestplatte den USB-Stick anzugeben. Das ist mir aber zu umständlich. Es gibt auch eine Möglichkeit, von einem laufenden Linux-System aus ein Debian-System in einem beliebigen Verzeichnis zu installieren. Dies lässt sich mit dem Programm debootstrap(1) bewerkstelligen, welches sich selbst unter ArchLinux im AUR befindet.

Bevor debootstrap(1) jedoch eingesetzt werden kann, muss die Partitionierung durchgeführt werden. Da ein reiner Live-USB-Stick irgendwie auch unpraktisch ist, hätte ich gern wenigstens eine Daten-Partition mit FAT32 formatiert, welche dann auch von etwaigen Windows-Systemen erkannt wird. Windows hat erfahrungsgemäß Probleme, wenn die FAT32-Partition nicht die erste Partition auf dem USB-Stick ist, sodass alle weiteren Partitionen danach folgen müssen. Zwecks Linux-Datenaustausches kann man auch noch eine ext4-Partition anlegen, sodass man auf insgesamt drei Partitionen kommt:

  1. FAT32-Partition für den Windows-Datentausch
  2. ext4-Partiton für den Linux-Datentausch
  3. ext4-Partition für das Live-Debian.

Aus naheliegenden Gründen sollte die dritte Partition die größte sein. Ich habe einen 4GiB-Stick zur Verfügung, bei dem ich mich für eine Aufteilung von 512MiB/512MiB/Rest entschieden habe. Dafür kann man sein bevorzugtes Partitionierungsprogramm benutzen, ich habe fdisk(1) genommen. Als Partitionstabelle empfiehlt sich noch eine alte MBR-Tabelle und nicht GPT, weil viele Systeme, an die man so gerufen wird, oft noch kein BIOS haben, das mit GPT umgehen kann, aber fast alle GPT-fähigen BIOS mit MBR umgehen können. Damit scheidet in der Folge auch das Booting via EFI aus, vielmehr ist ein klassischer MBR-Boot erforderlich.

Sind Partitionstabelle und Partitionen angelegt, müssen sie mit den Dateisystemen formatiert werden, die ich oben angegeben habe. Schließlich — wichtig! — muss noch die Boot-Flagge auf der dritten Partition gesetzt werden, damit der spätere Bootloader auch weiß, wo er seine Konfiguration suchen muss. Auch das lässt sich mit dem Partitionierungsprogramm der Wahl erledigen (bei fdisk(1) über den a-Befehl).

Dann kann mit debootstrap(1) das minimale Debian-System installiert werden (/dev/sdb ist der USB-Stick):

# mount /dev/sdb3 /mnt
# debootstrap jessie /mnt

Nichts leichter als das. Allerdings ist das installierte System derartig minimal, das es vor dem ersten Start noch ein paar Anpassungen benötigt. Zunächst muss der Hostname in der Datei /mnt/etc/hostname festgelegt werden, danach muss ein Linux-Kernel installiert werden. Da es sich um einen Systemwartungs-Stick handelt, installiere ich auch gleich noch Memtest dazu. Beides erfolgt durch chrooting:

# chroot /mnt /bin/bash
# apt-get update
# apt-get upgrade
# apt-get install linux-image-3.16.0-4-amd64 \
linux-headers-3.16.0-4-amd4 memtest86+

Außerdem sollte ein brauchbarer Editor installiert werden:

# apt-get install emacs-nox

Nicht vergessen, ein root-Passwort festzulegen (am besten etwas einfaches, es handelt sich ja um kein System mit vertraulichen Daten — außerdem steht zunächst nur eine US-Tastatur zur Verfügung, wenn erstmalig gebootet wird):

# passwd

Wie ich erst habe herausfinden müssen, fehlt dem installierten Debian auch noch das Paket firmware-linux-nonfree, welches aber für die Funktion KMS (Kernel Mode Setting) unerlässlich ist. Ohne KMS aber wird die Virtuelle Konsole stets auf unbedienbare 80x25 Zeichen skaliert. Da debootstrap(1) aber das erforderliche Repository non-free nicht einbindet, muss die /mnt/etc/apt/sources.list noch angepasst werden, sodass sie schließlich wenigstens die folgende Zeile enthält:

deb http://ftp.de.debian.org/debian jessie main contrib non-free

Dann kann das Paket installiert werden:

# apt-get update
# apt-get install firmware-linux-nonfree
# exit

Damit ist das System einsatzbereit, allerdings fehlt noch ein Bootloader. Ich habe mich für syslinux entschieden, der angenehm einfach zu konfigurieren ist. Auf dem USB-Stick selbst muss er nur zu Bootzwecken installiert sein, sodass auf eine Installation der syslinux-Pakete in Debian verzichtet werden kann. Vielmehr werden die Installationsskripte nur auf dem Hostsystem installiert und dann auf den USB-Stick angewandt.

# pacman -S syslinux
# mkdir /mnt/boot/syslinux
# cp -rv /usr/lib/syslinux/bios/*.c32 /mnt/boot/syslinux/
# extlinux --install /mnt/boot/syslinux
# dd bs=440 count=1 if=/usr/lib/syslinux/bios/mbr.bin of=/dev/sdb

Schließlich muss noch die Konfigurationsdatei /mnt/boot/syslinux/syslinux.cfg angelegt werden. Debian legt praktischerweise Symlinks zum jeweils aktuellen Kernel und Initramfs im Wurzelverzeichnis an, sodass man diese direkt verwenden kann und nicht ständig nach jedem Kernel-Update die Konfiguration aktualisieren muss. Als root-Parameter für den Linux-Kernel ist dringend anzuraten, die UUID der Live-Partition zu benutzen, da in anderen Systemen die Festplattenreihenfolge mit großer Wahrscheinlichkeit anders ist als auf dem aktuellen System. Da Syslinux nur auf der Partition arbeiten kann, auf der sich die syslinux.cfg (= die Partition mit der Boot-Markierung) befindet, entfällt die Unsicherheit, wie dem Bootloader die korrekte Partition mitzuteilen ist, wie es etwa bei GRUB der Fall wäre.

UI menu.c32
PROMPT 0

MENU TITLE USB Boot Menu
TIMEOUT 100
DEFAULT debian

LABEL debian
	MENU LABEL Debian Jessie
	LINUX ../../vmlinuz
	APPEND root=/dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro init=/lib/systemd/systemd
	initrd ../../initrd.img

LABEL memtest
	MENU LABEL Memtest86+
	LINUX ../memtest86+.bin

Der Stick ist jetzt bootfähig. Also:

# umount /mnt
# systemctl reboot

Beim Start durch die jeweilige Bootmenu-Taste dafür sorgen, dass vom USB-Stick und nicht von der eingebauten Platte gebootet wird, dann sollte auch schon Syslinux erscheinen. Dort das Debian-System starten und nach einiger Zeit sollte man dann mit einem Login-Prompt begrüßt werden. Dort als root anmelden.

Man wird feststellen, dass sehr zum Leidwesen aller Nichtamerikaner eine US-Tastatur eingestellt und ein ausschließlich englischer Locale verfügbar ist. Beides kann man durch die Installation entsprechender Software beheben:

# dhclient -v eth0    # Internetverbindung herstellen
# apt-get install locales tzdata keyboard-configuration \
console-common console-data console-setup
# dpkg-reconfigure locales
# dpkg-reconfigure tzdata
# dpkg-reconfigure keyboard-configuration

Insbesondere müssen wie gezeigt die console-Pakete installiert werden, da ansonsten die für die Konfiguration eines anderen Tastaturlayouts erforderlichen Keymaps fehlen (was in der Debian-Dokumentation nicht erwähnt wird und mir einiges Kopfzerbrechen bereitet hat, weil dpkg-reconfigure keyboard-configuration auch keinen Fehler ausgibt).

Fertig. Spätestens nach einem Neustart sollten die Locale-Einstellungen korrekt sein. Von hier aus kann man dann alle Software installieren, die man für erforderlich hält.

Valete.