c't 11/2023
S. 158
Praxis
Boot-Systemwahl mit USB-Stick
Bild: Collage c’t / KI Midjourney

USB-Wegweiser

Ein USB-Stick entscheidet, ob Windows oder Linux bootet

Ein eingesteckter USB-Stick ersetzt das Rumtippen im Grub-Menü bei Dual-Boot-Systemen: Je nach Stick bootet das gewünschte Betriebssystem ohne Wartezeit.

Von Rüdiger Willenberg

Ein kurzer Tagtraum, das Grub-Bootmenü rauscht vorbei, und das falsche Betriebssystem startet. Diesen Ärger kennen Nutzer von Dual-Boot-Systemen mit Linux und Windows, die nebeneinander auf demselben Rechner installiert sind. Viele Gründe sprechen für Dual-Boot-Installationen [1, 2, 3], beispielsweise kommen beide Systeme ohne Geschwindigkeitsnachteile an die Hardware heran. So kann Mama tagsüber mit der dicken Grafikkarte unter Linux neuronale Netze trainieren, während abends die Sprösslinge die 3D-Performance für das Gaming unter Windows abfordern. Und wer ein c’t-Abo hat, wird durchaus auch mal aus reiner Neugier mit einem anderen Betriebssystem experimentieren wollen.

Die verbreitetste Lösung für Multiboot ist der Open-Source-Bootloader Grub 2. Nach dem Systemstart übergibt das UEFI-Bios ihm die Kontrolle und er kann sowohl Windows als auch alle Linuxe starten. Die Wahl trifft man über ein textbasiertes Auswahlmenü. Da die meisten Nutzer aber ganz häufig die erste Option starten und nicht wollen, dass der Rechner ewig in diesem Menü hängen bleibt, läuft ein Timer ab, nach dessen Ablauf Grub wahlweise ein als Default eingestelltes Betriebssystem oder das zuletzt benutzte bootet. Während man sich ärgert, weil man nicht aufgepasst hat und mal wieder das falsche System gestartet hatte, fragt man sich während des Reboots: Warum kann das nicht so einfach sein wie bei einer alten Spülmaschine mit mechanischer Programmwahl?

Ein kleiner USB-Stick im Steckplatz reicht, damit Grub ohne Wartezeit Linux bootet. Für Windows liegt ein zweiter Stick bereit. Das Menü braucht man mit „The GRUB Switch“ nur noch in Spezialfällen., Bild: Pina Merkert
Ein kleiner USB-Stick im Steckplatz reicht, damit Grub ohne Wartezeit Linux bootet. Für Windows liegt ein zweiter Stick bereit. Das Menü braucht man mit „The GRUB Switch“ nur noch in Spezialfällen.
Bild: Pina Merkert

Genau diesen Wunsch erfüllt das Projekt „The GRUB Switch“. Durch eine kleine Erweiterung des Bootskriptes grub.cfg schaut Grub auf einem USB-Speicher nach, welchen Menüeintrag es booten soll. In der einfachsten Nutzungsvariante wählen Sie durch Einstecken eines normalen USB-Sticks mit der passenden Datei das gewünschte Betriebssystem aus. Sie können sich mit einem Mikrocontroller und ein wenig Löten auch einen echten Schalter für den gleichen Zweck bauen. Wie das geht, erklären wir in einem der kommenden Hefte.

The GRUB Switch greift sehr zurückhaltend in den Bootvorgang ein: Die eigentliche Grub-Installation wird nicht verändert (Details im Kasten „Unter der Grub-Haube“ auf Seite 161) und so besteht kein erhöhtes Risiko, den eigenen PC in einen Briefbeschwerer zu verwandeln. Findet das ergänzte Bootskript keine passende Auswahldatei, setzt es den herkömmlichen Bootvorgang fort.

Vorbereitung

Voraussetzung für eine erfolgreiche Erprobung ist eine existierende Installation, bei der das GRUB2-Bootmenü erscheint. In der Praxis ist das der Fall, wenn mindestens eines der installierten Betriebssysteme ein Linux ist. Im Minimalfall existieren keine anderen Betriebssysteme, aber Grub bietet wenigstens den „Safe Mode“ oder ältere Kernelversionen an. Auf vielen Systemen gibt es auch einen Menüpunkt für den Neustart ins UEFI-BIOS.

