QVINTVS · SCRIBET

GRML-USB-Stick mit BIOS/UEFI-Unterstützung und Windows-Datenpartition erstellen

Erstellung eines bootfähigen USB-Sticks mit GRML und Datenpartition.

GRML ist eine Linux-Live-Distribution mit besonderem Fokus auf Systemadministration. Die Distribution basiert auf Debian und enthält ab Werk alle Werkzeuge, die man für Wartungsarbeiten an fremden PCs typischerweise benötigt. Die Installation von GRML erfolgt im einfachsten Fall per dd(1) auf einem leeren USB-Stick. Das Problem dabei: bei dieser Art von Installation wird der gesamte USB-Stick belegt. Bei den meisten heutigen USB-Sticks ist das reine Platzverschwendung, weshalb es sich anbietet, neben GRML selbst noch eine gewöhnliche Datenpartition auf dem Stick vorzuhalten. Wie das geht, wird nachfolgend beschrieben. Ergebnis wird ein USB-Stick sein, der sich sowohl von BIOS- als auch von EFI-Systemen per Bootmenü starten läßt und der auch von aktuellen Windows-Versionen (zumindest ab Windows 7) als Datenspeicher verwandt werden kann.

Die gewöhnliche Installationsmethode per dd(1) kann das nicht leisten. Stattdessen greift man auf ein von GRML bereitgestelltes besonderes Installationswerkzeug, grml2usb, zurück. Vor seinem Einsatz sind aber ein paar Vorbereitungen zu treffen. Dazu gehört zunächst, grml2usb überhaupt erst einmal zu installieren. Jedenfalls Debian hat das Werkzeug in den Repositorien, sodaß es einfach per Paketmanager installiert werden kann. Ansonsten kann man grml2usb auch einfach per Git herunterladen:

$ git clone git://git.grml.org/grml2usb.git

grml2usb ist in Python 3 geschrieben, welches daher ggf. noch zu installieren ist (dies erfolgt bei der Installation per Paketmanager natürlich automatisch).

Weiterhin muß man ein ISO-Abbild von GRML zur Verfügung haben. Dieses kann ganz normal von der Projekt-Webseite heruntergeladen werden. Empfehlenswert ist es, entweder das ISO für GRML64 (nur 64-Bit-Systeme) oder dasjenige für GRML96 (sowohl 64- als auch 32-Bit-Systeme) herunterzuladen.

Der USB-Stick kann nunmehr partitioniert werden. Weil der USB-Stick später nicht nur mit BIOS, sondern auch mit UEFI bootfähig sein soll, wird eine EFI-System-Partition benötigt. Der Einfachheit halber wird GRML vollständig auf diese EFI-System-Partition installiert werden, sodaß der USB-Stick am Ende nur zwei Partitionen haben wird (die EFI/GRML-Partition und die Datenpartition). Es ist dabei darauf zu achten, daß die EFI-System-Partition am Anfang der Partitionstabelle steht, als solche gekennzeichnet wird und die Boot-Markierung erhält. Es gibt fehlerhafte UEFI-Implementierungen, die sie anderenfalls nicht als EFI-System-Partition erkennen. Das kann man mithilfe von fdisk erreichen (das Beispiel geht davon aus, daß es sich bei /dev/sdb um den USB-Stick handelt):

# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x49c44e38.

Command (m for help): o
Created a new DOS disklabel with disk identifier 0x41581e41.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-20971519, default 2048):  
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519): +4G

Created a new partition 1 of type 'Linux' and of size 4 GiB.

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): ef
Changed type of partition 'Linux' to 'EFI (FAT-12/16/32)'.

Command (m for help): a
Selected partition 1
The bootable flag on partition 1 is enabled now.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (2-4, default 2): 
First sector (8390656-20971519, default 8390656): 
Last sector, +sectors or +size{K,M,G,T,P} (8390656-20971519, default 20971519): 

Created a new partition 2 of type 'Linux' and of size 6 GiB.

Command (m for help): t
Partition number (1,2, default 2):  
Partition type (type L to list all types): c

Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Command (m for help): p
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x41581e41

Device    Boot   Start      End  Sectors Size Id Type
/dev/sdb1 *       2048  8390655  8388608   4G ef EFI (FAT-12/16/32)
/dev/sdb2      8390656 20971519 12580864   6G  c W95 FAT32 (LBA)

Command (m for help): w
The partition table has been altered.
Syncing disks.

Obige Kommandos erzeugen eine MBR/DOS-Partitionstabelle mit den erforderlichen Partitionen. Eine Partitionstabelle im modernen GPT-Format ist nicht möglich, weil anderenfalls ein Start unter diversen älteren BIOS-Systemen, die GPT noch nicht unterstützen, nicht mehr möglich wäre.

