GRUB2 os-prober erzeugtes bash-script: Wo gibt's eine Erklärung?

GRUB2’s os-prober findet ja die meisten OSs (ausser mindestens FreeBSD auf ufs2) und produziert daraus eine lange grub.cfg-Datei. Nur, dass ich einen Teil davon überhaupt nicht verstehe. Beispiel:


if  x$feature_default_font_path = xy ] ; then
  font=unicode
else
  insmod part_msdos
  insmod ext2
  set root='hd0,msdos5'
  if  x$feature_platform_search_hint = xy ]; then
   search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5   --hint-baremetal=ahci0,msdos5 --hint='hd0,msdos5'  a13e1c0f-c157-4ee5-a1c3-67a39ebe01d1
  else
   search --no-floppy --fs-uuid --set=root a13e1c0f-c157-4ee5-a1c3-67a39ebe01d1
  fi
   font="/usr/share/grub2/unicode.pf2"
fi

Speziell das lange if-statement ist mir unklar, ich weiß nicht wie die Variablen Werte zugewiesen bekommen und in der GRUB2 Dokumentation ist auch nichts.

Hier dasselbe, obgleich ich wenigstens verstehe, dass die SuSE hier gestartet wird, nur die Details entgehen mir:


menuentry 'openSUSE 12.3 (on /dev/sda5)' --class 'opensuse-12-3' --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a13e1c0f-c157-4ee5-a1c3-67a39ebe01d1'{
    savedefault
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if  x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e8b9e1af-e836-4332-8446-d149a0c68d40
    else
      search --no-floppy --fs-uuid --set=root e8b9e1af-e836-4332-8446-d149a0c68d40
    fi
    echo 'Loading Linux 3.7.10-1.16-desktop ...'
    linux /vmlinuz-3.7.10-1.16-desktop root=UUID=a13e1c0f-c157-4ee5-a1c3-67a39ebe01d1  showopts video=1366x768 resume=/dev/disk/by-id/ata-WDC_WD3200BPVT-22JJ5T0_WD-WXU1CB1S5967-part3 nosplash noquiet
    echo 'Loading initial ramdisk ...'
    initrd     /initrd-3.7.10-1.16-desktop 

Für Hinweise auf eine Schritt für Schritt Erklärung wäre ich dankbar.

Sollte ich das vielleicht nochmal (auf englisch) im englischen Forum posten? Oder gilt das als Doppelpost und pfui?

Ich würd sagen, das ist schon ok. Ist nicht wirklich ein “Doppelpost”… :wink:

Zu deiner ursprünglichen Frage ein paar Punkte:
/boot/grub2/grub.cfg solltest du nicht händisch ändern. Die wird automatisch aus den Templates in /etc/grub.d/ erzeugt, daher kommen auch diese ganzen Konstrukte.
Und die sind natürlich eher generisch gehalten, damit sie möglichst auf allen Distribution/Konfigurationen funktionieren.

Falls du selber Einträge anlegen willst, solltest du entweder ein eigenes Template in /etc/grub.d/ anlegen, das deine Einträge erzeugt, oder diese in /boot/grub2/custom.cfg händisch eintragen.

Mit genaueren Details kann ich im Moment allerdings leider auch nicht dienen.

Sollte sich aber alles in der Online-Dokumentation finden lassen, denke ich.
Hier z.B. eine Auflistung aller Environment-Variablen:
http://www.gnu.org/software/grub/manual/grub.html#Environment

Falls du selber Einträge erstellen willst (und ich denke, das ist der eigentliche Grund deiner Frage), musst du aber meiner Meinung nach das gar nicht alles verstehen.
Notwendig dürfte nur sein, die entsprechenden Partitionstabellen- und Filesystem-Module zu laden (z.B. “insmod part_msdos” und “insmod ext2”), danach die root partition zu setzen (“set root”), sowie den kernel und die initrd (falls notwendig) mit “linux” und “initrd” laden.
Also nicht viel anders als beim alten grub, nur dass du eben noch die notwendigen Module laden musst.

Das ganze muss in “menuentry xxxx {” und “}” eingeschlossen sein, die ganzen --class Parameter dienen dazu mehrere Einträge zu Klassen zuzuweisen, die scheinbar die Darstellung beeinflussen können, ist aber nicht notwendig anzugeben.
http://www.gnu.org/software/grub/manual/grub.html#menuentry

Okay, danke, dann probier ich’s mal dort.

Ich ändere die grub.cfg auch nicht händisch, sondern nehme sie (von os-prober erzeugt) als Templat für meine eigenen Einträge in /etc/grub.d/. Übrigens macht nur SuSE diese Konstrukte, die anderen Distributionen, die ich sonst habe, sind da kürzer gefasst.

