ubuntuusers.de

Universal stand-alone grub für BIOS und EFI auf USB flashkey und internen HDD und SSD

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Achtung!

Sicherheitshinweis:
Ein wie hier beschrieben verwendeter grub ist in Bezug auf Sicherheit wie ein Fremdpaket zu betrachten, da die Patches nicht mehr automatisch einfließen. Im Internet lassen sich Hinweise auf eine Sicherheitslücke 🇩🇪 in grub Versionen 1.98 (Dezember 2009) bis 2.02 (Dezember 2015) finden.

Für den gefahrlosen Umgang mit den Partitionierungswerkzeugen empfiehlt sich die Verwendung eines LiveSystems bei gleichzeitiger Entfernung aller Datenspeichermedien.

An verschiedenen Stellen ist die Bezeichnung für den verwendeten flashkey explizit mit sdd angegeben. Bei Verwendung der hier genannten Befehle ist unbedingt die jeweils den eigenen Gegebenheiten entsprechende Device-Bezeichnung zu wählen.

Vorwort

Grub ist ein sehr vielseitiger Bootloader für PC-Betriebssystem - vornehmlich Linux - und findet u.a. Einsatz bei Ubuntu. Dabei wird er während der Installation automatisch mit installiert und über Skripte konfiguriert.

Wiki/Icons/usb.png Allerdings hat Grub durchaus weitere Fähigkeiten:

  • kann unabhängig vom O/S betrieben werden

  • kann mittels loop Funktion iso-Dateien direkt booten

Diese Eigenschaften kommen hier zum Einsatz.

Die Einführung von EFI und Grubs Fähigkeit, auch bei solchen Konfigurationen, welche ganz andere Voraussetzungen als bei BIOS/MBR erfordern, booten zu können, führt bei den gängigen USB-Bootstick Erstellern zur Notwendigkeit, sich entscheiden zu müssen: Entweder EFI oder BIOS.

Für das Erzeugen eines Live-USB flashkey werden (hier bei ubuntuusers.de) meistens zwei Vorgehensweisen empfohlen:

  1. Basis O/S Windows: ▶ Rufus 🇩🇪 ( → Download ⮷)

    • kann fast alles, außer Persistenz (kann man aber bequem unter Linux LiveSystem einrichten). Anmerkung: Das Einrichten einer casper-rw Datei gem. externem Link konnte nicht erfolgreich nachvollzogen werden.

  2. Basis O/S Linux: ▶ dd ( → Live-USB-Stick-erstellen)

    • gesamter verfügbarer Speicherplatz ist belegt.

Zweck

Im Artikel wird beschrieben, wie man einen Live-USB flashkey erstellen kann, der sowohl auf BIOS, wie auch auf EFI Sytemen lauffähig ist. Ferner kann der flashkey um Persistenz erweitert werden, ggf. vorhandener freier Speicherplatz kann nach Belieben Verwendung finden, u.a. natürlich für verschiedene iso-Dateien.

Voraussetzungen

  • laufendes Linux/Ubuntu (auch LiveSystem), ggf. mit Internetverbindung

  • ein für die gewünschte(n) Distribution(en) ausreichend großer flashkey

  • die Partitionstabelle kann GPT oder MBR/MPT sein

  • die Programme gparted und gdisk sind im LiveSystem vorhanden

  • grub-efi bzw. grub-pc ist je nach System (EFI - legacy) ggf. nachzuinstallieren

Vorbereitung

Hinweis:

Anbei eine Liste der bei der Erstellung und Erprobung dieser Seite verwendete_Hardware

Partitionieren des flashkey

Zum Partitionieren eignet sich sowohl das im aktuellen Ubuntu-LiveSystem vorhandene GUI-Programm gparted wie auch das CLI-Programm gdisk.

