Booten mit GRUB vom USB-Stick

14. Januar 2008

Ihr Vorhaben

Sie wollen von einem USB-Stick ein Linuxsystem booten.

Das Vorgehen

Partitionieren

Als Bootloader ist GRUB gut geeignet. Folgendes Vorgehen illustriert, wie auf einem USB-Stick ein funktionsfähiger Bootloader installiert werden kann:

Zunächst überschreiben wir den kompletten Stick mit Nullbytes. Wenn im System keine SCSI-, SATA- oder andere USB-Speichermedien hängen, ist das Gerät des USB-Sticks in der Regel /dev/sda. Im Folgenden gehen wird davon aus, dass /dev/sda dem USB-Stick entspricht.

Achtung: der folgende Befehl löscht unwiederbringlich alle Daten auf diesem Gerät! Verschaffen Sie sich vorher Sicherheit, welche Gerätedatei ihr USB-Stick wirklich anspricht!

root@linux# cat /dev/zero > /dev/sda
cat: write error: No space left on device

Nun legen wir eine Partitionstabelle mit einer Partition an und aktivieren diese (Bootable-Flag). Das geht z.B. mit fdisk /dev/sda oder cfdisk /dev/sda.

Wichtig: Damit der Kernel die neue Partitionstabelle wirklich richtig interpretiert, kann es notwendig sein, den USB-Stick einmal aus- und wiedereinzustecken.

Dateisystem anlegen

Die neue Partition heißt /dev/sda1. Auf dieser legen wir ein Dateisystem an, z.B. vom Typ ext2:

root@linux# mkfs.ext2 /dev/sda1

GRUB installieren

Nun bereiten wir eine Verzeichnisstruktur für GRUB vor und installieren diesen auf dem USB-Stick. Dazu mounten wir die neue Partition zunächst nach /mnt:

root@linux# mount /dev/sda1 /mnt

Grub legt im Verzeichnis /boot/grub. Diese legen wir an und kopieren die Teil des Bootloaders hinein, am einfachsten von der Festplatte unseres Enwticklungssystems, das hoffentlich auch mit GRUB bootet:

root@linux# mkdir -p /mnt/boot/grub
root@linux# cp /boot/grub/*stage* /mnt/boot/grub

Da GRUB Festplatten anders benennt, als der Linuxkernel, müssen wir eine Datei anlegen, in dem wir GRUB sagen, dass /dev/sda seine erste Festplatte ist:

root@linux# echo '(hd0)  /dev/sda' > /mnt/boot/grub/device.map

Nun kann man GRUB im MBR der USB-Platte installieren:

root@linux# grub-install --root-directory=/mnt /dev/sda

Wichtig: Das Unmounten nicht vergessen:

root@linux# umount /mnt

Test

Wenn Sie bisher alles richtig und nichts falsch gemacht haben, müssen Sie jetzt einen PC von diesem USB-Stick booten können. Im Erfolgsfall werden sie vom Prompt von GRUB begrüsst:


    GNU GRUB  version 0.96  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename. ]

grub> 

Jetzt fehlt natürlich noch der Kernel, eine initial Ramdisk und eine Konfiguration für GRUB unter /boot/grub/menu.lst. Das Vorgehen ist aber exakt wie bei der Festplatte. Die Bezeichnung für die Partition /dev/sda1 ist bei Grub (hd0,0).

Hinweis:

Manche USB-Sticks verhalten sich gegenüber Linux nicht transparent. Sie missbrauchen scheinbar bestimmte Speicherbereiche, um Information zur Verwaltung des Flashspeichers abzulegen. Dabei gehen sie z.B. implizit davon aus, dass der USB-Stick mit einem Windows-Dateisystem beschrieben wird, was man aus unserer Sicht durchaus als "Bug" bezeichnen kann. Leider steht sowas nie auf der Packung...

Das oben beschriebene Verfahren kann dazu führen, dass es bei solchen USB-Sticks zu Fehlern kommt. Unter Umständen muss der USB-Stick mit einem speziellen Verfahren neu dann initialisiert werden. Uns ist nicht bekannt, dass es zu einem permanenten Defekt kommen kann, schließen aber jede Haftung in so einem Fall aus.