Ein Notfallsystem auf einem USB-Stick installieren
Review: Dieser Artikel ist für das Review freigegeben.
|
Einleitung
Bei Problemen mit einem Computer ist es oft hilfreich ein von einem externen Datenträger startbares System zur Hand zu haben, das einem vielleicht auch etwas vertrauter ist als ein x-beliebiges Live-System, das man sonst wahrscheinlich zu Hilfe nehmen würde.In diesem Artikel wird beispielhaft und Schritt für Schritt die Installation von Debian GNU/Linux 9 (stretch - zum Zeitpunkt der Entstehung dieses Artikels noch testing) mit debootstrap auf einen USB-Stick (oder auch auf eine externe Festplatte oder SSD) beschrieben, sodass sich das System auf den meisten üblichen PCs starten lässt.
Vorbereitung
Zur Erstellung des USB-Sticks benötigt man ein lauffähiges Debian mit Internetzugang (zum Zugriff auf Paketrepositories) auf dem
- gdisk,
- btrfs-progs bzw. vor Debian 9 (stretch) btrfs-tools und
- debootstrap
installiert sein müssen.
Installation
USB-Stick vorbereiten
USB-Stick partitionieren
Im Beispiel handelt es sich um einem USB-Stick mit ~32 GB, der nach dem Anstecken als »/dev/sdz« erscheint.
Warnung: Es ist notwendig statt dem hier verwendeten »/dev/sdz« die richtige Gerätedatei anzugeben. Die lässt sich zB in den letzten Zeilen der Ausgabe von »dmesg« nach dem Anstecken des USB-Sticks ablesen. |
Warnung: Die bereits auf dem USB-Stick vorhandenen Daten gehen im Folgenden unwiederbringlich verloren! |
Nun wird der USB-Stick im GPT-Format mit drei Partitionen partitioniert und zwar
- einer großzügig bemessenen EFI System Partition, auf der schließlich die Dateien von dem Bootloader grub landen werden,
- einer kleinen BIOS Boot Partition für Computer, die noch nicht über ein (U)EFI verfügen
- der Partition für die eigentliche Installation.
Nicht angelegt wird eine Swap-Partition - auf einem schlanken Rettungssystem kommt man normalerweise leicht ohne Auslagerungsspeicher aus und die niedrige Geschwindigkeit von USB-Sticks würde den Nutzen ohnehin sehr stark einschränken. Partitioniert wird mit gdisk, das mit der Gerätedatei des kompletten USB-Sticks als Option gestartet wird (und nicht etwa der Gerätedatei einer der möglicherweise bereits vorhandenen Partitionen), also in diesem Beispiel »/dev/sdz« und nicht »/dev/sdz1«.
In gdisk kann man dann mit o mit einer frisch angelegten, leeren Partitionstabelle beginnen und nacheinander die Partition mit n anlegen. Dabei werden
- der Startsektor, hier kann man jedes Mal den vorgeschlagenen Wert übernehmen,
- der Endsektor, hier gibt man einfach die gewünschte Größe mit einem + davor an und
- der Partitionstyp
abgefragt. Zusätzlich kann den Partitionen nach dem Anlegen mit c noch Namen geben. Im Beispiel werden folgende Werte verwendet
Partition | Zweck | Größe | Partitionstyp | Name |
---|---|---|---|---|
»/dev/sdz1« | EFI System Partition | +2G | ef00 | EFI-RESCUE |
»/dev/sdz2« | BIOS Boot Partition | +100M | ef02 | BIOSBOOT.RESCUE |
»/dev/sdz3« | Partition für das System | Vorgabe (gesamter noch verfügbarer Speicherplatz, mindestens ~4 GB) | 8300 | BTRFS.RESCUE |
Der komplette Ablauf in gdisk sieht dann etwa so aus
root@debian:~# gdisk /dev/sdz
GPT fdisk (gdisk) version 1.0.1 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): y Command (? for help): n Partition number (1-128, default 1): First sector (34-60555230, default = 2048) or {+-}size{KMGTP}: Last sector (2048-60555230, default = 60555230) or {+-}size{KMGTP}: +2G Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): ef00 Changed type of partition to 'EFI System' Command (? for help): c Using 1 Enter name: EFI-RESCUE Command (? for help): n Partition number (2-128, default 2): First sector (34-60555230, default = 4196352) or {+-}size{KMGTP}: Last sector (4196352-60555230, default = 60555230) or {+-}size{KMGTP}: +100M Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): ef02 Changed type of partition to 'BIOS boot partition' Command (? for help): n Partition number (3-128, default 3): First sector (34-60555230, default = 4401152) or {+-}size{KMGTP}: Last sector (4401152-60555230, default = 60555230) or {+-}size{KMGTP}: Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem' Command (? for help): c Partition number (1-3): 2 Enter name: BIOSBOOT.RESCUE Command (? for help): c Partition number (1-3): 3 Enter name: BTRFS.RESCUE Command (? for help): p Disk /dev/sdz: 60555264 sectors, 28.9 GiB Logical sector size: 512 bytes Disk identifier (GUID): B6B427CF-881B-4883-8B4A-7C3E3EEC7C76 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 60555230 Partitions will be aligned on 2048-sector boundaries Total free space is 2014 sectors (1007.0 KiB) Number Start (sector) End (sector) Size Code Name 1 2048 4196351 2.0 GiB EF00 EFI.RESCUE 2 4196352 4401151 100.0 MiB EF02 BIOSBOOT.RESCUE 3 4401152 60555230 26.8 GiB 8300 BTRFS.RESCUE Command (? for help): wq Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/sdz. The operation has completed successfully.
Partitionen formatieren
Die frisch angelegten Partitionen werden nun formatiert, wobei den Dateisystemen der gleiche Name (Dateisystemlabel) verpasst wird wie im vorigen Schritt der Partition selbst
- die EFI System Partition mit FAT und dem Dateisystemlabel EFI-RESCUE
- die BIOS Boot Partition wird nicht formatiert
- die Partition für das eigentliche System wird im Beispiel schließlich mit BTRFS formatiert und BTRFS.RESCUE benannt.
Im Gegensatz zu den Namen für die Partitionen, die nur der Übersicht dienen, sind die Namen der Dateisysteme, die Dateisystemlabels wichtig, weil sie später noch eine Rolle spielen werden.
Selbstverständlich können auch andere unter GNU/Linux übliche Dateisysteme wie ext4 oder xfs verwendet werden.
Die entsprechenden Befehle lauten
root@debian:~# mkfs.vfat -n EFI-RESCUE /dev/sdz1
root@debian:~# mkfs.btrfs -L BTRFS.RESCUE /dev/sdz3
Als Mountpoint für das Dateisystem wird noch ein Verzeichnis »/mnt/tmp« angelegt
root@debian:~# mkdir /mnt/tmp
Im Falle von BTRFS ist es zwar nicht notwendig, aber ratsam noch ein eigenes Subvolume, im Folgenden mit dem Namen »rescue«, für das zu installierende Rettungssystem anzulegen. kommt ein anderes Dateisystem zum Einsatz kann dieser Schritt übersprungen werden.
root@debian:~# mount /dev/sdz3 /mnt/tmp/
root@debian:~# btrfs subvolume create /mnt/tmp/rescue
root@debian:~# umount /mnt/tmp
Installation mit debootstrap
Als erstes wird das Dateisytem mit der Option noatime gemountet. Die anderen beiden Optionen compress zur Aktivierung der Kompression und subvol=rescue zur Angabe des Subvolumes müssen bei anderen Dateisystemen als btrfs weggelassen werden.
root@debian:~# mount -o subvol=rescue,compress,noatime /dev/sdz3 /mnt/tmp
Es folgt der Aufruf von debootstrap, der ein minimales, aber noch nicht bootfähiges System installiert
root@debian:~# debootstrap --arch=amd64 stretch /mnt/tmp
Konfiguration und Installation weiterer Pakete
Konfiguration
Im nun installierten System fehlen noch Konfigurationsdateien und Pakete und andere Konfigurationsdateien müssen erst noch angepasst werden.
Die »/mnt/tmp/etc/apt/sources.list« soll in diesem Beispiel so aussehen
deb http://ftp.de.debian.org/debian/ stretch main contrib non-free #deb-src http://ftp.de.debian.org/debian/ stretch main contrib non-free deb http://security.debian.org/ stretch/updates main contrib non-free #deb-src http://security.debian.org/ stretch/updates main contrib non-free deb http://ftp.de.debian.org/debian/ stretch-proposed-updates main contrib non-free #deb-src http://ftp.de.debian.org/debian/ stretch-proposed-updates main contrib non-free deb http://ftp.de.debian.org/debian/ stretch-updates main contrib non-free #deb-src http://ftp.de.debian.org/debian/ stretch-updates main contrib non-free deb http://ftp.de.debian.org/debian/ stretch-backports main contrib non-free
Mit einer »/mnt/tmp/etc/apt/apt.conf.d/99local« wird sichergestellt, dass das System schlank bleibt und keine lediglich vorgeschlagenen oder empfohlenen Pakete installiert werden:
APT::Install-Recommends "0"; APT::Install-Suggests "0";
Die »/mnt/tmp/etc/kernel-img.conf« sorgt dafür, dass in »/boot« symbolische Links zum jeweils aktuellen und vorigen Kernel erzeugt werden, was dann bei der Installation des Bootloaders ausgenutzt wird:
do_symlinks = yes link_in_boot = yes
Es fehlt noch die passende »/mnt/tmp/etc/fstab«, die für diesen Zweck mit einer Zeile auskommt
LABEL=BTRFS.RESCUE / btrfs compress,noatime,subvol=rescue 0 0
chroot
Für die Installation weiterer Pakete und zur Installation des Bootloaders wird das Rettungssystem als chroot-Umgebung vorbereitet.
Damit der Netzwerkzugang, genauer die Namensauflösung funktioniert wird die »resolv.conf« aus dem laufenden System übernommen
root@debian:~# cat /etc/resolv.conf > /mnt/tmp/etc/resolv.conf
Außerdem müssen die virtuellen Dateisysteme inklusive »/dev« übernommen werden
root@debian:~# mount -o bind /sys /mnt/tmp/sys
root@debian:~# mount -o bind /dev /mnt/tmp/dev
root@debian:~# mount -o bind /proc /mnt/tmp/proc
Auf im EFI-Modus gestarteten (U)EFI-Systemen ist es vor dem Aufruf von chroot ratsam sicherzustellen, dass man später beim Einrichten des Bootloaders des Rettungssystem nichts an den EFI-Variablen, besonders an den Booteinträgen verändert. Dazu unmountet man das virtuelle Dateisystem, das die EFI-Variablen bereitstellt und entlädt zusätzlich die verantwortlichen Kernelmodule
root@debian:~# umount /sys/firmware/efi/efivars
root@debian:~# rmmod efivarfs
root@debian:~# rmmod efi_pstore
root@debian:~# rmmod efivars
Schließlich wechselt man mit chroot in das Rettungssystem
root@debian:~# chroot /mnt/tmp
weitere Pakete und deren Konfiguration
Nun werden in der chroot-Umgebung des Rettungssystems einiger sehr praktische Werkzeuge und auch endlich ein Kernel installiert
root@debian:~# apt install apt-rdepends apt-show-versions arping arp-scan bash-completion bash-doc bc btrfs-progs busybox bzip2 console-setup cryptsetup debootstrap debsums dosfstools efibootmgr eject ethtool file gddrescue gdisk groff hashdeep htop iftop info iotop keyboard-configuration kpartx less libnss-myhostname libpam-systemd linux-image-amd64 locales lsof manpages md5deep memtester mlocate ncompress netcat-traditional net-tools nfacct nmap openssh-client pciutils rfkill rsync rzip screen sharutils strace tcpdump testdisk traceroute tree units unzip usbutils wpasupplicant xfsprogs xz-utils zip zstd
Desweiteren ist das der richtige Zeitpunkt um eventuell notwendige Firmwarepakete und ähnliches zu installieren. In diesem Beispiel kommt außerdem der network-manager dazu, damit man unter dem Rettungssystem möglichst bequem eine Netzwerkverbindung herstellen kann.
root@debian:~# apt install firmware-iwlwifi intel-microcode network-manager
Man könnte auch eine grafische Oberfläche installieren, aber zuverlässiger ist ein Rettungssystem, das nur im Textmodus bootet. Dafür kann rsyslog deinstalliert werden
root@debian:~# apt purge rsyslogd
der Bootloader
Damit das Rettungssystem auf möglichst allen PCs booten kann, werden nacheinander
- grub-pc für das Booten auf PCs mit BIOS oder mit UEFI im Legacy-Modus
- grub-efi-amd64 für PCs mit einem 64-bittigen (U)EFI
- grub-efi-ia32 für PCs mit einem 32-bittigen (U)EFI (vor allem frühe Computer von Apple mit Intel CPU und einige Systeme mit Intel Atom)
installiert.
Noch immer in der chroot-Umgebung des Rettungssystems wird nun also ein Verzeichnis zum Mounten der EFI System Partition angelegt, selbige dort gemountet und es werden noch ein paar weitere notwendige Verzeichinsse angelegt
root@debian:~# mkdir /boot/efi
root@debian:~# mount /dev/sdz1 /boot/efi
root@debian:~# mkdir -p /boot/efi/EFI/boot
root@debian:~# mkdir /boot/efi/EFI/grub
Hinweis: Nicht vergessen, dass sich die Pfadangaben auf das chroot-System, also das Rettungssystem beziehen. Außerhalb der chroot Umgebung wäre als obeispielsweise »/boot/efi/EFI« in »/mnt/tmp/boot/efi/EFI« zu finden |
Für alle drei grub-Varianten wird nun eine einzige Konfigurationsdatei und zwar die »/boot/efi/EFI/grub/grub.cfg« mit folgendem Inhalt angelegt
insmod part_gpt insmod btrfs insmod gzio insmod gettext insmod all_video insmod gfxterm set menu_color_normal=white/black set menu_color_highlight=black/light-gray set default=0 menuentry 'Debian GNU/Linux Rettungssystem' { search --no-floppy --label --set=root BTRFS.RESCUE linux /rescue/boot/vmlinuz root=LABEL=BTRFS.RESCUE rootflags=subvol=rescue ro quiet initrd /rescue/boot/initrd.img }
Als letztes werden für jeden der drei Grub-Varianten einzeln und nacheinander das grub-Paket installiert, dann grub selbst installiert und dann das jeweilige Paket wieder deinstalliert. Anders geht es nicht, weil die verschiedenen grub-Pakete in Konflikt miteinander stehen, es hat aber außerdem den Vorteil, dass man sich später, zB bei einem Update des Rettungssystems, den Bootloader nicht irrtümlich überschreiben lassen kann.
Den Anfang macht der heikelste Bootloader grub-pc. Man installiert ihn mit
root@debian:~# DEBIAN_PRIORITY=low apt install grub-pc
muss aber aufpassen, dass im darauf folgenden Konfigurationsdialog alle Geräte abgewählt sind und man muss daraufhin noch einmal bestätigen, dass grub tatsächlich auf kein Gerät installiert werden soll. Die restlichen Optionen nach denen gefragt wird spielen weiter keine Rolle und die Vorschläge können einfach bestätigt werden. Erst nach der Installation des Pakets erfolgt die eigentliche Installation von grub(-pc):
root@debian:~# grub-install --boot-directory=/boot/efi/EFI /dev/sdz
Jetzt wird das Paket grub-pc also wieder deinstalliert
root@debian:~# apt purge grub-pc grub-pc-bin
und das nächste grub-Paket - grub-efi-ia32 für Systeme mit 32-bittigem (U)EFI - wird installiert
root@debian:~# apt install grub-efi-ia32
Wieder folgt die eigentliche grub-Installation — wobei die abgefragten Konfigurationsoptionen wieder keine Rolle spielen und die Vorgaben übernommen werden können
root@debian:~# grub-install --boot-directory=/boot/efi/EFI --efi-directory=/boot/efi --bootloader-id=grub --force-extra-removable --no-nvram --target=i386-efi
und die Deinstallation
root@debian:~# apt purge grub-efi-ia32 grub-efi-ia32-bin
Schließlich folgt das dritte und letzte grub-Paket grub-efi-amd64 für 64-bittige (U)EFIs
root@debian:~# apt install grub-efi-amd64
und wieder spielen die Konfigurationsoptionen keine Rolle. Wieder wird dieser grub installiert
root@debian:~# grub-install --boot-directory=/boot/efi/EFI --efi-directory=/boot/efi --bootloader-id=grub --force-extra-removable --no-nvram --target=x86_64-efi
und hinterher das grub-Paket deinstalliert:
root@debian:~# apt purge grub-efi-amd64 grub-efi-amd64-bin
root-Passwort und Benutzer
Nun müssen wir – ebenfalls noch in der chroot-Umgebung des Rettungssystems – Benutzer einrichten und ein root-Passwort vergeben. Zuerst das Passwort für root, nach der Eingabe von
root@debian:~# passwd
gibt man das gewünschte Passwort ein und bestätigt es auf Nachfrage noch einmal.
Weitere Benutzer lassen sich mit
root@debian:~# adduser BENUTZERNAME
hinzufügen. Danach fragt der Befehl noch nach einigen Informationen zu dem Benutzer, wichtig und interessant ist dabei vor allem das Passwort nach dem am Ende noch gefragt wird.
Ende
Das Rettungssystem sollte jetzt installiert und bootfähig sein. Die chroot-Umgebung können wir einfach mit
root@debian:~# exit
verlassen und ich gebe dann gerne noch den Befehl
root@debian:~# sync
um alle Schreibpuffer zu leeren.
Unabhängig davon sollten, die im Laufe dieser Anleitung gemounteten Dateisyteme auch wieder aushängen, bevor wir den USB-Stick abziehen. Die einfachste Möglichkeit ist es allerdings einfach den Computer mit noch angestecktem USB-Stick herunterzufahren und den USB-Stick erst danach abzuziehen.