[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Grub Einträge



Klaus Becker <colonius@free.fr> writes:

> Le vendredi 15 juin 2018, 17:20:10 CEST Manfred Schmitt a écrit :
>> Klaus schrieb:
>> > Ich möchte nun, dass Grub z. B. "Sid", "Stretch" und "Primtux" anzeigt.
>> > Wie mache ich das, ohne dass Grub meine Namen beim nächsten upgrade
>> > wieder überschreibt?
>> > 
>> > Ich dachte, das geht in /etc/default/grub, dort befinden sich aber nur
>> > globale Einträge für alle installierten Systeme.
>> 
>> GRUB_DISTRIBUTOR=`lsb_release -c -s 2> /dev/null || echo Debian`
>> geht in die Richtung:
>> menuentry 'jessie GNU/Linux, mit Linux 4.9.0-0.bpo.6-amd64'
>
> Ok, werde ich ausprobieren

GRUB_DISTRIBUTOR kannst Du auch Zeichenketten nach belieben zuweisen,
also z.B. auch:

  GRUB_DISTRIBUTOR="Primtux"

>> Oder mit -d, dann ist's aber doppelt gemoppelt:
>> menuentry 'Debian GNU/Linux 8.10 (jessie) GNU/Linux, mit Linux
>> 4.9.0-0.bpo.6-amd64'
>> 
>> Um das zweite GNU/Linux wegzukriegen muesste man wohl die /etc/grub/10_linux
>> editieren.
>
> /etc/grub.d/10_linux
>
> Dafür hab' ich aber nicht die Kompetenz, so wichtig ist das nun auch wider 
> nicht...

Der dafür nötige Eingriff ist nicht schwerwiegend.  Ich habe zwei
mögliche Veränderungen angehängt: die 1. hängt „GNU/Linux” überhaupt
nicht an, die 2. nur, wenn die Zeichenkette „GNU/Linux” nicht schon in
GRUB_DISTRIBUTOR vorhanden ist.  Zum Übertragen empfiehlt sich die
Nutzung des „patch”-Programms („apt install patch” ausführen, falls es
noch nicht installiert sein sollte).

Einspielen kannst Du die eine oder die andere mit dem Befehl „patch -N
-d /etc/grub.d/ < /pfad/zum/patch”.

Rückgängig machen kannst Du die Änderungen außer durch zurückspielen
einer Sicherungskopie auch durch den Befehl „patch -R -d /etc/grub.d/ <
/pfad/zum/eingespielten/patch”.


Gelöst werden dadurch aber wird dein eigentliches Problem nicht, denn
„grub.d/10_linux” ist direkt erst einmal nur für das Erstellen von
Grub-Menüeinträgen der ausführenden Installation verantwortlich; die
anderen Einträge dürfte „grub.d/30_os-prober” erzeugen.  Dieses aber
nutzt indirekt die GRUB_DISTRIBUTOR-Werte der anderen Installationen, da
es die durch „grub.d/10_linux” in den anderen Installationen erzeugten
Menüeinträge ausliest; das Auslesen geschieht durch „linux-boot-prober”
und dessen „/usr/lib/linux-boot-probes/40grub2”-Test.

Eine Lösung wäre also, bei getrennten „/boot”-Verzeichnissen, die
GRUB_DISTRIBUTOR-Werte in allen Installationen nach belieben zu setzen
und eine Installation zum Grubverwalter zu erkiesen, die die tatsächlich
von Grub verwendete „grub.cfg” erstellt, und immer nach einer
Kernelaktualisierung in den anderen in diese grubverwaltende
Installation zu wechseln und dann mittels „grub-update” den neuen Kernel
ins Grub-Menü eintragen zu lassen.

Bei einem geteilten „/boot”-Verzeichnis müsste man wohl einen eigenen
„linux-boot-prober”-Test schreiben, der nach eigenen Kriterien ermittelt
welcher Grubmenü-Titel für eine „root”-Partition zutreffend ist.


Ich habe hier einige Vermutungen angestellt, könntest Du sie überprüfen?

  1. In der „grub.cfg” stehen Kommentare, die angeben welches Skript
     einen Bereich erstellt hat (z.B. „BEGIN /etc/grub.d/30_os-prober”):
     stammen die Einträge tatsächlich von „10_linux” und „30_os-prober”?

  2. Verwendet jede Installation ihre eigene „/boot”-Partition bzw. wird
     einfach das Verzeichnis der jeweiligen „root”-Partition verwendet?

--
Felix Dietrich



--- grub.d.orig/10_linux
+++ grub.d/10_linux
@@ -37,14 +37,8 @@
 if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
   OS=GNU/Linux
 else
-  case ${GRUB_DISTRIBUTOR} in
-    Ubuntu|Kubuntu)
-      OS="${GRUB_DISTRIBUTOR}"
-      ;;
-    *)
-      OS="${GRUB_DISTRIBUTOR} GNU/Linux"
-      ;;
-  esac
+  OS="${GRUB_DISTRIBUTOR}"
+
   CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
 fi
 
--- grub.d.orig/10_linux
+++ grub.d/10_linux
@@ -42,7 +42,11 @@
       OS="${GRUB_DISTRIBUTOR}"
       ;;
     *)
-      OS="${GRUB_DISTRIBUTOR} GNU/Linux"
+      if ! echo ${GRUB_DISTRIBUTOR} | grep -q GNU/Linux ; then
+        OS="${GRUB_DISTRIBUTOR} GNU/Linux"
+      else
+        OS="${GRUB_DISTRIBUTOR}"
+      fi
       ;;
   esac
   CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"

Reply to: