Skip to main content
Wie schon von einigen hier angemerkt, hat sich mit der Einführung von
Grub2 einiges verändert. Am deutlichsten zu sehen ist dies, dass es die
Datei menu.lst nicht mehr gibt. An ihre Stelle ist die Datei "grub.cfg"
getreten, aber nicht ganz, weil diese Datei zum Editieren nicht mehr
gedacht ist: "DO NOT EDIT THIS FILE" steht in großen Buchstaben gleich
zu Beginn; außerdem ist diese Datei zwar lesbar, hat aber keinerlei
Schreibrechte mehr.
Gleich vorneweg: das folgende wird eine längere Geschichte. Allerdings -
wie ich hoffe - eine informative.
Zuerst: ein Teil des Folgenden kann auch in meinen beiden Mails zu
dieser Thematik nachgelesen werden ([1] und [2]). Um weiters nicht immer
sämtliche Pfade eingeben zu müssen, kurz ein Überblick über die Dateien,
mit denen man es im Großen und Ganzen zu tun bekommt, will man in die
Konfiguration von Grub2 eingreifen (sind aber beileibe nicht alle).
Sämtliche Dateien gehören dem User root. Alle Arbeiten an den Dateien
sind auch unter dieser Kennung (oder jeweils mittels sudo) vorzunehmen.
/boot/grub/grub.csv -r--r--r--
/etc/default/grub -rw-r--r--
/etc/grub.d/
|
00_header -rwxr-xr-x
05_debian_theme -rwxr-xr-x
10_linux -rwxr-xr-x
20_memtest86+ -rwxr-xr-x
30_os-prober -rwxr-xr-x
40_custom -rwxr-xr-x
Die nächste Datei beinhaltet die Definition von Funktionen, die die
Skripte in /etc/grub.d für die Zusammenstellung der Datei "grub.cfg"
benötigen:
/usr/lib/grub/grub-mkconfig_lib -rw-r--r--
Schlußendlich benötigt man noch die Datei, die das alles unter einen Hut
bringt:
/usr/sbin/grub-mkconfig -rwxr-xr-x
Dieses Skript kann man explizit verwenden (»sudo grub-mkconfig
-o /boot/grub/grub.cfg«) oder implizit über den Aufruf: »sudo
update-grub«.
[Man inspiziere einmal /usr/sbin/update-grub. Überraschung!]
Bevor wir mit unserer kleinen Tour durch die Dateien beginnen, werfen
wir noch einen Blick in die Datei "grub.cfg": hier kann man -
gekennzeichnet durch entsprechende Kommentare - die Abschnitte leicht
ausmachen, die durch die verschiedenen Skripte aus /etc/grub.d
"geschrieben" wurden. Ob ein Skript aus erwähntem Dateiverzeichnis einen
Beitrag leistet oder nicht, hängt allein am Ausführungsrecht dieser
Datei. Wird ihr dieses entzogen (»sudo chmod 644 «), so wird sie
von »grub-mkconfig« auch nicht berücksichtigt, wenn die Datei "grub.cfg"
montiert wird. (Siehe dazu auch [2]).
Diese Montage wird durch den Befehl
sudo update-grub
bewerkstelligt.
durchführt, diese bitte sichern !!! >>>>>
Schauen wir uns zuerst ein paar Parameter in der Datei
"grub" (in /etc/default/) an. Sie sind alle in Großbuchstaben und fangen
mit GRUB_ an. Manche sind auskommentiert, wie z.B. der Parameter
GRUB_HIDDEN_TIMEOUT, und viele sind aus grub legacy bereits bekannt, wie
z.B. GRUB_DEFAULT: falls man beim Booten nichts anderes auswählt, wird
der erste Eintrag aus dem Menü angenommen (GRUB_DEFAULT=0). Man kann, so
wie früher auch, einen anderen Zahlenwert einsetzen, um einen anderen
Kernel defaultmäßig zu booten. Schreibt man "saved" (ohne die
Anführungsstriche) anstelle eines Zahlenwertes, so wird beim nächsten
Hochfahren der zuletzt gewählte Menüeintrag genommen. Alternativ dazu
kann man auch einen Menüeintrag (damit ist die Zeichenkette gemeint, die
hinter 'menuentry' in "grub.cfg" kommt, gemeint) selbst angeben. Hier
sind allerdings die Anführungsstriche Pflicht.
Bsp.:
GRUB_DEFAULT="Ubuntu, Linux 2.6.31-16-generic"
Um diesen Wert zu ändern, braucht man aber auch nicht zum Editor zu
greifen. Genausogut kann man das mit dem Befehl »grub-set-default«
bewerkstelligen.
sudo grub-set-default 3
oder
sudo grub-set-default "Ubuntu, Linux 2.6.31-16-generic"
Auf diese Möglichkeit (Parameterwerte mittels Shellaufrufen zu setzen)
gehe ich im Folgenden aber nicht weiter ein.
Die weiteren Parameter wie GRUB_TIMEOUT oder GRUB_CMDLINE_LINUX_DEFAULT
sind auch nicht anders als in grub legacy zu verstehen (entsprechen dort
den Einträgen "timeout" bzw. "defoptions").
Exkurs 1: Einstellen eines (Grub2-)Hintergrundbildes
Bevor wir uns daran machen, ein Hintergrundbild einzustellen, klären wir
die Auflösung des Startbildschirms. Dazu ist es notwendig, beim
Hochfahren in die Kommandozeile von Grub2 zu wechseln. Das geschieht
durch Drücken der Taste "c" wenn der Menübildschirm angezeigt wird. Auf
der Kommandozeile gibt man »vbeinfo« ein und notiert sich die Auflösung.
Mit der Taste "ESC" kommt man wieder zum Bootmenü zurück.
Den Wert der Auflösung trägt man nun in die Datei "grub" ein: der
Parameter dazu heißt GRUB_GFXMODE. Dieser ist defaultmäßig
auskommentiert; also Raute am Zeilenanfang entfernen und den Wert, der
defaultmäßig eingetragen ist, überschreiben.
Bemerkung1: dieser Schritt ist nicht zwingend notwendig ... wenn man
mit einer Schrift der Menüeinträge zufrieden ist, die das
Hintergrundbild ziemlich überdecken.
Bemerkung2: mit der soeben vorgestellten Methode wird zwar die Schrift
kleiner. Wie das funktioniert, den Rahmen um die Menüeinträge
ebenfalls anzupassen, habe ich noch nicht gefunden.
Nun aber zur eigentlichen Aufgabe. Um ein paar Bilder zur Auswahl zu
haben, kann man sich die Grub2 Splashimages herunterladen:
sudo apt-get install grub2-splashimages
und sich daraus eines aussuchen. Oder man hat ein eigenes Bild, das man
als Hintergrundbild verwenden möchte. Im letzten Fall ist noch etwas
Handarbeit angesagt. Am besten man lädt dieses Bild in Gimp und skaliert
es (Bild/Bild skalieren) auf die vorhin ermittelte Auflösung.
Anschließend speichert man das Bild im Format "PGN" oder "TarGA" ab:
Datei/Speichern unter ... .
Im folgenden Dialog vergibt man einen passenden Namen (ohne Endung),
wählt den Ordner und sucht in "Dateityp:Nach Endung" die passende Endung
(png oder tga). Diese Datei kopiert man dann als root in das
Verzeichnis /usr/share/images/grub/ (dieses Verzeichnis ist nicht
zwingend. Ich nehme es, um die Dinge einfach zu halten).
Jetzt sind wir schon fast fertig. Es bleibt nur noch, eine Zeile in der
Datei "05_debian_theme" zu editieren. Genau handelt es sich dabei um die
Zeile Nummer 16:
for i in
{/boot/grub,/usr/share/images/grub}/moreblue-orbit-grub.{png,tga} ; do
Wie man sieht, kommt hier schon das Verzeichnis "/usr/share/images/grub"
vor. Was zu tun bleibt, ist "moreblue-orbit-grub" durch den Namen des
eigenen Bildes, das neuer Hintergrund werden soll, zu ersetzen. Wichtig
dabei ist, dass der Punkt erhalten bleibt. Das sieht dann so aus:
for i in {/boot/grub,/usr/share/images/grub}/.{png,tga} ;
do
Sind wir fertig? Fast. Ein abschließendes »update-grub« fehlt noch.
Zusatz: Es kann u.U. noch notwendig sein, die Schriftfarbe der
Menüeinträge zu ändern, damit sie sich besser vom Hintergrund abheben.
Dies kann man in der Datei "05_debian_theme" in den Zeilen 39 und 40
einstellen. Das geht genauso wie auch schon unter grub legacy.
Exkurs 2: Eigene Einträge in die "grub.cfg"
Wie schon mehrmals erwähnt, ist diese Datei nicht vorgesehen, editiert
zu werden. Man kann dies natürlich tun, man braucht diese Datei ja bloß
für root schreibbar zu machen. Der Nachteil ist, dass diese Datei bei
jedem »update-grub« überschrieben wird. Um hier eigene Einträge quasi
permanent zu hinterlegen, muß Hand an die Dateien in /etc/grub.d gelegt
werden. Entweder man will Einträge gar nicht dabei haben, dann ist den
entsprechenden Dateien das Ausführungsrecht zu entziehen. Oder man will
eigene Einträge einfügen: dann ist die Datei 40_custom dafür zuständig.
Wie das zu handhaben ist, kann aus [2] entnommen werden. Es gäbe zwar
auch hier noch einiges zu sagen, für's erste soll aber das dort bereits
geschriebene genügen.
Bloß eines noch: will man die "recovery" Einträge nicht im Menü haben,
so gibt es dafür keine Datei in /etc/grub.d, der man das x-Bit nehmen
kann. Da muß man wieder in die Datei "grub" und dort das
Kommentarzeichen in der Zeile mit dem Eintrag
GRUB_DISABLE_LINUX_RECOVERY=true entfernen.
Exkurs 3: Eigener Code - Erweiterungen
Bei Durchsicht der Einstellmöglichkeiten ist mir aufgefallen, dass es
keine Möglichkeit gibt, die Anzahl der Kernel im Bootmenü zu beschränken
(das, was früher durch den Parameter "howmany" geregelt wurde).
[Das dürfte schon mal dabei gewesen sein. Zumindest auf
https://help.ubuntu.com/community/StartUpManager
gibt es ein Bild, auf dem unter dem Reiter "Advanced" das einzustellen
ging. Bei mir fehlt das aber jetzt.]
Nun, glücklicherweise kann man das relativ leicht selbst einbauen. Dazu
verschafft man sich als erstes einen Überblick, wie die Shellskripts
arbeiten, um die Datei "grub.cfg" aufzubauen. Unschwer ist dieser Datei
zu entnehmen, dass für den in Frage kommenden Abschnitt die Datei
"10_linux" zuständig ist. Also schauen wir einmal genauer in die Datei
"10_linux" hinein. Interessant sind da die Zeilen 4, 83, 87 und 121.
Warum?
Nun, in Zeile 4 wird eine andere Datei "gesourct" (das bewirkt der Punkt
am Anfang der Zeile); d.h. so ausgeführt, als wäre deren Code an Ort und
Stelle geschrieben. Das ist immer interessant. Schaut man sich einmal
die Datei "grub-mkconfig_lib" an (um die geht es da), so sieht man, dass
hier der Datei "10_linux" etliche Funktionen bereitgestellt werden.
In Zeile 83 wird über eine for-Schleife eine Liste von Namen von
Kerneldateien generiert: alles, was im Verzeichnis /boot zu finden ist,
dessen Name mit "vmlinux" oder "vmlinuz" beginnt u_n_d das den Test
"grub_file_is_not_garbage" besteht. Dieser Test ist nicht in "10_linux"
zu finden, aber sehr wohl wiederum in "grub-mkconfig_lib".
Zeile 87 selbst ist für sich alleine nicht von Interesse. Sie leitet
aber eine "while"_Schleife ein, in der die Informationen, auf die die
Variable "list" verweist, der Reihe nach verarbeitet werden.
Schlußendlich steht in der Zeile 121, wie die Verkürzung des Wertes der
Variablen "list" bewerkstelligt wird.
Also schauen wir uns das einmal ganz genau an:
a) Starten eines Terminals
b) Definition der Funktion »grub_file_is_not_garbage«: einfach die
entsprechenden Zeilen aus "grub-mkconfig_lib" in das Terminal
kopieren und ENTER drücken.
c) Jetzt den Code:
»list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
done`«
aus der Datei "10_linux" (Zeilen 83 bis 85) ausführen (wieder
copy/paste und ENTER)
d) »echo $list« ergibt? (Kommt darauf an, was man in /boot so alles
stehen hat).
e) Schauen wir einmal, was die Funktion »version_find_latest«
bewerkstelligt (denken kann man es sich ja schon, alleine des Namens
wegen). Also definieren wir uns die Funktionen »version_find_latest«
und »version_test_gt« (die zweite Funktion wird in der ersten
benötigt) in der Shell und führen »version_find_latest $list« aus.
Erwartung bestätigt.
f) Nun kann man sich noch in Ruhe anschauen, wie Zeile 121 aus der Datei
"10_linux" den Wert der Variablen "list" verkürzt:
1) »echo $list | tr ' ' '\n'« . Hier werden einfach nur Leerzeichen
in Zeilentrenner umgesetzt. Als Wert der Variablen "list" kommen
ja Dateinamen (ohne Leers) vor, die durch Leerzeichen getrennt
sind.
2) »echo $list | tr ' ' '\n' | grep -vx $linux« . »grep -v« heißt ja,
dass die Zeilen, auf die das Muster nicht (!) paßt, stehen bleiben.
(Der Schalter -x "Wählt nur solche Zeilen aus, deren Treffer die
komplette Zeile umfasst." [Zitat Manpage].)
Achtung: damit das fehlerfrei abläuft ist die Zeichenkette "$linux"
händisch durch die Ausgabe aus e) zu ersetzen. (Oder man setzt
diese Variable vorher entsprechend.)
3) »echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '« verkürzt
also den Wert der Variablen "list" um einen Eintrag und stellt
schlußendlich die ursprüngliche Form wieder her: die Zeilentrenner
werden durch das letzte »tr« wieder in Leerzeichen umgewandelt.
Somit ist klar, wie unsere weitere Vorgehsweise aussieht: wir machen uns
diese Codestücke einfach zu Nutze! Was wir noch brauchen ist eine
Variable, die wie "howmany" wirkt und dann den Code, der im Wert der
Variablen "list" nicht mehr Einträge stehenläßt, als in "howmany"
angegeben. Im Prinzip also folgendes Stückchen Code:
x=0
new_list=""
while [ $x -lt $grub_howmany ]
linux=`version_find_latest $list`
new_list="$new_list $linux"
list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
x=$((x+1))
done
Jetzt stellt sich die Frage: wohin damit? Da hilft ein Blick in die
Datei "grub-mkconfig", Zeile 134 weiter. Hier kommt wieder das
»source«-Kommando zum Einsatz und diesmal ist es die Datei "grub", die
eingelesen wird. Dort stehen aber alle Variablen mit ihren Werten. Also
erweitern wir diese Datei um eine Variable grub_howmany=2 (z.B.) ganz am
Ende. Ich habe den Variablennamen klein geschrieben, weil - wie schon
weiter obern angedeutet - so eine ähnliche Variable in späteren
Versionen zu erwarten ist. Nur um auf der sicheren Seite zu sein.
Nun könnte man obige Zeilen Code in die Datei "10_linux" schreiben. Und
zwar gleich im Anschluß an den Aufbau des Wertes der Variablen
"list" (also ab Zeile 86). Man könnte daraus aber auch eine Funktion
bauen und diese in die Datei "grub-mkconfig_lib" eintragen und in
"10_linux" würde diese Funktion nur mehr aufgerufen. Schöner wäre
natürlich die zweite Lösung. Ich habe mich nach einigen Überlegungen
entschieden, diese Datei (gemeint "grub-mkconfig_lib") im Rahmen dieser
Exkurse nicht anzugreifen.
Einen Wermutstropfen bei dieser Lösung gibt es noch: in der Datei
"grub-mkconfig" werden sämtliche Variablen aus "grub" exportiert. Wir
müssen das direkt noch in "grub" erledigen.
Und noch eine Kleinigkeit fehlt: in grub legacy konnte die Variable
howmany den Wert "all" annehmen. Und was ist, wenn die Variable
überhaupt nicht definiert ist (weil sie z.B. auskommentiert ist). Das
noch einzubauen ist auch keine Kunst. Weiters sollte es kein Malheur
sein, wenn in "grub" als Wert der Variable grub_howmany ein größerer
Wert eingestellt ist, als es Einträge in "$list" gibt).
[Prinzipiell kann alles mögliche - auch negative Zahlen - eingestellt
werden. Entsprechende Prüfungen wurden außen vor gelassen; d.h. ich gehe
davon aus, dass nur ganze Zahlen wie 0,1 2, .... oder "all" eingestellt
wird.]
(Der Code mag jetzt ein bißchen wild aussehen. Aber wenn man das
folgende innerhalb der Kommentarzeichen nach "10_linux" kopiert, dann
stimmen die Zeilenumbrüche wieder.)
# --------------------------------------------------------------------
if [ "x${grub_howmany}" = "x" ] ; then # das mit der "x"-Konvention
habe ich beibehalten
grub_howmany="all" # Ist die Variable nicht definiert, so ist das
gleichbedeutend mit "all"
fi
if [ ${grub_howmany} != "all" ] ; then
anzahl=`echo $list | tr ' ' '\n' | wc -l`
if [ ${grub_howmany} -lt ${anzahl} ] ; then # im anderen Fall bleibt
die Liste wie sie ist
counter=0
while [ ${counter} -lt ${grub_howmany} ] ; do
new_list="${new_list} ${linux}" # im ersten Durchlauf wird hier
ein führendes
# Leerzeichen "eingeschleppt"
counter=$((counter+1))
list=${new_list# } # das führende Leerzeichen entfernen und Resultat
zuweisen
Wie schon erwähnt gehört der eingerahmte Code in die Datei "10_linux",
Zeile 86.
Und das wär's auch schon.
Noch einige Schlußbemerkungen:
a) Ich möchte an der Stelle noch einem hier schon öfters geäußertem
Irrtum entgegentreten. Alles, worum es sich bei diesen Skripten dreht,
hat vorerst n_i_c_h_t_s mit grub(2) zu tun. Das sind Shellskripte wie
1000e andere auch, deren Zweck es ist, eine Textdatei zu erstellen.
Diese Textdatei wird dann von Grub2 beim Hochfahren des Rechners
benötigt. Daran festzumachen ob jetzt grub "fertig" (oder "ausgereift")
ist oder nicht, geht an der Sache vorbei. Da müßte man sich dann schon
das Programm "grub" selber anschauen.
b) Ob die Programme und Skripts, die wiederum Input für grub liefern,
"fertig" sind, ist eine andere Frage. Offensichtlich (siehe Exkurs 3 zu
"howmany") ist da noch einiges offen.
c) Wieder eine andere Frage ist es, ob das Klikibunti dazu ebenfalls
schon fertig ist. Nun, zumindest bei Ubuntu 9.10 gibt es in der
Systemerwaltung einen Menüeintrag zum "StartUp-Manager", der mir (noch?)
nicht geheuer ist. Da scheinen eigene Dateien dahinter zu stecken, weil
die Daten z.B. zur Änderung an der Auflösung offensichtlich nicht aus
der Datei "grub" genommen werden. Und eine Änderung wird auch nicht dort
gespeichert. Der geänderte Wert wird aber dann sehr wohl in die Datei
"grub.cfg" eingetragen.
d) Ich denke nicht, dass es allzu problematisch ist, selbst Hand
anzulegen und/oder eigene Vorstellungen auszuprobieren. Das Ergebnis ist
ja nichts anderes als eine Textdatei (ja, ich weiß: die ist urwichtig.
Aber trotzdem nichts anderes als eine Textdatei). Die kann ja relativ
leicht mit der ursprünglichen verglichen werden. Und ist man sich nicht
wirklich sicher, ob das Ergebnis paßt - nun, man kann ja alles wieder
verwerfen und in den Ausgangszustand zurückkehren: einfach die
Sicherungskopien von allen Dateien, die man verändert hat, wieder
zurückspielen und fertig.
e) Es scheint Grub2 allerdings so stabil zu sein, dass ein paar Einträge
in der Datei "grub.cfg", die so gar nicht hingehören, auch nicht
schaden. Ich hatte nach dem Test grub_howmany=0 in Abschnitt '10_linux'
nur die »echo«-Ausgaben meiner Tests stehen. Dann habe ich den Rechner
ausgeschaltet (irrtümlich :-) ) und ... das Menü wurde angezeigt. Die
Einträge zu Ubuntu 9.10 fehlten klarerweise (wurden ja auf 0 gesetzt),
aber die Einträge zu 9.04 waren da. Von dort gestartet und rüber nach
9.10 die Datei "grub.cfg ausbessern. Beim reboot war alles wieder
paletti.
f) Irgendwie erinnert die Situation rund um Grub2 an alte Zeiten: da gab
es zwar auch funktionierende Programme, die in weiten Teilen das
abdeckten, was man so benötigte. Wenn man aber darüber hinaus etwas
wollte, mußte man sich dann selbst behelfen.
g) Ich hoffe mit diesen Beiträgen zu Grub2 genügend "Starthilfe" für
eigene Erkundungen und/oder Experimente gegeben zu haben. Wie gesagt:
Sicherungskopien erstellen und vor (!) dem Ausschalten des Rechners
vergewissern z.B. durch Vergleich mit dem gesicherten Original, dass mit
"grub.cfg" alles in Ordnung ist.
Verweise:
[1] http://www.easylinux.de/pipermail/ubuntu/2009-December/012889.html
[2] http://www.easylinux.de/pipermail/ubuntu/2009-December/012899.html
--
Franz
_______________________________________________
Ubuntu mailing list
Ubuntu@easylinux.de
http://www.easylinux.de/Kontakt/Mailinglisten/listinfo/ubuntu
Moin Franz,
Am Montag, 7. Dezember 2009 22:34 schrieb Franz Deuzer:
> Wie schon von einigen hier angemerkt, hat sich mit der Einführung von
> Grub2 einiges verändert. Am deutlichsten zu sehen ist dies, dass es die
> Datei menu.lst nicht mehr gibt. An ihre Stelle ist die Datei "grub.cfg"
> getreten, aber nicht ganz, weil diese Datei zum Editieren nicht mehr
> gedacht ist: "DO NOT EDIT THIS FILE" steht in großen Buchstaben gleich
> zu Beginn; außerdem ist diese Datei zwar lesbar, hat aber keinerlei
> Schreibrechte mehr.
>
> Gleich vorneweg: das folgende wird eine längere Geschichte. Allerdings -
> wie ich hoffe - eine informative.
Rest gelöscht - aber beileibe nicht, weil er unqualifiziert ist.
Hey da hast Du Dir ja richtig Arbeit gemacht. :-)
Danke für die ganzen Infos.
Warum hast Du das nicht gleich in HTML gesetzt und als Website veröffentlicht?
So als HowTo.
Viele Grüße
Uwe
OS: Debian GNU/Linux 4.0 Kernel 2.6.18 KDE 3.5.5
Benutzer #461074 im Linux-Counter http://counter.li.org
Am Dienstag, den 08.12.2009, 08:08 +0100 schrieb Uwe Herrmuth:
> Hey da hast Du Dir ja richtig Arbeit gemacht. :-)
Naja; war auch einiger Spaßfaktor mit dabei. ;-)
> Danke für die ganzen Infos.
Gern geschehen.
> Warum hast Du das nicht gleich in HTML gesetzt und als Website veröffentlicht?
> So als HowTo.
Hmm, das wäre eine Überlegung wert - aber wirklich originär ist nur, was
im "Exkurs 3" steht (obwohl ich mich noch immer nicht aufraffen konnte,
das zu falsifizieren. Im Web findet man ja bekanntlich alles. Gut
möglich, dass es über "mein" abgehandeltes Thema auch schon was gibt).
Die anderen beiden "Exkurse" findet man inhaltlich auch schon auf der
bereits zitierten englischen Seite. Gut, ich hab's nicht 1:1 übersetzt,
aber mir wäre das insgesamt zu wenig für ein Howto gewesen.
[Impressum] [Mission] Datenschutzerklärung | © 2018 COMPUTEC MEDIA GmbH