[gelöst] Frage zu Grub2-Skript

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

[gelöst] Frage zu Grub2-Skript

Beitrag von Taomon » 26.11.2017 13:01:17

Ich habe Kodi-standalone auf meinem System als eigenes Target.. Eingebunden in grub2 mit

Code: Alles auswählen

systemd.unit=kodi.target
Ich bin aber nicht sehr glücklich mit meinem Grub2-skript dazu.

Da ich die Zu bootende Kernel-Version statisch reingeschrieben habe. NoPaste-Eintrag40071

Wie muß ich das Skript abändern damit auch ein neuere Kernel-Version mit aufgenommen wird.

Ich schätze mal das ich mir einiges aus /etc/grub.d/10_linux ausleihen muß.


Gruß Taomon
Zuletzt geändert von Taomon am 28.11.2017 17:07:19, insgesamt 1-mal geändert.
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Frage zu Grub2-Skript

Beitrag von smutbert » 26.11.2017 13:52:59

Du kannst die Option in »/etc/default/grub« festlegen, etwa in der Variable GRUB_CMDLINE_LINUX_DEFAULT

Code: Alles auswählen

GRUB_CMDLINE_LINUX_DEFAULT="systemd.unit=kodi.target"
Alternativ kannst du auch GRUB_CMDLINE_LINUX nehmen, das würde sich dann auch auf die rescue-Booteinträge auswirken.

Eine andere Variante wäre direkt in systemd, das target zum Default zu machen

Code: Alles auswählen

# systemctl set-default kodi.target

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Frage zu Grub2-Skript

Beitrag von Taomon » 26.11.2017 14:32:29

Danke erstmal, aber das habe ich nicht gemeint.

Wenn irgendwann mal ein Distro-Upgrade ansteht kommt da ja auch ein neuer Kernel. Dann startet meine Kodi nicht mehr weil der boot auf den Vor-Kernel zeigt. Was ich mir wünsche das die neue Kernel-Version dann in der grub.cfg automatisch eingetragen wird. Also wen Kernelblabla-blub kommt soll der dann auch drinstehen in

Code: Alles auswählen

echo    'Linux 4.9.0-3-amd64 wird geladen …'
linux   /boot/vmlinuz-4.9.0-3-amd64 root=UUID=101da78c-5239-4d39-8df4-045baedb643a ro 
Gruß Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Frage zu Grub2-Skript

Beitrag von smutbert » 26.11.2017 14:44:09

Dafür sorgt doch update-grub, das vom postinst-Skript des Kernelpakets aufgerufen wird.
(Woher und wieso kommt bei dir das Skript »/etc/grub.d/70_kodi«?)


Ohne update-grub und mit selbst erstellten Menüeinträgen kann man sich einfach symbolische Links erstellen lassen, die immer auf den aktuellen Kernel und die initrd zeigen, also eine »/etc/kernel-img.conf« anlegen mit

Code: Alles auswählen

do_symlinks = yes
link_in_boot = yes
danach mit

Code: Alles auswählen

# dpkg-reconfigure linux-image-$(uname -r)
dafür sorgen, dass die Links für den bereits installierten Kernel angelegt werden.
Dann lässt sich der aktuelle Kernel immer mit den Links »/boot/vmlinuz« und »/boot/initrd.img«

Code: Alles auswählen

[…]

menuentry "Kodi" {load_video
        […]
        echo    'Linux 4.9.0-3-amd64 wird geladen …'
        linux   /boot/vmlinuz root=UUID=101da78c-5239-4d39-8df4-045baedb643a ro systemd.unit=kodi.target
        echo    'Initiale Ramdisk wird geladen …'
        initrd  /boot/initrd.img
 }
starten (und für den vorigen Kernel hängt man einfach ein ».old« an die Dateinamen dran).

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Frage zu Grub2-Skript

Beitrag von Taomon » 26.11.2017 14:59:42

smutbert hat geschrieben: ↑ zum Beitrag ↑
26.11.2017 14:44:09
/etc/grub.d/70_kodi«
Meins.

Ich wollte kodi standalone mehr oder weniger getrennt von meinem Debian haben.

Deshalb auch ein eigenes target erstellt, und die entsprechenden Dienste die ich meinte zu brauchen in
in

Code: Alles auswählen

/etc/systemd/system/kodi.target.wants/
reingelinkt. die Datei ist schon auf meinem System.

Code: Alles auswählen

root@Taomon:/home/alex# cat /etc/kernel-img.conf 
# Kernel image management overrides
# See kernel-img.conf(5) for details
do_symlinks = yes
do_bootloader = no
do_initrd = yes
link_in_boot = no
root@Taomon:/home/alex# 
Mal schauen ob https://debian-handbook.info/browse/squ ... ation.htmlauch noch nach squeeze funktioniert.

Gruß Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Frage zu Grub2-Skript

Beitrag von smutbert » 26.11.2017 15:19:00

Ok, dann könntest du tatsächlich eine Kopie von 10_linux erstellen oder das vorhandene Skript ergänzen, was bei grub-Updates wohl weniger praktisch, aber einfacher und vom Ergebnis her eventuell schöner wäre.
Du musst ja eigentlich nur den Teil, der am Schluss die Ausgabe für die grub.cfg liefert kopieren und dort dein systemd.unit=kodi.target einbauen, nur bin ich mir nicht sicher ob ich 10_linux richtig durchschaue.

Ich vermute du müsstest relativ weit hinten in der Datei, in stretch so ungefähr ab Zeile 335

