Martin Klöckner's Webpage


GRUB menu: Linux version not detected

02-Nov-2024 (last update 05-Nov-2024)

If your grub installation doesn’t detect the Linux versions properly, and displays it wrong in the prompt menu at boot, like in my case in which appeared as Arch Linux with Linux version linux, you can solve it by modifying the helper scripts which grub uses to build the configuration file.

The problem is caused by the script grub-mkconfig which is used to build the grub configuration file grub.cfg (generally located on /boot/grub/).

The script grub-mkconfig uses other helper scripts located on /etc/grub.d/, and in particular the file used to detect the Linux version is /etc/grub.d/10_linux, which uses the file name of the kernel file to detect the version (for example /boot/vmlinuz-6.1.0-25-amd64). The issue is caused on distributions like Arch Linux that doesn’t add the suffix of version to the main kernel file (for example /boot/vmlinuz-linux).

The solution is to to modify the file /etc/grub.d/10_linux and make the following changes (also as a diff file):

--- /etc/grub.d/10_linux
+++ /etc/grub.d/10_linux
@@ -144,7 +144,7 @@
     fi
     printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
   fi
-  message="$(gettext_printf "Loading Linux %s ..." ${version})"
+  message="$(gettext_printf "Loading Linux %s ..." ${display_version})"
   sed "s/^/$submenu_indentation/" << EOF
    echo    '$(echo "$message" | grub_quote)'
    linux   ${rel_dirname}/${basename} root=${linux_root_device_thisversion} rw ${args}
@@ -217,6 +217,7 @@
   dirname=`dirname $linux`
   rel_dirname=`make_system_path_relative_to_its_root $dirname`
   version=`echo $basename | sed -e "s,vmlinuz-,,g"`
+  display_version=`file $linux | grep -oP '(?<=version )\S*'`
   alt_version=`echo $version | sed -e "s,\.old$,,g"`
   linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
 
@@ -290,7 +291,7 @@
   fi
 
   if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
-    linux_entry "${OS}" "${version}" simple \
+    linux_entry "${OS}" "${display_version}" simple \
     "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
 
     submenu_indentation="$grub_tab"

This modification makes the script 10_linux get the Linux version, from the output of the file command executed on the kernel file (for example $ file /boot/vmlinuz-linux). Note that the output of the command is filtered using GNU grep with Perl syntax (-P option) this allows the use of positive look-behind regex (?<=version).


Back to top