The GRUB Switch konfiguriert man menübasiert über die Kommandozeile in einem Linux-Terminal. Für die meisten Arbeitsschritte benötigen Sie sudo-Rechte, können also nach Passwortabfrage Kommandos als Administrator (Linux-Benutzer root) absetzen. Öffnen Sie ein Linux-Terminal und probieren Sie das Kommando: sudo whoami. Kommt nach der Passworteingabe eine Warnmeldung, dass Sie nicht in der Liste der autorisierten sudo-User sind, suchen Sie in der Dokumentation Ihrer Distribution nach sudo und verschaffen sich die nötigen Rechte für einen zweiten Versuch nach erneutem Einloggen.

Die Software des Grub-Switch-Projekts finden Sie auf GitHub, weshalb Sie die Dateien sehr leicht mit git auf Ihren Rechner klonen können:

git clone https://github.com/rw-hsma-fpga/grub-switch.git

Falls Sie git nicht installieren möchten, können Sie das Projekt auch mit wget herunterladen und per Hand entpacken:

wget https://github.com/rw-hsma-fpga/grub-switch/archive/refs/heads/master.zip
unzip master.zip
mv grub-switch-master grub-switch

Danach finden Sie die Dateien des Projekts im Ordner grub-switch.

Menübasiert konfiguriert

Die Software zum Grub-Switch bringt Shellskripte mit, mit denen Sie die Bootoptionen über einfache Menüs konfigurieren. Damit Sie die Menüs ganz sehen können, sollten Sie Ihr Konsolenfenster groß ziehen, beispielsweise mit dem Maximieren-Knopf in der Titelleiste. Wechseln Sie danach mit

cd grub-switch/1_config_scripts

in das Unterverzeichnis, das alle Shellskripte zur Konfiguration enthält. Nach der Passwortabfrage bringt Sie der Befehl

./CONFIGURE_GRUBswitch.sh

in das im Bild auf Seite 160 dargestellte Hauptmenü. Das listet oben auf, ob und wann das Skript die Einträge des Grub-Menüs ausgelesen, Dateien für Sticks und Arduino-Micro-Hardware erstellt, Hashes berechnet hat und wann die Konfigurationsdatei grub.cfg zuletzt verändert wurde. Letztere wird nicht nur vom GRUB-Switch-Skript aktualisiert, sondern auch von den Skripten der Distribution, beispielsweise nach Kernel-Updates. Bei Elementary OS liegt die grub.cfg in einem anderen Ordner, den Sie dem Skript aber mit der Option -g /boot/efi/EFI/ubuntu/grub/ mitteilen können. Beim ersten Start existieren die GRUB-Switch-Dateien natürlich noch nicht.

Den Grub-Switch konfigurieren Sie über Menüs, die auf einzelne Nummern oder Buchstaben reagieren. Vom hier dargestellten Hauptmenü durchlaufen Sie für den Einsatz von USB-Sticks die Punkte 1, 2, 5 und 7.
Den Grub-Switch konfigurieren Sie über Menüs, die auf einzelne Nummern oder Buchstaben reagieren. Vom hier dargestellten Hauptmenü durchlaufen Sie für den Einsatz von USB-Sticks die Punkte 1, 2, 5 und 7.

Unter den Statusangaben folgen die Aktionen, die The GRUB Switch einrichten. Sie wählen diese einfach mit den Zahlentasten aus. Im Prinzip müssen Sie nur 1, 2, 5 und 7 durchlaufen.