Die EFI-System-Partition wird mit obigen Kommandos auf 4 GiB festgelegt, der Rest des USB-Sticks wird für die Datenpartition verwandt (in diesem Fall 6 GiB). Sie wird als EFI-System-Partition gekennzeichnet (für UEFI) und mit der Boot-Markierung (für BIOS) versehen. Die Datenpartition wird dagegen lediglich als gewöhnliche FAT32-Partition gekennzeichnet, wodurch eine universelle Einsetzbarkeit gewährleistet wird.

Anschließend kann man die eigentlichen Dateisysteme erstellen. Beide Male kann man dafür auf mkfs.vfat(8) zurückgreifen:

# mkfs.vfat -n EFI /dev/sdb1
# mkfs.vfat -n Daten /dev/sdb2

Die Option -n gibt den Namen (Label) für die Partition an, d.h. die Bezeichnung, unter der die Partition später vom System angezeigt wird. Für die Datenpartition kann man hier einen beliebigen Wert wählen (oben „Daten“). Für die EFI-System-Partition sollte man dagegen immer „EFI“ benützen, weil manche UEFI-Implementierungen die Partition sonst nicht als EFI-System-Partition erkennen.

Ein Hinweis am Rande: Die Manpage von grml2usb(8) erweckt den Eindruck, daß GRML nur mit FAT16 funktionsfähig sei. Dem ist nicht so. GRML selbst ist mit jedem Dateisystem lauffähig, das der von GRML genutzte Linux-Kernel unterstützt, d.h. mit praktisch allen von Linux überhaupt unterstützten Dateisystemen. Die Beschränkung auf FAT16 ergibt sich daraus, daß alte Versionen von Syslinux, dem von GRML eingesetzten Bootloader, lediglich FAT16 lesen konnten. Mittlerweile kann Syslinux auch mit FAT32 umgehen, sodaß FAT32 wie oben gezeigt vorzuziehen ist. FAT16 ist mit der Größe heutiger USB-Sticks schlicht inkompatibel. Der Versuch, ein FAT16-Dateisystem auf einer mehrere GiB großen Partition zu erzeugen, schlägt stets mit folgender Fehlermeldung fehl:

# mkfs.vfat -F16 /dev/sdb1
WARNING: Not enough clusters for a 16 bit FAT! The filesystem will be
misinterpreted as having a 12 bit FAT without mount option "fat=16".
mkfs.vfat: Attempting to create a too large filesystem

Nunmehr folgt die eigentliche Installation von GRML. Dafür kommt das Werkzeug grml2usb(8) zum Einsatz:

# grml2usb /pfad/zum/grml.iso /dev/sdb1

Die Übergabe besonderer Optionen ist für die hier verfolgten Zwecke nicht notwendig. grml2usb(8) konfiguriert das Live-System bereits korrekt, installiert einen BIOS-Bootloader im MBR und eine EFI-Executable in dem Pfad EFI/BOOT/BOOTX64.efi, die GRML starten kann1. Auf diese Weise ist gewährleistet, daß sowohl BIOS- als auch UEFI-Systeme GRML starten können.

grml2usb(8) ist ein etwas eigenwilliges Werkzeug. Zwischenzeitlich hat ich mit diesem Fehler zu kämpfen:

Fatal: 'utf-8' codec can't decode byte 0xc0 in position 1:
invalid start byte

Das Problem trat aber nur mit der offiziellen Version aus dem Git-Repostorium auf grml.org auf. Die Version aus dem Debian-Paketarchiv funktionierte dagegen tadellos.

Damit sind die Arbeiten fast abgeschlossen. Um unwilligen UEFI-Systemen nachhelfen zu können, kann man im Verzeichnis EFI/BOOT auf der EFI-System-Partition noch eine UEFI-Shell hinterlegen, die man etwa von TianoCore kostenfrei herunterladen kann. Die in deren Zip-Archiv enthaltene Datei ShellBinPkg/UefiShell/X64/Shell.efi kann man einfach nach EFI/BOOT/Shell.efi kopieren. Mag ein UEFI GRML nicht starten oder genügt für die zu bewältigende Aufgabe die UEFI-Shell, so kann man die Datei (auf einem anderen PC) in bootx64.efi umbennen (die ursprüngliche bootx64.efi sollte man dabei aber sichern – sie enthält ja den GRML-Bootloader für UEFI). Dann startet statt GRML bei Auswahl des USB-Sticks eine UEFI-Shell.

Damit ist der USB-Stick mit GRML einsatzbereit. Die zweite Partition kann nach Belieben zum Datenaustausch verwandt werden; GRML greift ohne ausdrückliche Aufforderung auf sie weder lesend zu noch wird sie verändert. Man kann sie im GRML-Live-System einfach per mount(8) einbinden. Unter Windows wird sie als gewöhnliches externes Speichermedium erkannt.

  1. Wird als Boot-Medium in UEFI ein externes Speichermedium ausgewählt, wird stets die EFI-Executable im Pfad EFI/BOOT/BOOTX64.EFI ausgeführt.