(Hinweis: Beide, gdisk und gparted funktionieren nicht zuverlässig (mit jedem Flashkey) wie hier erforderlich beim Anlegen von Partitionen. Siehe Bild einer mißglückten Partitionierung → mit_gdisk_angelegte_Partitionen.png)

Für die Einrichtung des virtuellen MBR wird gdisk benötigt.

cruzer-mit-bios_grub.png
cruzer flashkey mit bios_grub und weiterer 4. Partition

Auf dem Datenträger müssen Partitionen angelegt werden. Dazu ist zunächst eine Partitionstabelle notwendig, entweder MBR/MPT oder GPT (bei Wechsel des Partitionsschemas (MBR/MPT → GPT) s. Problembehebung). Je nachdem unterscheiden sich die fertigen Datenträger um genau eine unformatierte Partition von 1M Größe am Anfang.

Die Partitionen können z.B. mit gparted angelegt werden.

# Dateisystem Größe Markierung Name GPT MBR/MPT
1 unformatiert 1M bios_grub - Wiki/Icons/Tango/dialog-ok.png Wiki/Icons/Tango/dialog-cancel.png
2 fat12/16/32 50M esp - Wiki/Icons/Tango/dialog-ok.png Wiki/Icons/Tango/dialog-ok.png
3 grub-lesbar (→ File-system_support) 50M - beliebig Wiki/Icons/Tango/dialog-ok.png Wiki/Icons/Tango/dialog-ok.png
4 und weitere Partition(en) z.B. für die iso-Datei, casper-rw usw. später Wiki/Icons/Tango/dialog-ok.png Wiki/Icons/Tango/dialog-ok.png

→ siehe unter anderem: GRUB 2/Grundlagen (Abschnitt „MBR-mit-GUID-Partitionstabelle-GPT“)

Anmerkung: Die 50M sind in beiden Fällen etwas überdimensioniert, ~16MB sind aber erforderlich (eine fat16 Partition hat min. 16 MiB), mit Hintergrundbild entspr. mehr. In die 3. Partition werden im Falle MBR/MPT die grub-Dateien geschrieben --boot-directory=, sie darf aber auch weitere Dateien enthalten, z.B. die iso-Dateien. Die erforderliche Größe ist dann entsprechend zu wählen. Die grub- Dateien können aber auch auf die esp Partition - z.B. in ein eigenes Verzeichnis - geschrieben werden. Beide jeweiligen grub-Dateien belegen je mit einer simplen grub.cfg knapp 13 MiB.

Die jeweiligen Markierungen für die Partition 1 und 2 erreicht man nach dem Erstellen mittels rechte Maustaste und entsprechender Auswahl.

Alternative Einrichtung mit gdiskentspr._Terminalausgabe

Hybrid MBR anlegen

Hinweis:

Der folgende Abschnitt wird ausschließlich für einen Datenträger mit GPT gebraucht, und dann auch nur, wenn von diesem Datenträger im CSM/"legacy" Modus gebootet werden soll. Für MBR/MPT ist er obsolet.

Damit man ein Speichermedium mit GPT-Partitionierung wie ein MBR-partitioniertes Gerät verwenden kann, wird ein sogenannter virtueller MBR benötigt. Dazu wird gdisk verwendet.

Der Programmaufruf erfolgt mit

sudo gdisk /dev/sdX # X steht für den flashkey, zu ermitteln mit parted -l 

Befehl/Taste Ausführung/Ergebnis Übersetzung
r Recovery/transformation Untermenü für Wiederherstellung bzw. Transformation
h hybrid mbr erzeugen eines virtuellen MBR in einer GPT Umgebung
1 2 3 to be added to the hybrid MBR GPT-Partition(n) zum hybrid MBR hinzufügen
n Place EFI GPT (0xEE) partition first in MBR Partitionstyp "efi"
Partitionen 1-3 hinzufügen, Vorgaben verwenden, bootflag: für 1 und 2: n, 3: y
x Recovery/transformation Untermenü für Wiederherstellung bzw. Transformation
h hybrid mbr erzeugen eines virtuellen MBR in einer GPT Umgebung
w Final checks complete. About to write GPT data. letzte Überprüfung. GPT-Informationen werden geschrieben
y Do you want to proceed? wollen Sie weitermachen
OK; writing new GUID partition table (GPT) to /dev/sdd. OK; schreibe neue GUID Partitionstabelle auf Gerät /dev/sdd