Um die für Sie relevanten Bootmenü-Eintrage selektieren und sortieren zu können, muss das Skript zunächst eine komplette Liste aus der existierenden Grub-Konfiguration ziehen. Wählen Sie dazu mit der Taste 1 die Aktion „Extract all menu entries from grub.cfg“. Außer unter Linux Mint lassen Sie das Skript an dieser Stelle einmal grub.cfg neu erstellen, weil das auf manchen Distributionen Probleme mit automatischen Übersetzungen umgeht. Mint nutzt ein zweifelhaftes Skript beim Reboot, das die Namen noch mal tauscht. Die Daten landen in der Textdatei grub-switch/bootfiles/grubmenu_all_entries.lst. Mit einem beliebigen Tastendruck kehren Sie zum Hauptmenü zurück. Die Statusübersicht zeigt jetzt das Datum an, an dem die Menüeinträge zuletzt extrahiert wurden.

Mit der menügeführten Konfiguration wählen Sie die Einträge aus dem Grub-Menü aus, die Sie mit einem USB-Stick booten möchten.
Mit der menügeführten Konfiguration wählen Sie die Einträge aus dem Grub-Menü aus, die Sie mit einem USB-Stick booten möchten.

Mit 2 (Configure GRUBswitch order and generate bootfiles and hashes) starten Sie die eigentliche Konfiguration. Das Tool zeigt in Tabellenform die Auswahloptionen des Grub-Menüs. Dabei tauchen auch alle Einträge aus Untermenüs auf; in unserem Beispiel sind dies die verschiedenen Kernelversionen, die das installierte Ubuntu booten kann.

Mit den Pfeiltasten navigieren Sie durch die Einträge. Die Tasten 1 bis 9 markieren Einträge fürs Booten per USB-Stick oder Schalter und weisen zugleich eine Auswahlposition zu. Für den selten Fall, dass mehr als 9 Optionen notwendig sind, stehen noch die Buchstabentasten A bis F zur Verfügung, die den Positionen 10 bis 15 in der Reihenfolge entsprechen. Die Auswahlposition 0 ist für das unveränderte Grub-Menü reserviert. Merken Sie sich die gewählte Reihenfolge, Sie brauchen sie später.

Mit dem Menü können Sie auch die aktuelle Zuweisung löschen (Entf-Taste), alle getätigten Zuweisungen löschen (Backspace), 15 Positionen in Tabellenreihenfolge zuweisen (Einfg-Taste) oder das Tool ohne Änderungen verlassen (Q). Mit einem Druck auf Enter akzeptieren Sie die aktuellen Zuweisungen und gelangen zum nächsten Schritt.

Zur Kontrolle zeigt das Konfigurationsskript ein zweites Mal eine Liste mit den ausgewählten Bootoptionen.
Zur Kontrolle zeigt das Konfigurationsskript ein zweites Mal eine Liste mit den ausgewählten Bootoptionen.

Das Konfigurationsskript zeigt Ihnen nochmals die ausgewählten Einträge in der zugewiesenen Reihenfolge.

Zum Testen sollten Sie eine Wartezeit von einigen Sekunden einstellen, damit Sie im Notfall noch mit ESC ins normale Bootmenü kommen. Wenn alles läuft, setzen Sie die Wartezeit später auf null.
Zum Testen sollten Sie eine Wartezeit von einigen Sekunden einstellen, damit Sie im Notfall noch mit ESC ins normale Bootmenü kommen. Wenn alles läuft, setzen Sie die Wartezeit später auf null.

Zur Kontrolle zeigt Grub die per Hardware ausgewählte Bootoption kurz an, bevor sie startet. Währenddessen gelangen Sie mit der Esc-Taste zum normalen Grub-Menü. Für erste Experimente ist eine Wartezeit als Absicherung und Rückmeldung hilfreich. Wenn alles läuft, können Sie die Verzögerung auf null setzen. Das nächste Menü ermöglicht, mithilfe der Cursortasten die Wartezeit einzustellen.

Haben Sie eine Wartezeit eingestellt, können Sie – rein ästhetisch – in einem Folgemenü eine Kombination aus Schriftfarbe und Hintergrundfarbe für die Anzeige des zu bootenden Systems wählen. Mit den Pfeiltasten für Links und Rechts wechseln Sie zwischen den Farbkombinationen. Achtung: Nicht alle Linux-Terminals stellen die gewählten Farben so dar, wie Grub sie später zeigt. Achten Sie im Zweifel auf die Textangabe, zum Beispiel „white/red“ für weiße Schrift auf rotem Hintergrund.