Code: Alles auswählen

    linux_entry "${OS}" "${version}" simple \
    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
durch

Code: Alles auswählen

    linux_entry "${OS}" "${version}" simple \
    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
    linux_entry "${OS}" "${version} (kodi)" simple \
    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} systemd.unit=kodi.target"
ersetzen damit auch ein Eintrag für kodi erstellt wird (hoffentlich, wenn ich nichts übersehen habe) und für den Fall das Untermenüs verwendet werden, dasselbe mit den »linux_entry "${OS}" "${version}" advanced \...« machen.

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Frage zu Grub2-Skript

Beitrag von Taomon » 27.11.2017 19:34:53

smutbert hat geschrieben: ↑ zum Beitrag ↑
26.11.2017 15:19:00
Code: Alles auswählen

linux_entry "${OS}" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
linux_entry "${OS}" "${version} (kodi)" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} systemd.unit=kodi.target"
Nö, das funktioniert nicht. Ich denke das die Variablen "${GRUB_CMDLINE_LINUX} und ${GRUB_CMDLINE_LINUX_DEFAULT} stur aus der /etc/default/grub gelesen werden. alles andere habe ich hinbekommen wie ich es wollte. Da muß ich evtl. noch was mit if fi case und do bastelen. :lol:

Ich hasse Skripte.

Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Frage zu Grub2-Skript

Beitrag von smutbert » 27.11.2017 21:52:45

jetzt habe ich die Lösung ausprobiert und sie funktioniert (fast) - hast du vielleicht update-grub vergessen :wink:

Mangels kodi habe ich mir eine Lösung für einen zusätzlichen Eintrag mit systemd.unit=multi-user.target erstellt. Ich hab eine Kopie von 10_linux namens 11_linux erstellt und dort einiges herausgelöscht, das für diesen Zweck überflüssig ist, beginnend ein paar Zeilen vor der Änderung (in stretch ab Zeile 326), sieht es so aus (der erste Absatz ist noch unverändert und dient der Orientierung)

Code: Alles auswählen

…

  if test -n "${initrd}" ; then
    gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2
  elif test -z "${initramfs}" ; then
    # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs.  Since there's
    # no initrd or builtin initramfs, it can't work here.
    linux_root_device_thisversion=${GRUB_DEVICE}
  fi


  linux_entry "${OS} (Textmodus)" "${version}" simple \
  "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} systemd.unit=multi-user.target"

  submenu_indentation="$grub_tab"

  list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '`
done

# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
  echo '}'
fi

echo "$title_correction_code"
Es ließe sich zweifelsohne noch viel mehr ändern bzw. löschen, aber das genügt, das lediglich ein weiterer Booteintrag erzeugt wird ohne weiteres Untermenü bzw. Rescue-Einträge.

Falsch war beim ersten Versuch vor allem der Versuch den Titel durch ändern der Versionsangabe anzupassen, nach ${OS} funktioniert es aber wunschgemäß.

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Frage zu Grub2-Skript

Beitrag von Taomon » 28.11.2017 17:06:07

So habe es jetzt ein bißchen anders gelöst.
Die grub-skripte sind ja ganz normale shell-skripte. Also warum nicht einfach eine Variable selbst definieren.

Code: Alles auswählen

prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
ubuntu_recovery="0"
quiet_boot="0"
quick_boot="0"
gfxpayload_dynamic="0"
vt_handoff="0"

. "$pkgdatadir/grub-mkconfig_lib"

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
export GRUB_CMDLINE_LINUX_DEFAULT='systemd.unit=kodi.target' 

CLASS="--class gnu-linux --class gnu --class os"
SUPPORTED_INITS="sysvinit:/lib/sysvinit/init systemd:/lib/systemd/systemd upstart:/sbin/upstart"

if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS=GNU/Linux
else
  case ${GRUB_DISTRIBUTOR} in
    Ubuntu|Kubuntu)
      OS="${GRUB_DISTRIBUTOR}"
      ;;
    *)
      OS="${GRUB_DISTRIBUTOR} Kodi"
      ;;
  esac
Bringt in der grub.cfg

Code: Alles auswählen

### BEGIN /etc/grub.d/70_kodi ###
menuentry 'Debian Kodi' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-6af17de7-2b71-423e-a470-fe72f7cb415f' {
	linux	/boot/vmlinuz-4.9.0-4-amd64 root=UUID=6af17de7-2b71-423e-a470-fe72f7cb415f ro  systemd.unit=kodi.target
submenu 'Erweiterte Optionen für Debian Kodi' $menuentry_id_option 'gnulinux-advanced-6af17de7-2b71-423e-a470-fe72f7cb415f' {
	menuentry 'Debian Kodi, mit Linux 4.9.0-4-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-4-amd64-advanced-6af17de7-2b71-423e-a470-fe72f7cb415f' {
		linux	/boot/vmlinuz-4.9.0-4-amd64 root=UUID=6af17de7-2b71-423e-a470-fe72f7cb415f ro  systemd.unit=kodi.target
Jetzt bloß noch die recovery Einträge loswerden und gut is es.

Danke an @smubert


Gruß Taomon

Edit: recovery mit

Code: Alles auswählen

prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
ubuntu_recovery="0"
quiet_boot="0"
quick_boot="0"
gfxpayload_dynamic="0"
vt_handoff="0"
GRUB_DISABLE_RECOVERY="true"
entfernt.
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Antworten