GRUB2
 

Leider hat sich mit der Einführung von GRUB2 die Bedienung gegenüber seinem Vorgänger GRUB (wurde mit Einführung von GRUB2 in GRUB legacy umbenannt) grundlegend geändert. Die zentrale Konfigurations-Datei von GRUB namens /boot/grub/menu.lst wurde durch /boot/grub/grub.cfg ersetzt. Öffnet man diese Datei zum editieren, sticht einem sofort der Eintrag:

#
# DO NOT EDIT THIS FILE
#

ins Auge, da diese Datei von update-grub automatisch erstellt wird. In dem Sinne hat das Skript update-grub die gleiche Tätigkeit wie früher. Es sucht nach Betriebssystemen und Kerneln und erstellt automatisch die erforderlichen Menüeinträge für besagte Systeme. Beim alten GRUB wurde so eine menu.lst automatisch erstellt und bei GRUB2 ist es eben besagte grub.cfg. Der grundlegene Unterschied ist allerdings, daß man eigene Anpassungen des Bootloaders beim alten GRUB noch direkt in der Datei menu.lst vornahm, während man bei GRUB2 die Konfigurationsdatei /etc/default/grub für grundlegende Bootloader-Einstellungen editiert und Änderungen in der Menüstruktur mittels Shell-Skripte im Verzeichnis /etc/grub.d vornimmt. Um geänderte Einstellungen zu übernehmen, muß mittels update-grub eine neue grub.cfg geschrieben werden. Daher ist es zwingend erforderlich nach jeder Änderung der Konfiguration den Befehl
# update-grub
auszuführen!
Noch ein wichtiger Hinweis zu den Skripten: Damit sie überhaupt von update-grub berücksichtigt werden und in die grub.cfg aufgenommen werden, müssen sie wie alle Shell-Skripte ausführbar sein! Dies erreicht man mittels des Befehls:
# chmod +x skript

Die Datei /etc/default/grub

In /etc/default/grub kann man die Standardvariablen definieren für das Verhalten oder das Aussehen von GRUB2. Zum Beispiel wählt
GRUB_DEFAULT=0 den ersten Eintrag als Standardmäßig hinterlegt.
GRUB_TIMEOUT=8 die Zeit in Sekunden bis zum laden des Default-Eintrags.
GRUB_GFXMODE= entfernt man die Raute, kann man die Auflösung von GRUB einstellen. Für korrekte Framebuffer-Angaben kann man das Paket hwinfo installieren und sich mittels
# hwinfo --framebuffer
sämtliche zur Verfügung stehenden Auflösungen anzeigen lassen.
GRUB_INIT_TUNE="480 440 1" entfernt man die Raute vor diesem Eintrag wird ein Ton von 1 Sekunde Länge ausgegeben, sobald das Grub-Menü angezeigt wird.

Skripte in /etc/grub.d

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

Nimmt man keinerlei Veränderungen an den Dateien vor, ist GRUB2 so konfiguriert, daß es automatisch versucht sämtliche installierten Betriebssysteme auf dem Rechner zu finden und in das Bootmenü einzutragen.

Ein eigenes GRUB2-Menü

Wie bereits erwähnt, arbeitet GRUB2 mit einer automatischen Generierung der Menüeinträge, was für das eigene System über das Shell-Skript 10_linux erreicht wird. Schaltet man die Automatik nicht vorher ab, werden sämtliche selbsterstellten Einträge nur zusätzlich zum Bootmenü hinzugefügt. Also ist die Vorgehensweise um sein eigenes Bootloader-Menü zu erstellen ein kleiner Umweg: Zuerst sollte man die Automatik abschalten, in dem man besagtes Skript nicht ausführbar macht.
# chmod -x 10_linux
Um das Erfassen von anderen Betriebssystemen als dem eigenem Linux-System zu verhindern, hilft es die entsprechende Variable in der Datei /etc/default/grub anzupassen. Dazu muß der Eintrag
GRUB_DISABLE_OS_PROBER=true
vorhanden sein.
Anschließend kann man seine eigenen Einträge per Skript verfassen. Dabei ist darauf zu achten, daß die Shell-Skripte in der Reihenfolge ihrer Numerierung abgearbeitet werden und so durch die Numerierung die Reihenfolge der Menüeinträge bestimmt wird. Ein Shell-Skript-Eintrag könnte z.B. so aussehen:

#! /bin/sh
set -e

echo "Adding WinXP entry" >&2

cat << EOF
menuentry "Windows XP Professional" {
insmod chain
insmod ntfs
set root='(hd0,1)'
search --no-floppy --fs-uuid --set D4644B4B644B3012
drivemap -s (hd0) \${root}
chainloader +1
}
EOF

Wie man sieht, können benötigte Module mittels insmod durch GRUB2 geladen werden um z.B. überhaupt auf eine Festplatte mit einem fremden Format zugreifen zu können. Warum bei diesem Beispiel (das ich im Internet gefunden habe) die umständliche Lösung mit cat << EOF in das Skript eingebaut wurde, entzieht sich meiner Logik. Sehen wir uns etwas simplere Menüeinträge an, z.B. für ein Debian wheezy System:

40_custom_wheezy

#!/bin/sh
exec tail -n +3 $0
# 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.

