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:
Ubuntu 22.04 Jammy Jellyfish
Ubuntu 20.04 Focal Fossa
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.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
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.
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:
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.
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 Programme
gparted
undgdisk
sind im LiveSystem vorhandengrub-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 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 | - | ||
2 | fat12/16/32 | 50M | esp | - | ||
3 | grub-lesbar (→ File-system_support) | 50M | - | beliebig | ||
4 | und weitere Partition(en) z.B. für die iso-Datei, casper-rw usw. später |
→ 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 und entsprechender Auswahl.
Alternative Einrichtung mit gdisk
▶ entspr._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.).
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"
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 diesesgrub.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
Windows Boot Manager inaktiv setzen
sudo efibootmgr -b <hex#> -A
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
unerwünschten Einträgen im nvram nicht verhindert, somit sind die dann genau wie bei Windows nachträglich zu entfernen
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¶
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 auchgdisk
verwendet werden (sudo gdisk /dev/sdX
→x
→z
). Änderungen müssen dem kernel mitgeteilt werden;reboot
oderpartprobe /dev/sdx
.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 mitgparted
nachgeholt.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
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.
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.mit der neuen Version
grub 2.04
(Ubuntu Focal Fossa) ist zum Booten eines iso-files mittelsloopback
auf einem Rechner im EFI Modus eine Zeilermmod tpm
im entsprechenden menuentry zwingend erforderlich.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.
Links¶
intern¶
extern¶