Bei mehr als null Sekunden Verzögerung dürfen Sie auswählen, in welchen Farben The GRUB Switch die per Hardware gewählte Bootoption anzeigt.
Bei mehr als null Sekunden Verzögerung dürfen Sie auswählen, in welchen Farben The GRUB Switch die per Hardware gewählte Bootoption anzeigt.

Das Konfigurationsskript gibt abschließend noch aus, wie die Konfigurationsdaten in die Datei grub-switch/bootfiles/.entries.txt geschrieben wurden, die im Folgeartikel für die selbst gelötete USB-Schalterhardware verwendet wird. Mit einem beliebigen Tastendruck kehren Sie in das Hauptmenü und zur Aktionsliste zurück.

Die Statusübersicht zeigt die Daten für die aktuell erzeugten Konfigurationsdateien. Mit der Taste 3 könnten Sie diese auch wieder komplett löschen und neu beginnen. Noch ist aber ohnehin nichts am Bootvorgang verändert.

Die eigentliche Installation passiert mit der Aktion 7 (Install GRUBswitch into grub.cfg), die dem Bootskript /boot/grub/grub.cfg den nötigen Code hinzufügt. Weil Sie dazu sudo-Rechte brauchen, werden Sie nach Ihrem Passwort gefragt. Dann müssen Sie den Schreibvorgang noch einmal mit Y für „Ja“ bestätigen, bevor das Skript grub.cfg mit dem hinzugefügten Code neu generiert. Ein weiterer beliebiger Tastendruck bringt Sie zum Hauptmenü zurück, das das Update nun oben beim Status angezeigt. Für die Vorbereitung der USB-Sticks verlassen Sie das Konfigurationstool nun mit Q.

USB-Sticks einrichten

Wechseln Sie mit cd ../bootfiles in das Verzeichnis bootfiles im Projektordner und lassen Sie sich den Inhalt mit ls -la anzeigen (die Option a zeigt auch versteckte Dateien, die sich in Linux nur durch einen führenden Punkt im Namen von anderen unterscheiden). Sie sehen unter anderem:

  • Die Datei grubmenus_all_entries.lst, in die alle Grub-Menü-Einträge extrahiert wurden.
  • Die schon zuvor angezeigte Datei .entries.txt, die für die kommende Arduino-Lösung benötigt wird.
  • Nummerierte Unterverzeichnisse wie boot.1, boot.2, boot.3 etc., je nachdem, welche Zahlen/Buchstaben zuvor im Konfigurationstool zugewiesen wurden.

In den Unterverzeichnissen boot.X liegt jeweils eine einzige Datei SWITCH.GRB, nach der der grub.cfg-Code auf USB-Laufwerken sucht, um sie auszuführen.

Sie können sich den Inhalt einer Datei beispielhaft mit cat boot.1/SWITCH.GRB anzeigen lassen. Der Inhalt ist kurz erklärt: Der Shell-artige Skript-Code setzt zunächst Variablen für den gewählten Booteintrag sowie die Wartezeit und Farben für die Anzeige. Danach stellt er den jeweiligen Booteintrag als Default-Vorgabe des normalen Grub-Menüs und stellt dessen Wartezeit auf null Sekunden. Anschließend gibt Grub den Eintrag in den gewünschten Farben aus. Erfolgt kein Abbruch, kehrt das Skript zum aufrufenden Skript grub.cfg zurück. Aufgrund der vorweggenommenen Einstellungen wird das eigentliche Grub-Menü aber nicht angezeigt, sondern direkt der gesetzte Eintrag gebootet. Falls Sie die Wartephase mit Esc abbrechen, erscheint das Grub-Menü ohne Zeitbegrenzung.