menuentry "Debian wheezy 3.2.0-4-amd64" {
set root='(hd4,1)'
linux /boot/vmlinuz-3.2.0-4-amd64 root=UUID=7f625a66-9fc3-4047-8793-5c7e830cec4e ro quiet vga=794
echo 'Initiale Ramdisk wird geladen …'
initrd /boot/initrd.img-3.2.0-4-amd64
}

Wer noch eine menu.lst vom alten Bootloader GRUB im Kopf hat, wird ganz schnell die frappierende Ähnlichkeit mit den ehemaligen Einträgen entdecken. In dem Sinne hat sich eigentlich bei den Menüeinträgen nicht viel geändert. Lediglich die Handhabung des neuen Bootloaders mit den Shell-Skripten und anschließendem update-grub ist grundlegend anders und Bedarf einer Umgewöhnung. Noch drei weitere Beispiele, einmal für einen Debian lenny Eintrag:

41_custom_lenny

#!/bin/sh
exec tail -n +3 $0
# 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.

menuentry "Debian lenny 2.6.32-bpo.5-amd64" {
set root='(hd4,3)'
linux /boot/vmlinuz-2.6.32-bpo.5-amd64 root=UUID=6adb73b1-3b63-4d09-920a-3e53d24b0319 ro quiet vga=794
initrd /boot/initrd.img-2.6.32-bpo.5-amd64
}

Für einen Debian squeeze Eintrag:

43_custom_squeeze_entry

#!/bin/sh
exec tail -n +3 $0
# 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.

menuentry "Debian squeeze 2.6.32-5-amd64" {
set root='(hd4,6)'
linux /boot/vmlinuz-2.6.32-5-amd64 root=UUID=4518890b-679c-48d0-b1ae-f57552059dde ro quiet vga=794
initrd /boot/initrd.img-2.6.32-5-amd64
}

Und zum Abschluß für einen WinXP-Eintrag:

45_winxp_entry

#!/bin/sh
exec tail -n +3 $0

echo "Adding WinXP entry"

menuentry "Windows XP Professional" {
set root=(hd0,1)
chainloader +1
}

Und nicht vergessen: Die Skripte ausführbar machen und anschließend update-grub ausführen!

Ab neueren Versionen von grub2, z.B. 2.02~beta2 unter Debian jessie fügt die Automatik zwei Einträge für das Eigene Linux-System hinzu, einen zum normalen Abstarten des Systems und ein Submenü-Eintrag. Möchte man letzteren nicht haben, hilft unter /etc/default/grub der Eintrag
GRUB_DISABLE_SUBMENU=y

Auch ist es möglich eine eigene default Schriftart für das Menü einzustellen. Dummerweise hat grub2 ein eigenes Schriften-Format, daher muß man mit dem Befehl
# grub-mkfont -s 24 -o /root/DejaVuSans-24.pf2 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
eine vorhandene TrueType-Schrift in das pf2-Format umwandeln. Dabei gibt die Option -s (size) die Größe vor und -o die Ausgabe-Datei. Leider eignen sich nicht alle Schriften für dieses Vorhaben. Gut geeignet sind Schriften mit unicode Zeichensatz. Manche Schriften können eine Orgie von Fehlermeldungen produzieren.

Hat man eine geeignete Schrift gefunden, kopiert man sie in das Verzeichnis /boot/grub/fonts/ und bindet sie mittels folgender Zeile in der /etc/default/grub ein:
GRUB_FONT=/boot/grub/fonts/DejaVuSans-24.pf2


Bootmeldungen beim Systemstart unter Debian Jessie (systemd) behalten

Ab Debian jessie wird anstatt SysVinit systemd als zentrales Systemverwaltungs-Managment verwendet. systemd soll dabei den Vorteil bieten, daß es alle Dienste möglichst gleichzeitig startet um die vorhandenen Rechner-Ressourcen maximal auszunutzen, was zu einem beschleunigten Start des Linux-Systems führt. Ab systemd sind standardmäßig die Bootmeldungen beim Start deaktivert. Möchte man das nicht, weil man schon gerne sehen will, ob beim booten nicht irgendein Fehler vorliegt, muß man dem Kernel den Boot-Parameter systemd.show_status=1 beim booten mitgeben. Dazu editiert man entweder die /etc/default/grub und ergänzt folgenden Parameter
GRUB_CMDLINE_LINUX_DEFAULT="quiet systemd.show_status=1"
oder man editiert das Eigene Start-Skript und fügt den Parameter in der Kernelzeile hinter quiet ein. Allerdings ist die Konsole tty1 standardmäßig so eingestellt, daß alle erscheinenden Meldungen nach dem Start gelöscht werden. Um dieses Verhalten zu unterbinden legt man einen Ordner unter /etc/systemd/system/ entweder mit dem Namen
getty@tty1.service.d/       --- nur für die Konsole tty1
oder mit dem Namen
getty@.service.d/             --- für alle Konsolen
an. In diesem Ordner legt man eine Konfigurations-Datei namens noclear.conf (Der Name ist eigentlich unwichtig und dient lediglich der Wiedererkennung, jedoch muß die Datei zwingend auf .conf enden) an und schreibt folgendes rein:
[Service]
TTYVTDisallocate=no

Natürlich darf man nach Änderung der Kernel-Parameter den Befehl
# update-grub
nicht vergessen.