Änderungen an den GRUB 2-Konfigurationsdateien sollten stets nur mit Bedacht durchgeführt werden, weil im schlimmsten Fall das System danach nicht mehr richtig startet.
Daher sollte vor Experimenten mit der Datei /etc/default/grub und vor allem mit den Skripten in /etc/grub.d ein Backup angelegt werden!
Außerdem hilft in einem solchen Fall der Artikel GRUB 2/Reparatur weiter.
Ubuntu 11.10 „Oneiric Ocelot“
Ubuntu 10.04 „Lucid Lynx“
GRUB 2 ist zur Zeit noch in der Entwicklung. Hinweise auf tatsächliche Gegebenheiten können daher noch fehlen bzw. nach einem Update nicht mehr zutreffen. Den Autoren bekannte Abweichungen zwischen den einzelnen Versionen
1.98-1 für Lucid Lynx
1.98+20100804 für Maverick Meerkat
1.99~rc1 für Natty Narwhal
1.99-12ubuntu5 für Oneiric Ocelot
sind gekennzeichnet und wenn erforderlich, auch beschrieben.
Grundsätzlich ist GRUB 2 von seinen Machern so konzipiert, dass es, sobald das Kommando update-grub
bzw. grub-mkconfig
ausgeführt wird, alle auf einem Computer installierten Betriebssysteme findet und automatisch in das Auswahlmenü aufnimmt. Eine manuelle Konfiguration von GRUB 2 ist für die grundlegende Funktionalität daher nicht notwendig.
Möchte man GRUB 2 trotzdem manuell anpassen - und sei es auch nur aus optischen Gesichtspunkten - so geschieht das über die Datei /etc/default/grub und über die Skripte im Verzeichnis /etc/grub.d. Über die Datei grub kann man einige grundlegende Einstellungen vornehmen, die Skripte sind für aufwendigere Anpassungen aber auch für individuelle Menü-Einträge gedacht.
Mit dem Grub Customizer existiert ein grafisches Konfigurationswerkzeug.
Die Datei /etc/default/grub ist eine simple Textdatei, die direkt nach der Installation in aller Regel wie folgt aussieht:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # This file is sourced by update-grub, and its variables are propagated # to its children in /etc/grub.d/ GRUB_DEFAULT=0 #GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT="3" GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMDLINE_LINUX="" # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL=console # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' #GRUB_GFXMODE=640x480 # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID="true" # Uncomment to disable generation of recovery mode menu entrys ## Bis GRUB 1.98 #GRUB_DISABLE_LINUX_RECOVERY="true" ## Ab GRUB 1.99 #GRUB_DISABLE_RECOVERY="true" # Uncomment to get a beep at grub start #GRUB_INIT_TUNE="480 440 1" |
Die rosa Textzeilen stellen aktive Einstellungen dar. Mittels der #
werden Einstellungen auskommentiert und damit deaktiviert.
Die Datei wird mit einem Editor [3] mit Rootrechten bearbeitet. Am Beispiel gedit in Ubuntu führt man dafür folgendes Kommando aus:
gksudo gedit /etc/default/grub
In Kubuntu muss es z.B. entsprechend lauten:
kdesudo kate /etc/default/grub
Variable in der /etc/default/grub | ||
Variable | Wert | Bedeutung |
GRUB_DEFAULT= | Zahl | Gibt an, welcher Eintrag im Menü standardmäßig hervorgehoben wird. Dieser Eintrag wird geladen, falls keine andere Auswahl getroffen wird. Die Zählung beginnt mit 0. Der dritte Eintrag im Menü würde also durch eine 2 hervorgehoben. Diese Vorgabe ist statisch. |
"xxx " | Wählt den Eintrag mit der exakten Bezeichnung, z.B. Ubuntu, mit Linux 2.6.32-25-generic als Standard aus. Diese Vorgabe ist statisch. | |
saved | Trägt man anstelle eines Zahlenwertes (siehe Kasten oben) den Wert saved ein, so wird Grub veranlasst, den in /boot/grub/grubenv gespeicherten Menüeintrag auszulesen und als Vorgabe zu verwenden, unabhängig davon, ob die Reihenfolge inzwischen durch ein Kernel-Update oder durch eigene Skripte verändert wurde. Siehe auch nächsten Kasten GRUB_SAVEDEFAULT . | |
GRUB_SAVEDEFAULT= | true | Wird diese Variable mit true nachgetragen, so wird für alle mit 10_linux ausgewählten Kerneleinträge aus dem Verzeichnis /boot die Möglichkeit geschaffen, den mittels der Tasten
↓ bzw.
↑ ausgewählten und mit
⏎ bestätigten Menüeintrag als Vorgabe für den nächsten Start abzuspeichern. Es muss GRUB_DEFAULT=saved gesetzt sein, damit dieses ausgewertet wird (siehe Kasten oben und die Hinweise unter grubenv). |
GRUB_HIDDEN_TIMEOUT | Zahl | Diese Funktion sollte mit einer vorangestellten Raute (# ) anstelle einem Wert = 0 (Null) unwirksam gemacht werden. Achtung!Wurde |
GRUB_HIDDEN_TIMEOUT_QUIET= | true | Wenn dieser Wert auf ´false´ gesetzt, so wird nur der unter GRUB_HIDDEN_TIMEOUT eingestellte Wert auf dem Monitor als Countdown angezeigt. Mit der
⇧ -Taste kann das Auswahlmenü innerhalb der Zeitspanne sichtbar gemacht werden. |
GRUB_RECORDFAIL_TIMEOUT= | Zahl | Ein Zahlenwert gibt die Zeit in Sekunden an, wie lange das Auswahlmenü angezeigt wird, wenn es beim Start ein Problem gibt. Im Normalfall fehlt dieser Eintrag, was dazu führt, dass im Falle eines Fehlers das Auswahlmenü unbegrenzt erscheint und auf die Auswahl durch den Benutzer gewartet wird. Bei Servern ist das in der Regel ein Problem, da beispielsweise bei einem Stromausfall oder einem Systemfehler kein automatischer Boot-Up mehr durchgeführt wird, sondern der Boot-Up im Grub-2 Auswahlmenü hängen bleibt. Diese Variable wird im Skript 00_header ausgewertet. |
GRUB_TIMEOUT= | Zahl | Ein Zahlenwert gibt die Zeit in Sekunden an, wie lange das Auswahlmenü angezeigt wird, bevor der Standard-Eintrag geladen wird. Bei 0 wird direkt der unter GRUB_DEFAULT eingestellte Eintrag geladen, ohne dass das Auswahlmenü angezeigt wird, bei -1 wird der Zähler abgeschaltet und man muss den zu ladenden Eintrag immer von Hand wählen. Wurde GRUB_HIDDEN_TIMEOUT aktiviert, ist diese Funktion solange wirkungslos, bis GRUB_HIDDEN_TIMEOUT mit der Umschalt-Taste deaktiviert wird. |
GRUB_DISTRIBUTOR | *** | Generiert Hinweise zur aktuellen Distribution. Hier sollte man keine Korrekturen vornehmen. |
GRUB_CMDLINE_LINUX_DEFAULT= | Text | siehe die Hinweise bei Variable für Kernelzeilen |
GRUB_CMDLINE_LINUX | Text | siehe die Hinweise bei Variable für Kernelzeilen |
#GRUB_TERMINAL= | console | Entfernt man die Raute # , so wird der grafische Modus wie unter GRUB 2/Aussehen beschrieben komplett abgeschaltet (reiner Konsolenmodus). Ein Sonderfall stellt hierbei die Eingabe bzw. Ausgabe über ein serielles Gerät (VT100-Terminal, Modem) dar. Siehe dazu die Hinweise unter Eingabe/Ausgabe auf ein serielles Gerät. Achtung!Wurde ein RAID1-Verbund, von dem gebootet wird, konfiguriert, so sollte diese Zeile auskommentiert werden, da nach 594202 bei einem Ausfall der ersten Platte sonst nicht mehr gebootet werden kann. |
#GRUB_GFXMODE= | 640x400 | Nach dem Entfernen der Raute # kann man mit dieser Einstellung die Auflösung im Grub-Menü einstellen. Standard-Vorgabe ist 640x480 Pixel (große Schrift). Weitere Hinweise zur Ermittlung der möglichen Auflösung findet man unter Auflösung ermitteln. |
GRUB_GFXPAYLOAD_LINUX= | keep | Diese Einstellung bewirkt für die im Verzeichnis /boot vorhandenen Kerneleinträge, dass beim Start die mit GRUB_GFXMODE= eingestellte Schriftgröße für die folgende Monitor-Ausgabe beibehalten wird. |
1280x1024 | Ein Eintrag mit Werten anstelle keep bei GRUB_GFXMODE stellt die Schriftgröße auf diese Werte ein (entspricht dem Eintrag vga=791 von Grub-Legacy). Die für den eigenen Monitor richtigen Werte erhält man mit Auflösung ermitteln. | |
Text ![]() | Ab Natty Narwhal einsetzbar: Falls es mit den beiden obigen Vorgaben Probleme beim Start gibt (schwarzer bzw. verzerrter Bildschirm), dann sollte man diese Vorgabe nehmen. Damit wird auf die Werte aus einer Liste mit problematischen Grafikkarten ("blacklist") zugegriffen. | |
Hinweis:Diese Einstellungen werden in der Regel von Plymouth überschrieben! Entsprechende Einstellungen werden dort erläutert. | ||
#GRUB_DISABLE_LINUX_UUID= | true | Normalerweise übergibt GRUB 2 die Root-Partition mittels UUID an den zu startenden Linux-Kernel. Durch Entfernen der Raute # kann man GRUB 2 dazu veranlassen, dies per Device-Nummerierung (/dev/sdXX) zu machen. |
#GRUB_DISABLE_RECOVERY= | true ![]() | Nach Entfernen der Raute # und setzen auf true werden alle Recovery-Kernel-Einträge im Auswahlmenü deaktiviert. |
#GRUB_DISABLE_LINUX_RECOVERY= | Bis GRUB 1.98 (Oneiric Ocelot) wurde die längere Form der Variablen verwendet. | |
GRUB_DISABLE_OS_PROBER= | true | Wird diese Variable mit true nachgetragen, wird eine erneute Überprüfung auf andere Betriebssysteme auf dem PC bei einem update-grub unterdrückt. Es werden damit in das Grub-Menü nur die im Verzeichnis /boot enthaltenen Kernel-Images sowie eigene Skripte entsprechend der Nummerierung erfasst. |
GRUB_INIT_TUNE= | "480 440 1 " | Hiermit wird ein Ton ausgegeben, sobald das Grub-Menü zur Eingabe bereit steht - auch wenn dieses durch GRUB_HIDDEN_TIMEOUT nicht angezeigt wird. Die dritte Zahl (im Beispiel die 1 ) beeinflusst die Dauer. Alle durch Leerzeichen getrennten Wertegruppen müssen insgesamt von "" eingefasst sein. |
GRUB_THEME= | "/PFAD/ZUR/KONFIGURATIONSDATEI " | Stellt den Pfad zu einem GRUB Thema ein. Siehe dazu GRUB 2/Aussehen - erweiterte Konfiguration. |
Für die Ausgabe des GRUB-Menüs auf ein serielles Ein- bzw. Ausgabegerät (VT100-Terminal, Modem) müssen die nachfolgenden Variablen wie folgt gesetzt werden (fehlende Variablen sind entsprechend nachzutragen, auf die Optionen als solche wird hier nicht eingegangen!):
Terminal Variable in der /etc/default/grub | ||
Variable | Wert | Bedeutung |
GRUB_TERMINAL= | serial | Ersetzt man console mit serial , so wird die Ausgabe auf den seriellen Port umgeleitet - dieser muss von der Hardware her vorhanden, aber nicht notwendigerweise auch belegt sein. |
"console serial" | Setzt man console zusammen mit serial , eingefasst in ", so erfolgt die Ausgabe auf beide Anzeigegeräte. Auch die Bedienbarkeit ist von beiden Geräten alternativ möglich. | |
GRUB_SERIAL_COMMAND= | serial --OPTIONEN | Optionale Einträge zur seriellen Schnittstelle werden hier nach dem =serial jeweils hinter einem Doppel-Minus eingetragen (z.B.: --unit= , --port= , --speed= , --word= , --parity= , --stop= , --device= ). Zum Beispiel |
GRUB_CMDLINE_LINUX= | TEXT | Hier werden ggf. obige Optionen beim Eintrag der Kernelzeile um die relevanten Daten ergänzt (z.B.: serial=ttyS0 console=ttyS0,9600n8 ). |
Die nachfolgenden Variablen sind für die Übergabe von Kernel-Bootoptionen reserviert und werden wie nachfolgend ausgewiesen bei den Images aus dem Verzeichnis /boot angewendet:
Kernel Variable in der /etc/default/grub | ||
Bezeichnung der Variable | Verwendung Bootoption | |
Login-Modus | Recovery-Modus | |
GRUB_CMDLINE_LINUX= | Ja | Ja |
GRUB_CMDLINE_LINUX_EXTRA= | Ja | Nein |
GRUB_CMDLINE_LINUX_DEFAULT= | Ja | Nein |
Diese Variablen können auch bei der Erstellung der eigenen Skripte eingesetzt werden.
Will man weitere Variablen z.B. auch für die eigenen Skripte übergeben, so ergänzt man je die
eigene Variable in der /etc/default/grub | ||
Setzen | Variable | Wert |
export | GRUB_MEINE_VARIABLE= | "meine Information" |
Die Menü-Einträge zur Auswahl des zu startenden Betriebssystems und auch das genaue grafische Erscheinungsbild werden bei GRUB 2 über die Skripte im Verzeichnis /etc/grub.d konfiguriert. Standardmäßig sind dort die folgenden Skripte enthalten:
00_header 05_debian_theme 10_linux 20_memtest86+ 30_os-prober 40_custom
Ab Ubuntu 10.10 sind noch folgende Skripte verfügbar:
20_linux_xen 41_custom
Für die Installation mit Wubi steht dieses spezielle Skript zusätzlich zur Verfügung:
10_lupin
welches anstelle von 10_linux zum Booten der Datei root.disk benutzt wird.
Daneben können aber auch eigene Skripte erstellt werden. Dies ist auch grundsätzlich der Bearbeitung bzw. Veränderung eines vorhandenen Standard-Eintrages vorzuziehen. Dazu siehe die ausführlichen Beschreibungen unter GRUB 2/Skripte.
Wie man sieht, werden die Skriptnamen von einer Nummer (XX_) angeführt. Die Skripte werden aufsteigend dieser Nummer entsprechend abgearbeitet. Haben zwei Skripte die gleiche Nummer, so bestimmt deren weitere alphanumerische Reihenfolge die Abarbeitung.
Ein Skript mit der Bezeichnung 10_eigenes (Skript) wird vor 10_linux zur Abarbeitung aufgerufen. Auf diese Weise lässt sich die Reihenfolge der Menü-Einträge beeinflussen.
Ein Klassiker dabei ist es, im Verzeichnis /etc/grub.d/ die Datei 30_os-prober in 09_os-prober umzubenennen, um so die Windowseinträge vor den Linuxeinträgen anzuordnen.
Die nachfolgenden Beschreibungen der /boot/grub/grub.cfg dienen ausschließlich dazu, die Ergebnisse nach einem Eingriff in die Datei /etc/default/grub oder durch den Einsatz von eigenen Skripten zu überprüfen. Eine Bearbeitung dieser Datei ist zwar grundsätzlich möglich, sollte aber (nur zum Testen) der letzte Schritt sein.
Es wird der Inhalt der Datei /boot/grub/grub.cfg beschrieben, wie dieser sich nach einer nicht nachbehandelten Installation darstellt. Dabei kann der Pfad zu dieser Datei in Abhängigkeit von der Partitionierung (getrennte Bootpartition) abweichen. Unterschiede bei den Informationen sind immer dann zu erwarten, wenn man die Ergebnisse der Skripte von 10_linux bzw. 30_os-prober sich ansieht. Insbesondere sind die beispielhaften Eintragungen (hd0,3)
bzw. der UUID nur als solche anzusehen und werden im jeweiligen System abweichen.
Jeder Eintrag wird von einer ###BEGIN-
bzw. ###END
-Sequenz eingefasst, aus der man auch das Skript ablesen kann, welches für den Inhalt dieses Teil-Abschnittes abgearbeitet wurde.
Ohne nachfolgend näher auf die detaillierten Inhalte einzugehen, werden hier die erforderlichen, allgemeinen Befehle und Funktionen bereitgestellt, die das GRUB-2-Basisprogramm benötigt. Dabei sind einige Befehle fest im GRUB-2-Basisprogramm verankert, die als ladbare Images (*.img) im Verzeichnis /boot/grub/ vorliegen, andere hingegen sind in Form von <Befehl>.mod
dort abgelegt.
Das Skript /etc/grub.d/00_header liefert in Abhängigkeit von den
Einstellungen in der /etc/default/grub | ||
Variable | Wert | |
GRUB_DEFAULT= | 0 | |
GRUB_TIMEOUT= | 7 | |
GRUB_GFXMODE= | 800x600x16 |
folgendes Ergebnis:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | ### BEGIN /etc/grub.d/00_header ### if [ -s $prefix/grubenv ]; then load_env fi set default="0" if [ ${prev_saved_entry} ]; then set saved_entry=${prev_saved_entry} save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true fi function savedefault { if [ -z ${boot_once} ]; then saved_entry=${chosen} save_env saved_entry fi } function recordfail { set recordfail=1 if [ -n ${have_grubenv} ]; then if [ -z ${boot_once} ]; then save_env recordfail; fi; fi } insmod ext2 set root='(hd0,3)' search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 if loadfont /usr/share/grub/unicode.pf2 ; then set gfxmode=800x600x16 insmod gfxterm insmod vbe if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod that don't # understand terminal_output terminal gfxterm fi fi insmod ext2 set root='(hd0,3)' search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 set locale_dir=($root)/boot/grub/locale set lang=de insmod gettext if [ ${recordfail} = 1 ]; then set timeout=-1 else set timeout=7 fi ### END /etc/grub.d/00_header ### |
Bei einem Btrfs-Dateisystem und integriertem /boot-Verzeichnis ändern sich die obige Zeile 28 bzw. Zeile 41 in einer Standardinstallation wie folgt
if loadfont /usr/share/grub/unicode.pf2 ; then --> if loadfont /@/usr/share/grub/unicode.pf2 ; then ... set locale_dir=($root)/boot/grub/locale --> set locale_dir=($root)/@/boot/grub/locale
Das Skript /etc/grub.d/05_debian_theme liefert ohne Nachbearbeitung folgendes Ergebnis, bei dem die Zeilen der Auswahl vom Bootloader mit weißer Schrift auf schwarzen Hintergrund zur Anzeige gebracht werden, der hervorgehobene Eintrag dagegen mit schwarzer Schrift auf hellgrauem Hintergrund:
### BEGIN /etc/grub.d/05_debian_theme ### set menu_color_normal=white/black set menu_color_highlight=black/light-gray ### END /etc/grub.d/05_debian_theme ###
Man kann das Grub-Menü anpassen, entsprechende Informationen und Einstellungen sind unter GRUB 2/Aussehen beschrieben. Danach sieht dieser Abschnitt dann z.B. wie folgt aus:
### BEGIN /etc/grub.d/05_debian_theme ### insmod ext2 set root='(hd0,3)' search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 insmod png if background_image /boot/grub/grub_menu.png ; then set color_normal=black/black set color_highlight=white/light-gray else set menu_color_normal=white/black set menu_color_highlight=black/white fi ### END /etc/grub.d/05_debian_theme ###
Bei einem Btrfs-Dateisystem und integriertem /boot-Verzeichnis ändert sich die obige Zeile 6 in einer Standardinstallation wie folgt
if background_image /boot/grub/grub_menu.png ; then --> if background_image /@/boot/grub/grub_menu.png ; then
Das Skript /etc/grub.d/10_linux liefert in Abhängigkeit von den im Verzeichnis /boot vorhandenen Kernel-Images und den
Einstellungen in der /etc/default/grub | ||
Variable | Wert | |
GRUB_SAVEDEFAULT= | true | |
GRUB_CMDLINE_LINUX_DEFAULT= | "quiet splash" | |
GRUB_DISABLE_LINUX_RECOVERY= | false |
folgendes Ergebnis:
menuentry "Ubuntu, with Linux 2.6.31-17-generic" { recordfail savedefault insmod ext2 set root='(hd0,3)' search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 linux /boot/vmlinuz-2.6.31-17-generic root=UUID=ae875d31-cc84-4349-95d7-01a82ad76d61 ro quiet splash initrd /boot/initrd.img-2.6.31-17-generic } menuentry "Ubuntu, with Linux 2.6.31-17-generic (recovery mode)" { recordfail savedefault insmod ext2 set root='(hd0,3)' search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 echo Loading Linux 2.6.31-17-generic ... linux /boot/vmlinuz-2.6.31-17-generic root=UUID=ae875d31-cc84-4349-95d7-01a82ad76d61 ro single echo Loading initial ramdisk ... initrd /boot/initrd.img-2.6.31-17-generic
Setzt man die Variable GRUB_DISABLE_LINUX_RECOVERY=
auf true
, wird der zweite Eintrag für den Recovery Modus unterbunden.
Die Syntax in der obigen Zeile 6 bzw. Zeile 15 ist ab Natty Narwhal grundlegend anders, so dass es bei übergreifenden System (chainloading) zu Fehlern kommen kann. Die Zeile muss dann so aussehen:
search --no-floppy --fs-uuid --set=root ae875d31-cc84-4349-95d7-01a82ad76d61.
Dieses gilt auch für gleichlautende Zeilen in den anderen Skripten.
Ab Natty Narwhal wird nur der neueste Kernel (also der mit der höchsten Versionskennung) im Grub-Menü direkt angezeigt. Alle weiteren Linuxkernel (also die mit niedrigerer Versionskennung) werden in einem Untermenü zusammengefasst. Dieses wird im Grub-Menü wie folgt angezeigt:
Ubuntu, mit Linux 2.6.38-8-generic | ||
Ubuntu, mit Linux 2.6.38-8-generic (Wiederherstellungsmodus) | ||
Previous Linux Versions | ||
Wenn man mit den Pfeiltasten auf die im Beispiel letzte Position im Grub-Menü wechselt und diesen Menüpunkt mit der ⏎ -Taste aufruft, werden (nun nur) die innerhalb dieses Untermenüs angelegten Kernel zur Auswahl angeboten. In der Datei /boot/grub/grub.cfg finden sich dazu nach dem ersten Kernelsatz folgende Zeile:
submenu "Previous Linux versions" { .... andere Menüeinträge ... }
Wichtig sind hier nun die Zeile 1 mit der geschweiften Klammer sowie die Zeile 3, die diese Funktion mit der relevanten geschweiften Klammer abschliesst. Die anderen Menüeinträge liegen, in der oben beschriebenen Aufbereitung, jeweils vollständig dazwischen. Ins Hauptmenü zurück gelangt man durch Betätigen von Esc .
Ab Oneiric Ocelot gibt es u.a. folgende Änderungen, die für das Booten relevant sind.
Der Wiederherstellungsmodus (Recovery Modus) ist per Default auf eine eingeschränkte, read-only Version voreingestellt, in der man zwar relevante Festplattentest o.ä. ausführen kann, jedoch werden alle Schreibzugriffe auf die Datenträger unterbunden. Um in das normale Friendly Recovery zu gelangen, muss hier erst die Option remount
ausgewählt werden. Siehe auch die Beschreibung unter Recovery_Modus.
Es kann das Btrfs-Dateisystem eingesetzt werden. Es ändern sich dadurch die Kernelzeilen für die /boot/grub/grub.cfg, abhängig ob es ein integriertes /boot-Verzeichnis gibt oder eine getrennte /boot-Partition.
Bei einem Btrfs-Dateisystem und integriertem /boot-Verzeichnis ändern sich die obige Zeile 6 Zeile 8 in einer Standardinstallation wie folgt. Die Änderungen im Recovery Modus sind sinngemäß.
1 2 3 4 5 6 7 8 | search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 --> search --no-floppy --fs-uuid --set=root ae875d31-cc84-4349-95d7-01a82ad76d61 linux /boot/vmlinuz-2.6.31-17-generic root=UUID=ae875d31-cc84-4349-95d7-01a82ad76d61 ro quiet splash --> linux /@/boot/vmlinuz-3.0.0-12-generic root=UUID=ae875d31-cc84-4349-95d7-01a82ad76d61 ro rootflags=subvol=@ quiet splash initrd /boot/initrd.img-2.6.31-17-generic --> initrd /@/boot/initrd.img-3.0.0-12-generic |
Dieses Skript ist erst ab Maverick Meerkat (10.10) verfügbar:
Das Skript /etc/grub.d/20_linux_xen ist vergleichbar mit dem Skript /etc/10_linux, nur das es die Besonderheiten eines "XEN virtual servers" berücksichtigt und entsprechende Parameter abfragt und in die /boot/grub/grub.cfg einsetzt.
Das Skript /etc/grub.d/20_memtest86+ liefert folgende Einträge, die zum Testen des RAM-Speichers dienen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ### BEGIN /etc/grub.d/20_memtest86+ ### menuentry "Memory test (memtest86+)" { insmod ext2 set root='(hd0,3)' search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 linux16 /boot/memtest86+.bin } menuentry "Memory test (memtest86+, serial console 115200)" { insmod ext2 set root='(hd0,3)' search --no-floppy --fs-uuid --set ae875d31-cc84-4349-95d7-01a82ad76d61 linux16 /boot/memtest86+.bin console=ttyS0,115200n8 } ### END /etc/grub.d/20_memtest86+ ### |
Bei einem Btrfs-Dateisystem und integriertem /boot-Verzeichnis ändern sich die obige Zeile 6 bzw. Zeile 12 in einer Standardinstallation wie folgt.
linux16 /boot/memtest86+.bin --> linux16 /@/boot/memtest86+.bin ... linux16 /boot/memtest86+.bin console=ttyS0,115200n8 --> linux16 /@/boot/memtest86+.bin console=ttyS0,115200n8
Das Skript /etc/grub.d/30_os-prober überprüft alle angeschlossenen (und erkannten) Datenträger darauf hin, ob fertige Menü-Einträge, andere Kernel-Images oder Betriebssysteme vorhanden sind und liefert ohne Nachbearbeitung folgende beispielhafte Information:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ### BEGIN /etc/grub.d/30_os-prober ### menuentry "Windows NT/2000/XP (on /dev/sda1)" { savedefault insmod ntfs set root='(hd0,1)' search --no-floppy --fs-uuid --set 265585bd5150c55f drivemap -s (hd0) ${root} chainloader +1 } menuentry "Ubuntu, with Linux 2.6.32-12-generic-pae (on /dev/sda6)" { savedefault insmod ext2 set root='(hd0,6)' search --no-floppy --fs-uuid --set 843c4345-0c0a-4df6-8abe-8114b06393b2 linux /boot/vmlinuz-2.6.32-12-generic-pae root=UUID=843c4345-0c0a-4df6-8abe-8114b06393b2 ro quiet splash initrd /boot/initrd.img-2.6.32-12-generic-pae ### END /etc/grub.d/30_os-prober ### |
Dieser Vorgang kann je nach der Anzahl sowie Größe der Datenträger und der jeweils gefundenen Partitionen durchaus länger andauern. Um dieses ggf. abzukürzen, kann man diese Sequenz durch Hinzufügen der Variable GRUB_DISABLE_OS_PROBER=true
in der Datei /etc/default/grub unterbinden.
Die Ausgabe von 30_os-prober kann auch dazu genutzt werden, die für die eigenen Skripte erforderliche Syntax sowie z.B. um die relevanten Daten für (hd0,6)
bzw. UUID
abzufragen. Die ausgegebenen Sequenzen kann man als Kopie (Vorlage) aus der generierten grub.cfg zum Erstellen von Skripten als Referenz / Beispiel nutzen.
Mittels des Skriptes 30_os-prober und den folgenden
Einstellungen in der /etc/default/grub | ||
Variable | Wert | |
GRUB_DISABLE_OS_PROBER= | true | |
GRUB_HIDDEN_TIMOUT= | 5 | |
GRUB_HIDDEN_TIMEOUT_QUIET= | false |
wird eine Countdown-Sequenz für die /boot/grub/grub.cfg erstellt:
1 2 3 4 5 6 7 | ### BEGIN /etc/grub.d/30_os-prober ### if [ ${timeout} != -1 ]; then if sleep --interruptible 5 ; then set timeout=0 fi fi ### END /etc/grub.d/30_os-prober ### |
Damit wird nun anstelle des Grub-Menüs ein Countdown in Form von "_ 2" auf dem Monitor oben links angezeigt. Diesen Countdown kann man mit der
⏎ - bzw.
Esc -Taste abbrechen und damit das Grub-Menü zur Anzeige bringen. Wenn man neben den Kerneleinträgen aus dem Verzeichnis /boot weitere Betriebssysteme einbinden will, so darf die oben beschriebene Funktion mittels GRUB_DISABLE_OS_PROBER=true
nur verwendet werden, wenn man gleichzeitig für diese anderen Betriebssysteme eigene Skripte erstellt und einbindet.
Ohne obige Sequenz in der einen oder anderen Variante kann man das Bootmenü nach der Aktivierung von GRUB_HIDDEN_TIMEOUT
nicht mehr sichtbar machen.
Entsprechend der
Einstellungen in der /etc/default/grub | ||
Variable | Wert | |
GRUB_TIMEOUT= | 10 |
wird danach für diesen ausgewählten Zeitraum das Grub-Menü angezeigt.
Das Skript /etc/grub.d/40_custom liefert ohne Nachbearbeitung folgende Information:
1 2 3 4 5 | ### BEGIN /etc/grub.d/40_custom ### # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. ### END /etc/grub.d/40_custom ### |
Wobei die Übersetzung sinngemäß lautet:
# Diese Datei bietet einen einfachen Weg, eigene Menü-Einträge hinzuzufügen. # Füge die gewünschten Menü-Einträge einfach unterhalb dieses Kommentars ein. # Achte darauf, die Zeile oben mit 'exec tail' nicht zu verändern.
Dieses Skript ist erst ab Maverick Meerkat (10.10) verfügbar:
Das Skript /etc/grub.d/41_custom liefert ohne Nachbearbeitung folgende Information:
1 2 3 | if [ -f \$prefix/custom.cfg ]; then source \$prefix/custom.cfg; fi |
und kann zum Laden einer eigenen Konfigurationsdatei beliebigen Inhaltes benutzt werden, die unter
/boot/grub/
abgelegt wurde. Die Bezeichnung prefix
ist die relevante standardmäßige Umsetzung des jeweiligen Pfades zu dieser Datei und wird automatisch beim Booten gesetzt. Für ein System mit integriertem Verzeichnis auf:
(hd0,1)/boot/grub/
bzw. bei getrennter Bootpartition auf:
(hd0,5)/grub
Die jeweils zutreffende Partition wird dabei vom System selbstständig eingetragen.
Weitere Hinweise zur Erstellung eigener Skripte und den Möglichkeiten und Erfordernissen sind in den Beschreibungen unter GRUB 2/Skripte nachzulesen.
Die Festplatten werden im System (hardwaremäßig) in der Regel nach der Zuordnung zu den SATA- bzw. IDE-Ports eingeordnet und damit die Reihenfolge festgelegt. Die Auswahl bzw. Zuordnung im BIOS, von welcher dieser Festplatten als "erste" Festplatte gebootet wird, hat hierauf keinen Einfluss. Ein nicht belegter Port wird in der Auflistung ausgelassen.
Die Bezeichnung in GRUB 2 wird fortlaufend vergeben, d.h. bei fehlender Platte in einem der Hardware-Ports erhält die niedrigste die Zuordnung (hd0)
. Dieses Verhalten kann zu Problemen führen, wenn z.B. eine Platte vorübergehend aus dem System entfernt wird (z.B.: Datenkabel wird abgezogen) bzw. eine weitere Festplatte eingefügt wird. Die folgende Tabelle stellt Beispiele für die Zuordnung dar:
Portbelegung auf dem Motherboard und Zuordnung | |||
SATA 1 Primär | SATA 1 Sekundär | SATA 2 Primär | SATA 2 Sekundär |
/dev/sda = (hd0) | --- | /dev/sdb = (hd1) | --- |
/dev/sda = (hd0) | /dev/sdb = (hd1) | --- | /dev/sdc = (hd2) |
--- | --- | /dev/sda = (hd0) | --- |
GRUB 2 bezeichnet die Festplattenpartitionen mit (hdX,Y)
, dabei ist
X die lfd. Nummern der Festplatte
Y die lfd. Zählnummer der Partition
Die Zählung der Festplatten beginnt immer mit 0, die der Partitionen immer mit 1:
Zu beachten ist, dass die Nummerierung von logischen Laufwerken in einer erweiterten Partition immer bei 5 beginnt - unabhängig von der Anzahl der vorhandenen primären Partitionen und als welche die erweiterte Partition angeordnet wurde.
Die in der grub.cfg ausgewiesene Schreibweise (Zählung) der Partitionen weicht je nach Grub-Version ab:
bis Lucid Lynx = (hd0,1)
Maverick Meerkat = (hd0,msdos1)
Festplatten-Bezeichnung und Zuordnung | ||
Partition | Linux | Grub |
1. Partition auf der X. Platte | /dev/sdX1 | (hdX,1) |
2. Partition auf der X. Platte | /dev/sdX2 | (hdX,2) |
... | ... | ... |
Y. Partition auf der 1. Platte | /dev/sdaY | (hd0,Y) |
Y. Partition auf der 2. Platte | /dev/sdbY | (hd1,Y) |
... | ... | ... |
Wird eine externe Festplatte angeschlossen, so erkennt das System im Terminal bei einem:
sudo fdisk -l
neben z.B: zwei internen Festplatten (/dev/sda und /dev/sdb) diese externe Festplatte als /dev/sdc. Will man hierauf GRUB 2 installieren, so muss als Ziel-Laufwerk im Terminal:
sudo grub-install /dev/sdc
angegeben werden. Nach dem Booten wird nun diese externe Festplatte in der GRUB 2 Konsole bei einem:
ls
zu (hd0) (hd0,1)
usw. je nach Anzahl der Partitionen und auch bei:
set
wird die Boot-Partition entsprechend mit (hd0,x)
angezeigt. Auch wenn im entsprechenden menuentry
als Ziel-Laufwerk z.B.: (hd2,x)
steht.
Beim Entfernen alter Kernel über die Paketverwaltung wird in der Regel ein Update von GRUB 2 durchgeführt, so dass die Einträge auch aus der /boot/grub/grub.cfg gelöscht werden.
Andere Betriebssysteme werden - sofern sie vom Computer gelöscht wurden - aus dem Menü entfernt, indem man nach dem Löschen der Systeme die GRUB-2-Konfiguration updatet.
Möchte man Einträge manuell aus dem GRUB-2-Menü löschen, so hat man mehrere Möglichkeiten:
Man entzieht dem Skript, das die unerwünschten Einträge erstellt, die Ausführbarkeit:
sudo chmod -x /etc/grub.d/20_memtest86+
Das Beispiel entzieht der Datei /etc/grub.d/20_memtest86+ die Ausführbarkeit.
Auskommentieren von Einträgen mittels #
im betreffenden Skript, das den oder die unerwünschten Eintragszeilen enthält.
Man löscht die Einträge aus dem betreffenden Skript.
Kernel-Recovery-Einträge kann man insgesamt durch den Eintrag GRUB_DISABLE_LINUX_RECOVERY=true
in der /etc/default/grub unterdrücken.
Zwei weitere manuelle Lösungsmöglichkeiten befinden sich ausführlich erläutert im Forum. Die erste Variante davon ist einfach und solide, erfordert aber stets manuelles Eingreifen bei Installation weiterer Systeme, die im Bootmenü erscheinen sollen. Die zweite Variante ist ein technischer Kniff ("Workaround"), die besonders elegant und einfach eine Menü-Blacklist erzeugt. Die Erkennung weiterer Systeme funktioniert also weiterhin automatisch, jedoch ohne die unerwünschten Blacklist-Einträge. Allerdings sorgt ein eventuelles Update der GRUB-2-Datei /usr/bin/os-prober dafür, dass wieder alle Einträge einschließlich der Blacklist automatisch erkannt werden. Dann muss man alle Schritte wiederholen, außer der Erstellung der Blacklist.
Nach jeder Änderung an der Datei /etc/default/grub oder an Skripten im Verzeichnis /etc/grub.d, muss die Grubkonfiguration - die in der Datei /boot/grub/grub.cfg gespeichert ist - aktualisiert werden. Andernfalls werden Änderungen beim nächsten Systemstart nicht sichtbar.
Um eine Information darüber zu erhalten, wie die Datei /boot/grub/grub.cfg mit den momentanen Einstellungen aussieht, gibt man im Terminal [1] ein:
sudo grub-mkconfig
(siehe auch GRUB 2/Terminalbefehle) und kann dann das Ergebnis überprüfen. Dieses wird noch nicht in die Grub-Konfiguration übernommen. Ist man mit dem Ergebnis zufrieden, so kann man mit
sudo update-grub
die Datei /boot/grub/grub.cfg neu schreiben lassen. Nähere Informationen siehe unter GRUB 2/Terminalbefehle
Die Datei /boot/grub/grubenv ist nur wirksam, wenn bei den Optionen von /etc/default/grub die Variable GRUB_DEFAULT=saved
gesetzt ist.
Hatte man Probleme beim Starten mit einem Menüeintrag oder kommt man wegen falscher Einstellungen in der Datei /etc/default/grub bei den Werten GRUB_DEFAULT
bzw. GRUB_TIMEOUT
oder anderer Fehler nicht ins Grub-Menü, so kann man die Datei /boot/grub/grubenv auch vom Desktop her in einem Terminal [1] neu konfigurieren.
Will man dagegen einem bestimmten Eintrag beim nächsten Start des Rechners verwenden, so kann man die Datei /boot/grub/grubenv vom Desktop her in einem Terminal [1] entsprechend einrichten, so dass dieser Eintrag einmalig aufgerufen wird. Der nächste Start erfolgt dann wieder mit dem vorher gespeicherten Eintrag.
Das nachfolgend Beschriebene ist erst ab Lucid Lynx (10.04 LTS) anwendbar!
Um zumindest einen einfachen Schutz vor einer Manipulation des GRUB-Menüs zur Laufzeit zu erhalten, kann man die Bearbeitung insgesamt (Superuser-Rechte) bzw. die Auswahl einzelner Menü-Einträge durch ein Passwort absichern.
Dieses kann von einen geübten Linux-Anwender ohne Probleme umgangen werden - jedoch braucht man dafür eine gewisse Zeit, in der man ungestört arbeiten kann und weitere Hilfsmittel. Wenn der Rechner in fremde Hände fällt, ist das nachfolgend Beschriebene ohnehin keine Barriere.
Dazu muss die Sequenz - wie unter Terminalbefehle beschrieben - im Terminal [1] mit dem Befehl:
grub-mkpasswd-pbkdf2 [Optionen]
erstellt und an geeigneter Stelle für die Datei /boot/grub/grub.cfg aufbereitet werden. Nachfolgend wird nur der grundsätzliche Aufbau aufgezeigt, der für das generelle Sperren des Grub-Menüs insgesamt bzw. von Menü-Einträgen im Einzelnen erforderlich ist:
1 2 3 4 5 | export superusers set superusers="BENUTZERNAME-1" password_pbkdf2 <BENUTZERNAME-1> grub.pbkdf2.sha512.10000.<salted.passwd> password_pbkdf2 <BENUTZERNAME-2> grub.pbkdf2.sha512.10000.<salted.passwd> password <BENUTZERNAME-3> MeinPasswort |
Die Zeilen eins (1) bis drei (3) sind obligatorisch, weitere Zeilen (ab vier (4) alternativ) und bedeuten:
Absicherung des Grub-Menü | ||
Zeile | Befehl | Wertvorgabe/Bedeutung |
Zeile 1 | export superusers | Diese Variable für alle Bereich deklarieren - dieses ist zwingend erforderlich, damit z.B. die Funktion Untermenü richtig ausgewertet wird. |
Zeile 2 | set superusers= | Auflistung der Benutzernamen der Superuser, jeder getrennt durch ein Leerzeichen, insgesamt eingefasst durch Hochkommas. Nur diese Benutzer-Namen erhalten Superuser-Rechte. |
Zeile 3 | password_pbkdf2 | Benutzername jeweils getrennt mit einem Leerzeichen, gefolgt von der generierten Schlüssel-Information |
Zeile 4 | password_pbkdf2 | Für jeden (weiteren) Benutzernamen eine Zeile mit den jeweils generierten Schlüssel-Informationen |
Zeile 5 | password | Für jeden (weiteren) Benutzernamen eine Zeile mit den jeweils im Klartext abgelegten Passwort. Achtung!Nicht empfehlenswert, da sehr unsicher! |
Es bietet sich hierfür die Datei /etc/grub.d/40_custom an, in die man obige Einträge direkt einbringt.
Es ist aber auch eine Trennung dieser Daten von der Datei /boot/grub/grub.cfg möglich. Dazu erstellt man für obige Einträge die Datei pbkdf2.lst und legt diese im Verzeichnis /boot/ ab. Aufgerufen wird das dann beim Booten mittels:
1 2 3 | if [ -f /boot/pbkdf2.lst ]; then source /boot/pbkdf2.lst fi |
welches als Eintrag in der /etc/grub.d/40_custom oder in einem eigenen Skript eingebracht wird.
Die Bezeichnung der Datei bzw. auch das Verzeichnis können frei gewählt werden, müssen aber vom Bootloader erreichbar sein. Dann muss auch anstelle von /boot
==> \$root/Pfad_zur_Datei
im Skript verwendet werden!
Bis Precise sind Menü-Einträge grundsätzlich von allen Benutzern ausführbar, auch nicht authentifizierten Benutzern. Das setzen der Benutzer und Passwörter verhindert folglich nur die Manipulation der Bootparameter. Um einen einzelnen Menü-Eintrag von einer allgemeinen Auswahl auszuschließen, muss dieser (noch manuell) nachbearbeitet werden, damit eine Überprüfung stattfindet. Dazu muss eine vorhandene Titel-Zeile der /boot/grub/grub.cfg wie folgt erweitert werden:
Beispiel zugänglich nur für Superuser
menuentry 'Ubuntu 10.04 Lucid Lynx' --users '' {
Beispiel
zugänglich für Superuser, immer möglich
eingetragene(r) Benutzername(n, getrennt durch Leerzeichen)
menuentry 'Ubuntu 10.04 Lucid Lynx' --users 'BENUTZERNAME' {
Da dieses aber in den Standard-Einträgen nur bis zum nächsten Kernel-Update Bestand hat, sollte man das nur bei eigenen Skripten anwenden bzw. die Einträge für den Recovery Modus deaktivieren (siehe die Hinweise zur Variablen GRUB_DISABLE_LINUX_RECOVERY=true), damit wird zumindest allen schnellen Manipulationen die Basis entzogen.
War der Superuser einmal angemeldet, so ist auch für Andere, die danach Zugriff auf den Rechner haben, jegliche Manipulation möglich!
Ab Quantal sperrt GRUB 2 beim Setzen eines Passworts grundsätzlich alle Einträge und fragt das Superuserpasswort bei jedem Boot ab. Für alle Booteinträge kann dieses Verhalten in /etc/grub.d/10_linux geändert werden, indem die menuentrys --unresticted
oder --user BENUTZERNAME
hinzugefügt werden. Dabei ermöglicht --unresticted
den Boot ohne Passwortabfrage im GRUB, während --user BENUTZERNAME
dem entsprechenden Benutzer das Booten des Eintrags ermöglicht. Zu beachten ist, dass diese Änderungen überschrieben werden, wenn eine Aktualisierung des Pakets für GRUB 2 aufgespielt wird. Die entsprechende Zeile sieht danach wie folgt aus:
echo "menuentry '$(echo "$title" | grub_quote)' --unrestricted ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
oder
echo "menuentry '$(echo "$title" | grub_quote)' --users 'BENUTZERNAME' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
Sollen nur bestimmte Einträge freigeschaltet werden, kann der entsprechende Eintrag in der /boot/grub/grub.cfg geändert werden. Diese Änderung muss jedoch nach jedem Lauf von update-grub
, beispielsweise bei einer Aktualisierung des Linux-Kernel-Pakets wiederholt werden.
menuentry 'Ubuntu, mit Linux 3.5.0-17-generic' --unrestricted {
menuentry 'Ubuntu, mit Linux 3.5.0-17-generic' --users 'BENUTZERNAME' {
Grub 2 Handbuch
Password Protection Passwortschutz für GRUB2
Grub 2 (Title) Tweaks - diverse manuelle Grubanpassungen
Grub Customizer - Grafisches Werkzeug zum Bearbeiten von GRUB2 Einstellungen