Eine entsprechende Befehlsfolge kann man sich hier ▶ Terminalausgabe_virtMBR ⮷ ansehen

grub installieren

Die Installationsdateien für grub unter EFI und grub unter legacy werden in getrennte Partitionen geschrieben, das hat den Vorteil, die jeweiligen grub.cfg-Dateien getrennt von einander konfigurieren zu können; z.B. durch unterschiedliche Hintergrundbilder zwecks Unterscheidung schon beim Start, ob sich der PC im EFI oder im legacy Modus befindet. Statt eines Bildes kann man auch einen quasi "leeren" menuentry verwenden (s.u.).

  1. für EFI

    • die esp (/dev/sdd2) Partition einhängen nach /mnt, nach Gebrauch aushängen.

    • im LiveSystem ist grub-efi nachzuinstallieren (mit 22.04 nicht mehr)

    • grub installieren

      sudo grub-install --target=x86_64-efi --recheck --removable --efi-directory=/mnt --boot-directory=/mnt/boot 
    • mit einem Texteditor eine Datei grub.cfg anlegen und unter /mnt/boot/grub speichern

      • beispielhafter Inhalt, noch ohne Starteintrag für ein Ubuntu

        1
        2
        3
        menuentry "efi/pc" { 
        	set-root=(hd0,1)  
        }
        
      • # zu 1: dieser Eintrag dient lediglich der schnellen Erkennung, in welchem Modus auf dem Rechner gebootet wurde

      • # zu 2: ohne 'gültige' Zeile keine Anzeige

    • der flashkey kann so schon auf einem EFI-PC getestet werden, grub erscheint mit dem o.g. Menüeintrag "efi/pc"

  1. für legacy

    • die biosgrub-Dateien (/dev/sdd3) Partition einhängen nach /mnt, nach Gebrauch aushängen.

    • grub installieren

      sudo grub-install --target=i386-pc --recheck --removable --boot-directory=/mnt/boot /dev/sdd 
    • mit einem Texteditor eine Datei grub.cfg anlegen und unter /mnt/boot/grub speichern

      • beispielhafter Inhalt

        1
        2
        3
        menuentry "legacy/pc" { 
        	set-root=(hd0,1) 
        }
        
      • s. die Erläuterungen bei der grub.cfg für EFI

    • jetzt kann der flashkey auch auf einem PC mit CSM/legacy (resp. BIOS) getestet werden, grub erscheint mit dem Menüeintrag "legacy/pc"

Hinweis:

Installiert man abweichend nicht in getrennte Partitionen, sondern sowohl grub-efi als auch grub-pc in die ESP, wählt man bei den beiden o.g. Befehlen entsprechend unterschiedlich benannte Verzeichnisse. Im EWMS (s.Anhang) sind dafür z.B. boot-efi und boot-bios verwendet worden.

weitere Partition(en) für die iso-Datei und z.B. Persistenz

Für die iso-Datei(en) wird eine ausreichend große Partition benötigt, vorzugsweise mit ntfs Dateisystem, weil sie dann auch Rechterestriktionen nutzbar ist.

Soll ein persistenter Bereich (zum Speichern von Einstellungen, Programmen, Dateien..., Größe min. 300 MiB) geschaffen werden, benötigt man auch ein Partition mit dem Label "casper-rw". Eine solche wird nach Anlegen mit gparted mit diesem Befehl eingerichtet

sudo mkfs.ext3 -b 4096 -L casper-rw /dev/sdxy 

