All of lore.kernel.org
 help / color / mirror / Atom feed
From: Doug Brunner <doug@doug-brunner.com>
To: grub-devel@gnu.org
Subject: [PATCH] Add config option to prefer Linux kernel versions by substring match
Date: Sun, 07 Sep 2014 12:37:36 -0700	[thread overview]
Message-ID: <540CB400.2060004@doug-brunner.com> (raw)

Hi all,

First time submitting - please let me know if I'm doing anything wrong.

This patch adds an option, GRUB_LINUX_PREF_VERSION_SUBSTR, that can be set to prioritize Linux kernels containing a
given substring. This takes precedence over version ordering, so if you have 3.14.1-generic, 3.14.2-generic,
3.8.13-fnord1, and 3.8.13-fnord2 and the substring is 'fnord', the order is:
3.8.13-fnord2
3.8.13-fnord1
3.14.2-generic
3.14.1-generic

Rationale: I and others, (see e.g. http://askubuntu.com/questions/216398/set-older-kernel-as-default-grub-entry) needed
to change the Linux kernel version GRUB sets as default. The process is error-prone: you have to figure out where in the
GRUB menu it will appear, then enter that in /etc/default/grub, and if the menu position changes due to new kernels
added to the system you have to do it all over again. I had older kernels with a distinctive local version naming scheme
that I wanted preferred over the stock kernels, but it could also be used to specify a particular kernel version.

* util/grub-mkconfig.in: Add export of GRUB_LINUX_PREF_VERSION_SUBSTR
* util/grub.d/10_linux.in: Handle GRUB_LINUX_PREF_VERSION_SUBSTR when adding kernels

Signed-off-by: Doug Brunner <doug@doug-brunner.com>
---
 util/grub-mkconfig.in   |  3 ++-
 util/grub.d/10_linux.in | 22 ++++++++++++++++++----
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index d1fae49..9a3a3e9 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -224,7 +224,8 @@ export GRUB_DEFAULT \
   GRUB_ENABLE_CRYPTODISK \
   GRUB_BADRAM \
   GRUB_OS_PROBER_SKIP_LIST \
-  GRUB_DISABLE_SUBMENU
+  GRUB_DISABLE_SUBMENU \
+  GRUB_LINUX_PREF_VERSION_SUBSTR
 
 if test "x${grub_cfg}" != "x"; then
   rm -f "${grub_cfg}.new"
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index d2e2a8f..0c447f6 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -173,9 +173,25 @@ title_correction_code=
 # yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
 submenu_indentation=""
 
+pref_list=""
+non_pref_list=""
+for entry in $list; do
+  if [[ "$entry" == *$GRUB_LINUX_PREF_VERSION_SUBSTR* ]]; then
+    pref_list="$pref_list $entry"
+  else
+    non_pref_list="$non_pref_list $entry"
+  fi
+done
+
 is_top_level=true
-while [ "x$list" != "x" ] ; do
-  linux=`version_find_latest $list`
+while [ "x$pref_list$non_pref_list" != "x" ] ; do
+  if [ "x$pref_list" != "x" ]; then
+    linux=`version_find_latest $pref_list`
+    pref_list=`echo $pref_list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '`
+  else
+    linux=`version_find_latest $non_pref_list`
+    non_pref_list=`echo $non_pref_list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '`
+  fi
   gettext_printf "Found linux image: %s\n" "$linux" >&2
   basename=`basename $linux`
   dirname=`dirname $linux`
@@ -240,8 +256,6 @@ while [ "x$list" != "x" ] ; do
     linux_entry "${OS}" "${version}" recovery \
                 "single ${GRUB_CMDLINE_LINUX}"
   fi
-
-  list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '`
 done
 
 # If at least one kernel was found, then we need to



             reply	other threads:[~2014-09-07 19:37 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-07 19:37 Doug Brunner [this message]
2014-09-11 17:52 ` [PATCH] Add config option to prefer Linux kernel versions by substring match Jordan Uggla
2014-09-13 16:01 ` Andrei Borzenkov
     [not found] <mailman.69.1410537627.19647.grub-devel@gnu.org>
2014-09-12 21:26 ` Doug Brunner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=540CB400.2060004@doug-brunner.com \
    --to=doug@doug-brunner.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.