UEFI + BIOS bootfähig Live Debian Stretch amd64 mit Persistenz

20

Alle Informationen, die ich derzeit zu diesem Thema finde, sind für meinen Geschmack unzureichend. Es ist entweder veraltet, irreführend oder sogar falsch, scheint übermäßig kompliziert zu sein oder diese spezielle Frage nicht zu behandeln.

Tore:

  • bootfähiges USB-Laufwerk (sowohl UEFI- als auch Legacy-BIOS unterstützt)
  • (basierend auf) Live-Debian 9 (Stretch)
  • Persistenz (standardmäßig und für UEFI- und Legacy-BIOS)
  • Standardmäßig deutsche Tastaturbelegung
  • Geeignet für die Fehlerbehebung anderer GNU / Linux-Systeme

Gründe dafür:

  • Das Einrichten des Tastaturlayouts bei jeder Verwendung ist ein echtes Problem
  • cryptsetup und efibootmgr fehlen in den Standard-Debian-Live-Images
  • gnome-terminal hat standardmäßig diesen nervigen weißen Hintergrund

Keine Lösungen:

  • (Neu-) Erstellung eines benutzerdefinierten Debian-Live-Images (es scheint mühsam, obwohl ich es noch nicht ausprobiert habe)
  • unetbootin (fragt nach einem unbekannten Passwort beim Start von debian stretch und ich denke, es unterstützt UEFI sowieso nicht)
  • Einige fremde automatisierte Prozesse, bei denen ich nicht sehe, was passiert

Debian Live- und Install-Images sind Isohybrid-Images und können bequem geschrieben werden, um Geräte mit zu blockieren dd. Und sie funktionieren auf solchen USB-Laufwerken, was sehr schön ist! Es gibt jedoch keine Persistenz und keine Möglichkeit, mit einem nicht-englischen Tastaturlayout zu beginnen, ohne die Grub- und Isolinux-Konfiguration zu bearbeiten, die im schreibgeschützten ISO9660-Dateisystem des Live-ISO-Images enthalten ist. Daher können diese Parameter auch nach dem Schreiben der Live-ISO auf ein USB-Laufwerk nicht geändert werden.

schlimmchen
quelle

Antworten:

30

Hier ist eine Möglichkeit, ein Debian-Live-USB-Laufwerk mit Persistenz zu erstellen. Damit können die fehlenden Pakete installiert werden, die von da an bei jedem Live-Boot unter Verwendung der Persistenz verfügbar sind. Da wir den Inhalt des Live-ISO-Image-Dateisystems auf einem schreibgeschützten Dateisystem neu erstellen, können wir die Bootloader-Konfigurationen ändern, um die Persistenz zu aktivieren und das Tastaturlayout beim Booten festzulegen.

Die hier beschriebenen Schritte wurden getestet, um auf Debian-Stretch und Buster zu arbeiten und ein Debian-Stretch-Livebild zu erstellen.

Es sind viele Schritte erforderlich, aber es scheint, dass diese Methode immer noch sehr effizient ist.

Haftungsausschluss: Sie verlieren die Daten auf dem Ziel-USB-Laufwerk. Wenn Sie die folgenden Befehle verwechseln, kann es sein, dass Sie danach sehr traurig sind. Ich bin nicht verantwortlich für Ihre Handlungen.

Sich glücklich fühlen

Wenn Sie sich heute besonders glücklich schätzen, können Sie ein Bash-Skript ausprobieren, das den Vorgang für Sie automatisiert. Geben Sie als ersten Parameter Ihren ISO-Image-Pfad und als zweiten den Namen des USB-Stick-Block-Geräts an. Beachten Sie, dass dieses Skript wahnsinnig gefährlich ist und Sie es nicht ausführen sollten, ohne es vorher gelesen und verstanden zu haben.

TL; DR

Holen Sie sich ein Debian-Live-ISO-Image und gehen Sie dann wie folgt vor:

umount /dev/sdX*
parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