Im menuentry wird die Zeile linux (loop)/casper/vmlinuz boot=casper... durch den Kernelparameter "persistent" erweitert.

In dem unten aufgeführten Link Persistenten_USB-Live-Stick_im_BIOS-Modus_erstellen stehen sehr nützliche Hinweise zur Verwendung der Persistenz (Stichwort: Aktualisierung)

grub.cfg vervollständigen

Die beiden oben erzeugten grub.cfg Dateien sind hinreichend und können (hier beispielhaft mit einem Menüeintrag für die aktuelle Ubuntu LTS-Version "Focal Fossa") belegt werden.

  • iso-file Booten mittels loopback

    1
    2
    3
    4
    5
    6
    7
    menuentry "ubuntu-20.04.3-desktop-amd64 live " {
            insmod part_gpt
    	set root=(hd0,gpt4)
    	loopback loop /ubuntu-20.04.3-desktop-amd64.iso
    	linux (loop)/casper/vmlinuz boot=casper ramdisk_size=2097152 root=/dev/ram rw locale=de_DE bootkbd=de console-setup/layoutcode=de iso-scan/filename=/ubuntu-18.04-desktop-amd64.iso
    	initrd (loop)/casper/initrd
    }
    
    • # zu 2: insmod part_gpt ist z.B. erforderlich, wenn der Datenträger mit einem GPT Schema versehen ist

    • # zu 5: ramdisk_size=2097152 root=/dev/ram rw und locale=de_DE bootkbd=de console-setup/layoutcode=de sind optional

    • # zu 6: verschiedentlich ist die Bezeichnung für initrd unterschiedlich (z.B. initrd.gz, initrd.lz) Mittels "Einhängen von Laufwerksabbildern" kann man das einfach nachsehen.

Hinweis:

Die Anweisung set root=(hd0,gpt4) kann unter Umständen - Wechsel der device Reihenfolge durch Einbau/Anstecken weiterer Geräte - nicht ausreichend sein. Es ist daher ratsam, eine Anweisung search --no-floppy --fs-uuid --set=root <UUID> anzufügen

anpassen der beiden grub.cfg

Innerhalb einer ESP ist die Bearbeitung erst nach vorherigem mount und auch nur mit Root-Rechten möglich. Diesen Umstand kann man umgehen, indem man die beiden o.g. grub.cfg Dateien dazu benutzt, ein weiteres configfile aufzurufen, welches sich auf einem "leichter" zugänglichen Dateisystem befindet. Der Eintrag sieht jeweils wie folgt aus

  • vereinfachte grub.cfg

    1
    2
    3
    4
    menuentry "cfg-file" {
    	set root=(hdx,y) 
    	configfile /grub.cfg
    }
    
    • # zu 2: x und y anpassen

Damit reduziert sich der Zweck dieser beiden configfiles zusätzlich nur noch auf das Anzeigen des Bootmodus. Das kann man auch erreichen mit einem angepaßten Hintergrundbild. Da dieses beim Wechsel per configfile erhalten bleibt, kann auch gleich die Sichtbarkeit (timeout=0) abgeschaltet werden.

Hintergrundbild in grub

Für die (passenden) Hintergrundbilder sind eine Reihe Eintragungen in den jeweilige grub.cfg erforderlich. Sie werden jeweils vor die menuentry geschrieben.

in die jeweilige grub.cfg einzufügen
CSM/"legacy" EFI Erläuterung
loadfont /<Verz>/grub/fonts/unicode.pf2 die unicode werden bei gfxterm für die korrekte Darstellung der Ränder benötigt
insmod vbe insmod efi_gop die jeweiligen Graphiktreiber
set gfxmode=auto ggf. muß man hier auch gezielt eine verfügbare Auflösung setzen (auf der grub Konsole mit vidoeinfo herausfinden)
terminal_output gfxterm gfxterm wird für die graphische Dartellung gebraucht

