All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Rowe <simon.rowe@nutanix.com>
To: grub-devel@gnu.org
Cc: Simon Rowe <simon.rowe@nutanix.com>
Subject: [PATCH] Support dropin files for Linux kernel parameters
Date: Fri,  1 Mar 2024 15:43:50 +0000	[thread overview]
Message-ID: <20240301154350.149056-1-simon.rowe@nutanix.com> (raw)

Kernel parameters actually cover a range of purposes, including
userspace like systemd. They also need setting for a variety of
reasons:

  * as distro defaults
  * to provide configuration for a package
  * for an admin to set desired behaviour

Having these all combined in a single line (like GRUB_CMDLINE_LINUX)
is unwieldy, it is hard to make changes without impacting another
usecase.

Add optional support for dropin files in the directories:

  * /usr/lib/kernel.d/
  * /etc/kernel.d/

where the contents of each file with the '.conf' suffix is evaluated
(excluding comments) and appended to any other kernel parameters
defined via GRUB_CMDLINE_LINUX etc. Files in /etc/kernel.d/ completely
replace those of the same name in /usr/lib/kernel.d/. This allows a
distro or installer to set parameters but then for an admin to
override them.

Signed-off-by: Simon Rowe <simon.rowe@nutanix.com>
---
 util/grub-mkconfig_lib.in   | 18 ++++++++++++++++++
 util/grub.d/10_linux.in     |  8 +++++---
 util/grub.d/20_linux_xen.in |  8 +++++---
 3 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 08953287c..7aaa747f1 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -348,3 +348,21 @@ grub_add_tab () {
   sed -e "s/^/$grub_tab/"
 }
 
+kernel_params_from_files () {
+  # Read Linux kernel parameters from dropin files.
+
+  file_bases=""
+
+  for f in /etc/kernel.d/*.conf /usr/lib/kernel.d/*.conf; do
+    [ -r $f ] || continue
+    file_bases="$file_bases $(basename $f)"
+  done
+
+  for b in $(echo $file_bases | tr ' ' '\n' | sort -u); do
+    if [ -r /etc/kernel.d/$b ]; then
+      grep -v '^#' /etc/kernel.d/$b | tr '\n' ' '
+    elif [ -r /usr/lib/kernel.d/$b ]; then
+      grep -v '^#' /usr/lib/kernel.d/$b | tr '\n' ' '
+    fi
+  done
+}
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index cc393be7e..fba3775f9 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -275,6 +275,8 @@ for linux in ${reverse_sorted_list}; do
     fi
   fi
 
+  extra_kernel_params=$(kernel_params_from_files)
+
   # The GRUB_DISABLE_SUBMENU option used to be different than others since it was
   # mentioned in the documentation that has to be set to 'y' instead of 'true' to
   # enable it. This caused a lot of confusion to users that set the option to 'y',
@@ -285,7 +287,7 @@ for linux in ${reverse_sorted_list}; do
 
   if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
     linux_entry "${OS}" "${version}" simple \
-    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
+    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ${extra_kernel_params}"
 
     submenu_indentation="$grub_tab"
     
@@ -298,10 +300,10 @@ for linux in ${reverse_sorted_list}; do
   fi
 
   linux_entry "${OS}" "${version}" advanced \
-              "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
+              "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ${extra_kernel_params}"
   if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
     linux_entry "${OS}" "${version}" recovery \
-                "${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
+                "${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX} ${extra_kernel_params}"
   fi
 done
 
diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in
index 94dd8be13..089f6de43 100644
--- a/util/grub.d/20_linux_xen.in
+++ b/util/grub.d/20_linux_xen.in
@@ -336,6 +336,8 @@ for current_xen in ${reverse_sorted_xen_list}; do
 	    fi
 	fi
 
+	extra_kernel_params=$(kernel_params_from_files)
+
 	# The GRUB_DISABLE_SUBMENU option used to be different than others since it was
 	# mentioned in the documentation that has to be set to 'y' instead of 'true' to
 	# enable it. This caused a lot of confusion to users that set the option to 'y',
@@ -346,7 +348,7 @@ for current_xen in ${reverse_sorted_xen_list}; do
 
 	if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
 	    linux_entry "${OS}" "${version}" "${xen_version}" simple \
-		"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
+		"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT} ${extra_kernel_params}"
 
 	    submenu_indentation="$grub_tab$grub_tab"
     
@@ -360,10 +362,10 @@ for current_xen in ${reverse_sorted_xen_list}; do
 	fi
 
 	linux_entry "${OS}" "${version}" "${xen_version}" advanced \
-	    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
+	    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT} ${extra_kernel_params}"
 	if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
 	    linux_entry "${OS}" "${version}" "${xen_version}" recovery \
-		"${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN}"
+		"${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN} ${extra_kernel_params}"
 	fi
     done
     if [ x"$is_top_level" != xtrue ]; then
-- 
2.22.3


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

             reply	other threads:[~2024-03-01 15:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-01 15:43 Simon Rowe [this message]
2024-03-02  3:21 ` [PATCH] Support dropin files for Linux kernel parameters Oskari Pirhonen
2024-03-04  9:04   ` Simon Rowe
2024-03-05  7:15     ` Oskari Pirhonen
2024-03-14  9:00 ` Simon Rowe
2024-05-02 10:18 ` Julian Andres Klode

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=20240301154350.149056-1-simon.rowe@nutanix.com \
    --to=simon.rowe@nutanix.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.