cp -ar /tmp/live-iso/* /tmp/usb-live

echo "/ union" > /tmp/usb-persistence/persistence.conf

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

Im Detail und mit einiger Erklärung

Sie müssen die meisten der folgenden Befehle mit erhöhten Rechten ausführen, dh sudoauf den meisten GNU / Linux-Systemen.

Herunterladen

Laden Sie ein Debian-Live-ISO-Image mit dem Fenstermanager Ihrer Wahl herunter:

https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/

Das heruntergeladene ISO-Image wird einfach als "live.iso" bezeichnet.

Bestimmen Sie das Ziellaufwerk

Suchen Sie das Gerät, auf dem sich Ihr USB-Laufwerk befindet lsblk. Wir werden das nennen /dev/sdX.

Aushängen

Hängen Sie vorhandene Partitionen auf Ihrem Laufwerk mit aus umount /dev/sdX*

Erstellen Sie Partitionen

Wir benötigen eine EFI-Bootpartition, damit UEFI-PCs vom USB-Laufwerk booten können. Dann benötigen wir eine ausreichend große Partition, um den ursprünglichen Inhalt des ISO-Dateisystem-Images zu speichern. In dieser Partition muss das legacy_bootFlag gesetzt sein. Dann fügen wir die Persistenzpartition hinzu und belegen den gesamten verbleibenden Speicherplatz des USB-Laufwerks. Sie können dies mit jedem GPT-fähigen Partitionierungstool tun (beachten Sie das legacy_bootFlag). Hier ist ein Beispiel mit parted:

parted /dev/sdX --script mktable gpt
parted /dev/sdX --script mkpart EFI fat16 1MiB 10MiB
parted /dev/sdX --script mkpart live fat16 10MiB 3GiB
parted /dev/sdX --script mkpart persistence ext4 3GiB 100%
parted /dev/sdX --script set 1 msftdata on
parted /dev/sdX --script set 2 legacy_boot on
parted /dev/sdX --script set 2 msftdata on

Dadurch werden eine GPT-Partitionstabelle und eine MBR-Schutzpartitionstabelle erstellt.

Dateisysteme erstellen

Wir wollen FAT auf der EFI- und Live-Partition und wir wollen ext4auf der Persistenz-Partition und wir benötigen das Label, persistencedamit die Persistenz-Funktion funktioniert.

mkfs.vfat -n EFI /dev/sdX1
mkfs.vfat -n LIVE /dev/sdX2
mkfs.ext4 -F -L persistence /dev/sdX3

Bereitstellen der Ressourcen

Wir müssen die Quell-ISO- und Zielpartitionen an temporären Einhängepunkten einhängen.

mkdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
mount /dev/sdX1 /tmp/usb-efi
mount /dev/sdX2 /tmp/usb-live
mount /dev/sdX3 /tmp/usb-persistence
mount -oro live.iso /tmp/live-iso

Installieren Sie das Live-System

Kopieren Sie den Inhalt des Live-ISO-Dateisystems auf die LIVE-Partition.

cp -ar /tmp/live-iso/* /tmp/usb-live

persistence.conf

Bereiten Sie das Persistenz-Dateisystem mit der erforderlichen Konfigurationsdatei vor. Die Persistenzfunktion funktioniert ohne diese Datei nicht.

echo "/ union" > /tmp/usb-persistence/persistence.conf

Grub für UEFI-Unterstützung

Installieren Sie grub2 für die UEFI-Boot-Unterstützung (dies erfordert das grub-efi-amd64-binPaket unter Debian). Wir erzwingen grub-install, UEFI Secure Boot nicht zu verwenden, was anscheinend mit dieser --removableOption nicht funktioniert .

grub-install --no-uefi-secure-boot --removable --target=x86_64-efi --boot-directory=/tmp/usb-live/boot/ --efi-directory=/tmp/usb-efi /dev/sdX

Syslinux für Legacy-BIOS-Unterstützung

Installieren Sie den Syslinux- gptmbr.binBootloader auf dem Laufwerk (laden Sie Syslinux herunter oder installieren Sie das Paket syslinux-common). Dann installieren Sie Syslinux auf der Live-Partition.

dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of=/dev/sdX
syslinux --install /dev/sdX2

Isolinux-Fixup

Verwenden Sie die isolinux-Konfiguration der ursprünglichen Live-ISO erneut, um mit syslinux zu arbeiten.

mv /tmp/usb-live/isolinux /tmp/usb-live/syslinux
mv /tmp/usb-live/syslinux/isolinux.bin /tmp/usb-live/syslinux/syslinux.bin
mv /tmp/usb-live/syslinux/isolinux.cfg /tmp/usb-live/syslinux/syslinux.cfg

Kernel-Parameter

Nachdem wir die Live-Systemdateien in ein tatsächliches Lese- / Schreib-Dateisystem kopiert haben, können wir die Konfiguration von grub und syslinux bearbeiten.

Fügen Sie den Persistenzkernparameter zu menu.cfgund hinzu grub.cfg. Fügen Sie in beiden Dateien das Schlüsselwort persistenceam Ende der jeweiligen ersten Zeile mit boot=liveein.

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 persistence/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

Legen Sie den Kernel-Parameter für das Tastaturlayout fest. Fügen Sie in beiden Dateien die Schlüsselwörter am Ende der jeweiligen ersten Zeile mit boot=liveein.

sed --in-place '0,/boot=live/{s/\(boot=live .*\)$/\1 keyboard-layouts=de locales=en_US.UTF-8,de_DE.UTF-8/}' /tmp/usb-live/boot/grub/grub.cfg /tmp/usb-live/syslinux/menu.cfg

Grub Splash

Korrigieren Sie das Grub-Splash-Image (optional; wir haben es in ein anderes Verzeichnis verschoben).

sed --in-place 's#isolinux/splash#syslinux/splash#' /tmp/usb-live/boot/grub/grub.cfg

Aushängen und Aufräumen

umount /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso
rmdir /tmp/usb-efi /tmp/usb-live /tmp/usb-persistence /tmp/live-iso

Warum sollte dies für UEFI und BIOS funktionieren

Beim Start im UEFI-Modus scannt der PC die FAT-Partitionen, die wir in der GPT-Partitionstabelle definiert haben. Die erste FAT-Partition enthält den UEFI-Grub-Bootloader, der gefunden wird, weil er sich in dem von UEFI für Wechseldatenträger angegebenen Pfad befindet (der --removableSwitch grub-installhat dies getan). Es ist kein UEFI-Starteintrag erforderlich, damit dies funktioniert. Der PC muss lediglich versuchen, vom USB-Laufwerk zu starten. Dieser Grub ist so konfiguriert, dass er ihn von dort nimmt (lade die grub.cfg, zeige das Menü usw.).

Wenn Sie im BIOS-Modus starten und das Booten vom USB-Laufwerk auswählen, führt der PC den gptmbr.binBootloader-Code aus, den wir in den Schutz-MBR des USB-Laufwerks geschrieben haben. Dieser Bootloader sucht nach der GPT-Partition, die mit dem legacy_bootFlag und chainload syslinux von dieser Partition markiert ist . Syslinux übernimmt dann (Menü.cfg laden, Menü anzeigen, etc.).

Verschlüsselte Persistenz

Anstatt ext4 für die Persistenzpartition zu verwenden, könnte man zuerst die Persistenzpartition mit LUKS verschlüsseln (using cryptsetup) und diese dann mit ext4 formatieren (using the proper label). Wie in der Dokumentation angegeben , muss das Live-System jedoch das cryptsetupPaket enthalten. Andernfalls kann die verschlüsselte Partition vom Live-System nicht entschlüsselt werden. Dies bedeutet, dass man zuerst eine benutzerdefinierte Live-ISO erstellen muss. Dies ist jedoch nicht Gegenstand dieser Antwort.

Geschichte

Die --no-uefi-secure-bootOption war zuvor nicht Teil des Anrufs an grub-install. Der Stick hat für mich gut funktioniert, aber das hat mit Debian Buster aufgehört, obwohl der sichere Start auf meinem Computer immer noch deaktiviert ist.

schlimmchen
quelle
1
Ich habe gerade ein Konto hier erstellt, um Ihnen dafür zu danken. Exzellentes Handbuch. Kleiner Vorschlag - es wäre schön, wenn die Persistenzpartition verschlüsselt wäre.
Petr Havlicek
1
@PetrHavlicek Wahr. Ich denke, das ist einfach genug, aber ich habe meine Freizeit damit verbracht, dieses Q & A mit anderen Themen zu erstellen, daher muss ich diese Idee noch einmal überdenken (und danke für Ihre Wertschätzung :).
Schlimmchen
Funktioniert super! Eine zusätzliche Erklärung wäre allerdings nett. (Sicher, Sie können alles auf den Manpages nachschlagen, aber zB ist mktable, obwohl dasselbe wie mklable, nicht wirklich als solches dokumentiert, usw.)
mikuszefski
Ist es möglich, nur eine Datei auf dem FAT-formatierten USB-Stick zu haben, die das Persistenz-Volume enthält? Es sollte möglich sein, die Datei in einer Schleife einzuhängen. Aber wie kann man Debians initrd anweisen, eine Datei anstelle einer Partition zu nehmen?
16.
Siehe dazu debian-live.alioth.debian.org/live-manual/stable/manual/html/… . Kurz gesagt: Erstellen Sie eine Image-Datei (mit geringer Dichte) im Stammverzeichnis eines beliebigen Dateisystems, benennen Sie diese Datei "persistent" und formatieren Sie sie z. B. mit ext4.
schlimmchen