Ein Notfallsystem auf einem USB-Stick installieren

Aus DebianforumWiki

Wechseln zu: Navigation, Suche
WikiInstallation von Debian ‹ Ein Notfallsystem auf einem USB-Stick installieren

Diskussion 164506

Review.png Review: Dieser Artikel ist für das Review freigegeben.


Inhaltsverzeichnis

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

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.png 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.png 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 Swao-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 Debianpackage.png 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 Debianpackage.png 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 Debianpackage.png 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/sdz1

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.

{{RootShell|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

{{RootShell|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

Desweiteren ist das der richtige Zeitpunkt um eventuell notwendige Firmwarepakete und ähnliches zu installieren. In diesem Beispiel kommt außerdem der Debianpackage.png 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

  • Debianpackage.png grub-pc für das Booten auf PCs mit BIOS oder mit UEFI im Legacy-Modus
  • Debianpackage.png grub-efi-amd64 für PCs mit einem 64-bittigen (U)EFI
  • Debianpackage.png grub-eif-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.png 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 Debianpackage.png 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 Debianpackage.png grub-pc also wieder deinstalliert

root@debian:~# apt purge grub-pc grub-pc-bin

und das nächste grub-Paket - Debianpackage.png 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 Debianpackage.png 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

und hinterher das grub-Paket deinstalliert:

root@debian:~# apt purge grub-efi-amd64 grub-efi-amd64-bin
Meine Werkzeuge