Leider nicht. Das scheint SuSE-spezifisch zu sein.

Danke für den Link.

Nein, ich muss nicht und arbeite damit ja auch schon mehr als ein Jahr. Ich möchte das aber gerne verstehen, weil ich immer gerne weiß, was ich da gerade tue(n lasse).

Ja, SuSE steuert damit z.B. die Thumbnails vor den einzelnen Einträgen im GRUB-menu, das habe ich schon herausgefunden. Und man kann die Einträge wohl damit gruppieren, als Verfeinerung der Möglichkeiten durch die Namensgebung mit den vorangestellten Ziffern in /etc/grub.d/

Ok, wollte nur darauf hinweisen.
Aber wie gesagt, du kannst Einträge auch einfach direkt in die /boot/grub2/custom.cfg schreiben. Die wird von der Standard grub.cfg eingebunden und nicht automatisch geändert.

Übrigens macht nur SuSE diese Konstrukte, die anderen Distributionen, die ich sonst habe, sind da kürzer gefasst.

Leider nicht. Das scheint SuSE-spezifisch zu sein.

Hm, soweit ich das sehen kann, kommen die Templates aber praktisch unverändert von upstream, und auch grub(2)-mkconfig das diese Konstrukte erzeugt.
SuSE-spezifische Änderungen sehe ich da nicht. Hab jetzt nicht alle Patches durchgeschaut, aber z.B. dieses “if x$feature_platform_search_hint = xy ]” usw. ist genau so im grub-mkconfig des upstream Tarballs zu finden (genauer gesagt grub-mkconfig_lib, in openSUSE als /usr/share/grub2/grub-mkconfig_lib installiert) .

Vielleicht benutzen diese anderen Distributionen, du du sonst hast, eine ältere Version von grub2 oder so?
Oder die machen spezifische Änderungen. :wink:

Nein, ich muss nicht und arbeite damit ja auch schon mehr als ein Jahr. Ich möchte das aber gerne verstehen, weil ich immer gerne weiß, was ich da gerade tue(n lasse).

Kann ich verstehen.
Aber sogar die README.openSUSE die bei grub2 dabei ist, sagt:

Documentation

The GRUB 2 lacks documentation. While you are encouraged to contribute
the documentation, you can use the GRUB 2 Wiki [1] as primary source of
information pertaining to this development snapshot.

[1] http://grub.enbug.org/

Der Link funktioniert aber leider nicht (mehr).

Die /boot/grub2/custom.cfg gibt es auf meinem system nicht?!? (13.1 installiert von der Live-CD). Wo bekommt man sie her? Ich habe aber eine /etc/default/grub mit eher globalen Voreinstellungen…

Beides möglich. Ubuntu zumindestens schraubt ja auch gerne an den Sachen herum ;).

Kann ich verstehen.
Aber sogar die README.openSUSE die bei grub2 dabei ist, sagt:

Dann genieße mal dies hier:

Here is an example from the man page of xorg.conf reproduced verbatim:

VIDEOADAPTOR SECTION
Nobody wants to say how this works. Maybe nobody knows …

:sarcastic:

Richtig, du kannst sie aber selber anlegen.
Wenn sie vorhanden ist, wird sie dem Menü hinzugefügt.
Sh. /etc/grub.d/41_custom, bzw. die entsprechende Sektion in /boot/grub2/grub.cfg.

/etc/default/grub enthält allgemeine Voreinstellungen, richtig. Die kannst du z.B. auch in YaST->System->Bootloader->Bootloader-Optionen setzen (das ändert genau diese Datei und ruft grub2-mkconfig auf, um die grub.cfg entsprechend neu zu erzeugen).

Dann genieße mal dies hier:

:sarcastic:

lol!
Tja, XV wird aber von modernen Grafikkarten/treibern eh nicht mehr unterstützt, glaube ich.
Dafür gibts ja glamor, das das auf OpenGL umleitet.

Ich hatte jedenfalls noch nie die Notwendigkeit eine VideoAdaptor section anzulegen, auch früher nicht.
Bzw. wusste ich bis gerade eben gar nicht, dass es die überhaupt gibt…

Aha. Das kann ich ja dann mal probieren. Danke für den Tipp :).

Bitte. Hätte vielleicht gleich dazuschreiben sollen, dass du sie erst anlegen musst… :wink:

Übrigens, noch was zur ursprünglichen Frage:
os-prober legt überhaupt keine Einträge an.
Es sucht nur nach Betriebssytemen und gibt die gefundenen auf stdout aus, bzw. legt eine Liste in /var/lib/os-prober/labels an.