Für den nächsten Schritt benötigen Sie ein oder mehrere USB-Sticks, die mit dem FAT-Dateisystem formatiert sind. Die Sticks müssen lediglich je eine SWITCH.GRB-Datei speichern, die wenige Hundert Bytes groß ist. Es kommen also auch Werbegeschenke und schnarchlangsame Uralt-Sticks in Frage. Falls Sie neu kaufen, eignen sich Mini-Sticks, die oft weniger als 10 Euro kosten und kaum größer als der USB-A-Stecker sind.

Für jede Bootoption stecken Sie einen Stick in den USB-Slot und binden ihn ein. Dieses Mounten erledigen moderne Linux-Distributionen automatisch. Wenn der USB-Stick danach zum Beispiel als /media/username/MYDRIVE32MB eingehängt ist, kopieren Sie die erste Auswahldatei mit

cp ./boot.1/SWITCH.GRB /media/username/MYDRIVE32MB/

darauf. Hängen Sie den Stick anschließend entweder per Mausklick oder mit sync && sudo umount /media/username/MYDRIVE32MB aus, damit die Datei auch tatsächlich geschrieben wird, statt im Schreibpuffer des Systems zu verweilen. Dann ziehen Sie den Stick ab und markieren Sie ihn gleich per Stift oder Aufkleber mit der gewählten Option. Wiederholen Sie den Vorgang mit allen USB-Sticks und Dateien in den Verzeichnissen boot.2, boot.3, und so weiter.

In der Minimalvariante mit zwei Betriebssystemen reicht übrigens schon ein einzelner USB-Stick, beispielsweise am Schlüsselbund, aus: Wenn eine Windows- und eine Linux-Installation auf dem Rechner warten und Windows in /etc/default/grub als Default eingestellt ist, erscheint nach dem Start das Grub-Menü und nach Ablauf der Wartezeit (auch in /etc/default/grub einstellbar) läuft Windows los. Dann brauchen Sie nur den USB-Stick mit der SWITCH.GRB für die Linux-Option.

Danach ist es Zeit, das Ganze auszuprobieren: Stecken Sie den passenden Stick in eine USB-Buchse und starten das System neu. Grub sollte Sie mit der kurzen Anzeige der passenden Bootoption begrüßen und danach das entsprechende OS starten.

Secure Boot

Falls es nicht gleich klappt, ist der Bösewicht vermutlich das UEFI-BIOS des PCs: Prüfen Sie, ob das Booten von USB-Laufwerken erlaubt ist. Der Grub-Switch bootet zwar gar nicht von USB, aber falls verboten, wird der USB-Controller nicht früh genug aktiviert. Etwas perfider ist eine Variante, über die der Autor bei seinem Lenovo-Notebook gestolpert ist: Hier wird der USB-Zugriff für Grub schon unmöglich, falls die eigentlich sinnvolle UEFI-BIOS-Option „Secure Boot“ aktiviert ist, obwohl sie mit USB auf den ersten Blick gar nichts zu tun hat. In einem solchen Fall scheint das Deaktivieren des Secure Boot leider die einzige Option, The GRUB Switch zu nutzen.

Wir haben The Grub Switch mit allen Distributionen aus dem c’t-Linux-Netzplan [4] getestet und leider funktionierte nur das „echte“ Ubuntu (also nicht die Derivate Mint und Elementary) sowie OpenSUSE „Leap“ (auch nicht das Rolling-Release „Tumbleweed“) automatisch mit Secure Boot.

Falls sich bei Ihnen die Nackenhaare gesträubt haben, als Sie lasen, dass Grub versucht, eine Skriptdatei von einem eingesteckten USB-Laufwerk auszuführen, hatten Sie die richtige Intuition. Skripte ungeprüft von USB-Sticks auszuführen ist ein Einfallstor par excellence für Hacker. Um Ihren Computer gegen das Ausführen beliebiger Grub-Skripte zu sichern, bietet The GRUB Switch einen Hash-basierten Mechanismus, der nur vorher zugelassene SWITCH.GRB-Dateien ausführt.