Zusätzlich kann man die Schrift- und Cursorfarben geeignet zu dem jeweiligen Hintergrundbild anpassen. ▶ grub-Schriftfarben

Eine solche grub.cfg sieht dann so aus

  loadfont /<Verz>/grub/fonts/unicode.pf2
  insmod vbe # für EFI insmod efi_gop
  set gfxmode=auto # alternativ z.B. …=1280x1024x32
  terminal_output gfxterm

  insmod png
  background_image /<Verz>/image.png

  set color_normal=dark-gray/black
  set menu_color_normal=light-gray/black
  set menu_color_highlight=red/black

  timeout=0
  menuentry "cfg-file" {
	set root=<Verz>
	configfile /grub.cfg
}

  • mit timeout=0 wird dieses grub.cfg nicht angezeigt

  • /<Verz> ist entsprechend einzusetzen

Hinweis zum Gebrauch als Installationsmedium

Soll ein so per loopback gestartetes LiveSystem zu Installationszwecken auf dasselbe device benutzt werden, funktioniert das nur, wenn das /isodevice ausgehängt wird, anderenfalls stürzt ubiquity ab. Das Aushängen gelingt mittels

sudo umount -l -r -f /isodevice 

Trotz ausgehängentem /isodevice ist auch so eine nachträgliche Änderung an den Partitionen nicht möglich, für die Installation in so einem Fall müssen die gewünschten/erforderlichen Partitionen bereit vorher angelegt sein.

Verwendung im PC als stand-alone grub

Die oben beschriebene Installation auf einem flashkey kann in gleicher Weise auch auf einer HDD/SSD zum internen Gebrauch auf einem EFI-System durchgeführt werden. Man erhält damit einen grub, der unabhängig von den Skripten eines installierten Linux betrieben werden kann.

Vor- und Nachteile

  • Vorteile

    • frei gestaltbares Menü

    • besonders geeignet für Mehrbootsysteme

    • keine parallelen Bootloader bzw. umständliche "Scripterei", um in allen Systemen die kernel-updates zu erfassen

  • Nachteile

    • die entsprechenden Einstellungen sind selbst vorzunehmen

    • es ist etwas aufwendiger, unerwünschte Booteinträge zu vermeiden resp. wieder loszuwerden

Installation

Zunächst wird für ein wie oben beschrieben installierten stand-alone grub ein neuer Booteintrag im nvram angelegt

sudo efibootmgr --create --disk /dev/sdX --part Y --label "stand-alone-grub" --loader \\boot\\grub\\x86_64-efi\\grub.efi # X und Y entsprechend anpassen 

efibootmgr -v gibt Auskunft über das Ergebnis. Ggf. ist dieser Eintrag zu "aktivieren" mit

sudo efibootmgr -b <hex#> -a 

Um die Benutzung des "efi" Bootmenüs zwecks Booten des gewünschten Eintrags zu vermeiden, setzt man die Reihenfolge entsprechend mit

sudo efibootmgr -o <hex#> 

Hinzufügen von O/Sen

Wird zu so einer Konstellation ein Windows hinzugefügt, läßt sich bezüglich Bootloader nur im Nachhinein eine entsprechende Anpassung bewerkstelligen

  1. Windows Boot Manager inaktiv setzen sudo efibootmgr -b <hex#> -A

  2. Reihenfolge wieder auf den stand-alone grub einstellen

Beim Hinzufügen eines Ubuntu kann man ganz auf die Installation des zugehörigen grub verzichten (ubiquity -b), dann kann man allerdings lediglich mittels der SymLinks booten und hat den Nachteil, nicht auf ältere als den unmittelbar vorletzten kernel zugreifen zu können. Leider wird bei dieser Vorgehensweise - anders als in einem MBR/MPT System - dabei nämlich kein grub.cfg-file erzeugt.

