| From e416f0ed3c500c05c55fb62ee62662717b1c7f71 Mon Sep 17 00:00:00 2001 |
| From: Huacai Chen <chenhuacai@loongson.cn> |
| Date: Mon, 21 Jul 2025 18:13:43 +0800 |
| Subject: init: handle bootloader identifier in kernel parameters |
| |
| From: Huacai Chen <chenhuacai@loongson.cn> |
| |
| commit e416f0ed3c500c05c55fb62ee62662717b1c7f71 upstream. |
| |
| BootLoaders (Grub, LILO, etc) may pass an identifier such as "BOOT_IMAGE= |
| /boot/vmlinuz-x.y.z" to kernel parameters. But these identifiers are not |
| recognized by the kernel itself so will be passed to userspace. However |
| user space init program also don't recognize it. |
| |
| KEXEC/KDUMP (kexec-tools) may also pass an identifier such as "kexec" on |
| some architectures. |
| |
| We cannot change BootLoader's behavior, because this behavior exists for |
| many years, and there are already user space programs search BOOT_IMAGE= |
| in /proc/cmdline to obtain the kernel image locations: |
| |
| https://github.com/linuxdeepin/deepin-ab-recovery/blob/master/util.go |
| (search getBootOptions) |
| https://github.com/linuxdeepin/deepin-ab-recovery/blob/master/main.go |
| (search getKernelReleaseWithBootOption) So the the best way is handle |
| (ignore) it by the kernel itself, which can avoid such boot warnings (if |
| we use something like init=/bin/bash, bootloader identifier can even cause |
| a crash): |
| |
| Kernel command line: BOOT_IMAGE=(hd0,1)/vmlinuz-6.x root=/dev/sda3 ro console=tty |
| Unknown kernel command line parameters "BOOT_IMAGE=(hd0,1)/vmlinuz-6.x", will be passed to user space. |
| |
| [chenhuacai@loongson.cn: use strstarts()] |
| Link: https://lkml.kernel.org/r/20250815090120.1569947-1-chenhuacai@loongson.cn |
| Link: https://lkml.kernel.org/r/20250721101343.3283480-1-chenhuacai@loongson.cn |
| Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> |
| Cc: Al Viro <viro@zeniv.linux.org.uk> |
| Cc: Christian Brauner <brauner@kernel.org> |
| Cc: Jan Kara <jack@suse.cz> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| init/main.c | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| --- a/init/main.c |
| +++ b/init/main.c |
| @@ -530,6 +530,12 @@ static int __init unknown_bootoption(cha |
| const char *unused, void *arg) |
| { |
| size_t len = strlen(param); |
| + /* |
| + * Well-known bootloader identifiers: |
| + * 1. LILO/Grub pass "BOOT_IMAGE=..."; |
| + * 2. kexec/kdump (kexec-tools) pass "kexec". |
| + */ |
| + const char *bootloader[] = { "BOOT_IMAGE=", "kexec", NULL }; |
| |
| /* Handle params aliased to sysctls */ |
| if (sysctl_is_alias(param)) |
| @@ -537,6 +543,12 @@ static int __init unknown_bootoption(cha |
| |
| repair_env_string(param, val); |
| |
| + /* Handle bootloader identifier */ |
| + for (int i = 0; bootloader[i]; i++) { |
| + if (strstarts(param, bootloader[i])) |
| + return 0; |
| + } |
| + |
| /* Handle obsolete-style parameters */ |
| if (obsolete_checksetup(param)) |
| return 0; |