Um den zu aktivieren, wechseln Sie ins Verzeichnis bootfiles im Projektordner. Listen Sie dort zunächst den Inhalt des Ordners grub_switch_hashes mit ls -l grub_switch_hashes auf. Dort gibt es zu jedem Ordner boot.1, boot.2, … eine entsprechende Datei 1.sha512, 2.sha512, …. Ein cat grub_switch_hashes/* zeigt alle Dateien an, was offenbart, dass jede einen SHA512-Hashcode für die korrespondierende SWITCH.GRB-Datei enthält.

GRUB kann ebenfalls solche Hashes von Dateien bilden und vergleichen: Passt der Hash einer gefundenen SWITCH.GRB-Datei nicht zu den hinterlegten, ignoriert Grub sie.

Der GRUB-Switch-Code prüft Hashes aber nur, wenn er den Ordner /boot/grub/grub_switch_hashes findet. Den lokalen Ordner mit den vom Skript erzeugten Hashes müssen Sie also an die richtige Stelle kopieren. Navigieren Sie dafür mit cd ../1_config_scripts zurück zum Ordner mit den Konfigurationsskripten und starten Sie das Skript erneut mit dem Befehl:

./CONFIGURE_GRUBswitch.sh

Wählen Sie im Hauptmenü die Aktion 5 (Install up-to-date hashes for permitted SWITCH.GRB files). Nach Kopieren des Hashordners und Rückkehr ins Hauptmenü mit einem beliebigen Tastendruck wird nun auch der Status der Hash-Installation mit Datum angezeigt. Falls es Probleme gibt, lässt sich der Hash-Ordner mit der Aktion 6 einfach wieder entfernen.

Praktisch sollte sich durch die zusätzliche Sicherheitsmaßnahme erst mal nichts ändern. Sie können weiterhin mit Ihren vorbereiteten USB-Sticks die verschiedenen Optionen booten, denn die Hashes passen ja. Sollte sich in einer SWITCH.GRB-Datei aber auch nur ein Bit ändern, ergibt die Prüfung einen komplett anderen Hash und die Datei wird nicht mehr ausgeführt.

Falls Ihre Linux-Distribution überhaupt mit Secure Boot funktioniert, gibt es leider auch Probleme, die am Design von Grub liegen: Zur Hash-Berechnung muss ein Modul nachgeladen werden, das es anscheinend nicht durch die Signaturprüfung schafft; die Hashprüfung der Auswahldateien scheitert dann immer. Man muss sich in diesem Fall also leider zwischen der Deaktivierung von Secure Boot im UEFI-BIOS oder dem Verzicht auf die Hash-Prüfung und erneuten erneutem Deinstallieren des Hashordners entscheiden.

Noch gemeiner sind Probleme bei Fedora und openSUSE, die zurzeit als einzige eine ungepatchte Version von GRUB 2.06 verwenden: Fedora verweigert die Hash-Funktionen mit Ausführungsfehlern in Grubs internen C-Funktionen. Allerdings geben diese Fehler den gleichen Rückgabewert an grub.cfg wie eine erfolgreiche Hash-Prüfung – und würde damit auch falsche Skript-Dateien durchlassen. Bei openSUSE (Leap und Tumbleweed) tritt dieses Fehlverhalten nur beim Standardmäßig verwendete btrfs-Dateisystem auf – wählt man stattdessen ext4, funktioniert die Hash-Prüfung korrekt.

Fazit

Mithilfe des Projektes The GRUB Switch können Sie mittels eingestecktem USB-Stick vorauswählen, welches System Grub startet. Dank des menübasierten Konfigurationsskripts brauchen Sie zum Einrichten keine tiefgehenden Linux-Kenntnisse. Die automatischen Update-Mechanismen der Linuxe werden durch The GRUB Switch nicht gestört. Ein einzelner USB-Stick reicht, um gelegentlich zu Linux statt Windows oder andersherum abzubiegen. Mit mehreren USB-Sticks kann die Wartezeit des Bootmenüs ganz entfallen. In einer der nächsten c’t-Ausgaben erklären wir außerdem, wie Sie sich einen Kippschalter so an den Arduino Micro löten, dass Sie sogar ganz auf USB-Sticks verzichten können. (pmk@ct.de)

The GRUB Switch bei GitHub: ct.de/yve8

Kommentieren