Bei einer grub-Installation in einen (partitionstechnisch freigehaltenen) "PBR" werden

  1. unerwünschten Einträgen im nvram nicht verhindert, somit sind die dann genau wie bei Windows nachträglich zu entfernen

  2. gibt es eine Fehlermeldung

    Fehler: Enviroment-Block ist zu klein
    Beliebige Taste drücken, um fortzusetzen...

    die allerdings bei 2MB freiem Platz vor der Partition nicht auftritt.

Benutzung des stand-alone grub und Einschränkungen

Je nach dem, in welchem Modus dieser flashkey oder die entsprechende Platte gestartet wird (EFI/legacy) kann man vom Menü aus unterschiedliche O/S starten

  • EFI-Modus

    • alle O/S, die im EFI-Modus installiert wurden, können mit den üblichen Verfahren von grub aus geladen werden.

    • O/S, welche auf einer weiteren Platte im BIOS-Modus installiert wurden

      • Windows O/S: nein

      • Linux O/S: ja (insmod part_msdos erforderlich)

  • BIOS/legacy-Modus

    • nur im BIOS/legacy-Modus installierte O/S können gebootet werden

Problembehebung

  1. Beim Partitionieren - besonders wenn ein und derselbe flashkey wechselweise mit msdos und GPT Tabelle verwendet werden soll, ist ein vollständiges Löschen (dd if=/dev/zero...) opportun. Alternativ kann dazu auch gdisk verwendet werden (sudo gdisk /dev/sdXxz). Änderungen müssen dem kernel mitgeteilt werden; reboot oder partprobe /dev/sdx.

  2. der flashkey ID-2: USB /dev/sdb model: USB_DISK size: 4.0GB konnte mit gdisk nicht richtig partitioniert werden, Partitionen 2 und 3 blieben unformatiert trotz entsprechender Angabe. Wurde mit gparted nachgeholt.

  3. der flashkey ID-1: USB /dev/sda model: Cruzer size: 8.1GB bootet am Thinkpad 520 im EFI Modus, nicht aber im legacy Mode. Am TMH 4440 und auch an einem Acer Aspire 5670 bootet er im BIOS-Modus

  4. der flashkey ID-3: USB /dev/sdc model: Slim_Line size: 61.9GB bootet überhaupt nicht am Thinkpad 520, wohl aber im BIOS Modus am TMH 4440.

  5. bei einer Installation im EFI-Modus von Xerial Xenus auf einer leeren Platte wird nicht automatisch eine erforderliche esp angelegt, dieses ist entsprechend von Hand vorzubereiten.

  6. mit der neuen Version grub 2.04 (Ubuntu Focal Fossa) ist zum Booten eines iso-files mittels loopback auf einem Rechner im EFI Modus eine Zeile rmmod tpm im entsprechenden menuentry zwingend erforderlich.

  7. im EFI Modus gibt es (wenn bei der Installation ein von /boot/ abweichendes Verzeichnis verwendet wird) beim Start eine Fehlermeldung, die aber keinen Einfluß auf die Funktionfähigkeit hat

    error: file'/boot/' not found # verwendet wird ein Verzeichnis "/boot-efi"
    error: no such device: /.disk/info.
    error: no such device: ./disk/mini-info

Anhang

Anbei ein minimales Image "EWMS.img" eines USB flashkey EWMS-1 ⮷ und EWMS-2 ⮷. Zu verwenden, wie in der Diskussion beschrieben. Achtung: Als Ergebnis sieht der flashkey anders aus, als im Artikel beschrieben. grub-efi und grub-legacy befinden sich beide in der esp in unterschiedlichen Verzeichnissen. Die zugehörigen grub.cfg haben jeweils nur einen Eintrag auf grub.cfg in Partition 2.

intern

extern

Diese Revision wurde am 23. April 2022 17:29 von black_tencate erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Hybrid MBR, GPT auf USB, GRUB_2, stand-alone grub, Bootloader, Live-USB, BIOS, persistent, EFI