Die Einträge werden dann von grub2-mkconfig erzeugt.
(/etc/grub.d/30_os-prober)

Ich habe also eine alte grub.cfg in custom.cfg umbenannt (Test zum Verdoppeln der Einträge). Tja, dann zeigt er beim Start kurz “Loading GRUB”, dann wird der Bildschirm schwarz und es hilft nur noch der “Affengriff” (wenigstens das, Gott sei Dank).

Wenn man nach “opensuse custom.cfg” sucht, stellt man fest, dass das nicht nur mir so geht, aber Lösungen gibt es nicht :(.

P.S.: Sowohl bei der Erstinstallation als auch beim Update des Kernels wird /etc/grub.d/* komplett überschrieben. Sehr hässlich, gerade auf Bugzilla gemeldet. Von daher wäre mir eine Lösung unter /boot/grub2/custom.cfg auch lieber, aber wie das Problem lösen?

Das ganze menu.cfg kannst du nicht kopieren, da sind ja mehr Sachen drin, z.B. das Laden des Environments, der Grafikmodule, usw.
Du solltest nur menuentries hineinschreiben, das funktioniert tadellos hier.

Im Prinzip wird ja die custom.cfg einfach nur in die grub.cfg eingefügt. Ist also wohl klar, dass ein komplettes Duplizieren Probleme machen kann.

Wenn man nach “opensuse custom.cfg” sucht, stellt man fest, dass das nicht nur mir so geht, aber Lösungen gibt es nicht :(.

Wie gesagt, ich hab das grade probiert, folgende custom.cfg (copy/paste von grub.cfg) legt einen neuen Eintrag an der auch bei mir problemlos bootet:

menuentry 'mein openSUSE 13.1' --class 'opensuse-13-1' --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e2c9b751-d87b-4dbd-b240-391e01dbd8cd' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod reiserfs
        set root='hd0,msdos1'
        if  x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e2c9b751-d87b-4dbd-b240-391e01dbd8cd
        else
          search --no-floppy --fs-uuid --set=root e2c9b751-d87b-4dbd-b240-391e01dbd8cd
        fi
        echo    'Loading Linux 3.11.10-11-desktop ...'
        linux   /boot/vmlinuz-3.11.10-11-desktop root=UUID=e2c9b751-d87b-4dbd-b240-391e01dbd8cd   resume=/dev/sdb2 splash=silent quiet showopts
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd-3.11.10-11-desktop
}

P.S.: Sowohl bei der Erstinstallation als auch beim Update des Kernels wird /etc/grub.d/* komplett überschrieben. Sehr hässlich, gerade auf Bugzilla gemeldet. Von daher wäre mir eine Lösung unter /boot/grub2/custom.cfg auch lieber, aber wie das Problem lösen?

Nein, /etc/grub.d/* wird nicht überschrieben, schon gar nicht bei einem Kernel-Update (was sollte denn das Kernelpaket mit /etc/grub.d/ zu tun haben?).
Und nicht mal ein Update von grub2 überschreibt Änderungen an den Dateien in /etc/grub.d/, weil die als Konfigurationsdateien markiert sind. Ich hab das zufälligerweise letztes Wochenende ausprobiert. :wink:

/boot/grub2/grub.cfg wird hingegen jedesmal überschrieben wenn der Bootloader neu installiert wird, also z.B. bei jedem Kernel-Update.

PS: deinen Bug-Report solltest du vielleicht besser wieder schließen (RESOLVED INVALID würde ich sagen…). :wink:

Kleiner Nachtrag:
Eigentlich ists ja vollkommen offensichtlich/logisch, dass ein Kopieren der kompletten grub.cfg nach custom.cfg nicht funktionieren kann, und was vor allem Probleme macht:

  • grub.cfg bindet custom.cfg ein
  • wenn custom.cfg eine 1:1 Kopie einer grub.cfg ist, bindet die wieder custom.cfg ein
  • wenn custom.cfg eine 1:1 Kopie einer grub.cfg ist, bindet die wieder custom.cfg ein
  • wenn custom.cfg eine 1:1 Kopie einer grub.cfg ist, bindet die wieder custom.cfg ein
  • usw.
    Grub2 steckt dann also in einer Endlosschleife… :wink:

Der entsprechende Teil der grub.cfg:

### BEGIN /etc/grub.d/41_custom ###
if  -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif  -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Also, wie bereits gesagt, schreibe in die custom.cfg nur deine zusätzlichen Menüeinträge (“menuentry {…}”) und es sollte funktionieren!