blog/grub-linux-version-fix/grub-linux-version-fix.md (2857B)
1 %% 2 title: "GRUB Menu: Linux Version Not Detected" 3 date: "02-Nov-2024" 4 %% 5 6 # GRUB Menu: Linux Version Not Detected 7 8 If your grub installation doesn't detect the Linux versions properly, and 9 displays it wrong in the prompt menu at boot, like in my case in which appeared 10 as `Arch Linux with Linux version linux`, you can solve it by modifying the 11 helper scripts which grub uses to build the configuration file. 12 13 The problem is caused by the script `grub-mkconfig` which is used to build the 14 grub configuration file `grub.cfg` (generally located on `/boot/grub/`). 15 16 The script `grub-mkconfig` uses other helper scripts located on `/etc/grub.d/`, 17 and in particular the file used to detect the Linux version is 18 `/etc/grub.d/10_linux`, which uses the file name of the kernel file 19 to detect the version (for example `/boot/vmlinuz-6.1.0-25-amd64`). The issue is 20 caused on distributions like Arch Linux that doesn't add the suffix of version 21 to the main kernel file (for example `/boot/vmlinuz-linux`). 22 23 The solution is to to modify the file `/etc/grub.d/10_linux` and make the 24 following changes (also as a [diff file](https://gist.githubusercontent.com/mjkloeckner/214a0ee42c920affe572e12e933a1bb0/raw/24bda0dfa02c7baba3b983fb71662c1904645fa8/fix-grub-linux-display-version.diff)): 25 26 ```diff 27 --- /etc/grub.d/10_linux 28 +++ /etc/grub.d/10_linux 29 @@ -144,7 +144,7 @@ 30 fi 31 printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/" 32 fi 33 - message="$(gettext_printf "Loading Linux %s ..." ${version})" 34 + message="$(gettext_printf "Loading Linux %s ..." ${display_version})" 35 sed "s/^/$submenu_indentation/" << EOF 36 echo '$(echo "$message" | grub_quote)' 37 linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} rw ${args} 38 @@ -217,6 +217,7 @@ 39 dirname=`dirname $linux` 40 rel_dirname=`make_system_path_relative_to_its_root $dirname` 41 version=`echo $basename | sed -e "s,vmlinuz-,,g"` 42 + display_version=`file $linux | grep -oP '(?<=version )\S*'` 43 alt_version=`echo $version | sed -e "s,\.old$,,g"` 44 linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" 45 46 @@ -290,7 +291,7 @@ 47 fi 48 49 if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then 50 - linux_entry "${OS}" "${version}" simple \ 51 + linux_entry "${OS}" "${display_version}" simple \ 52 "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" 53 54 submenu_indentation="$grub_tab" 55 ``` 56 57 This modification makes the script `10_linux` get the Linux version, from the 58 output of the `file` command executed on the kernel file (for example `$ file 59 /boot/vmlinuz-linux`). *Note* that the output of the command is filtered using 60 GNU grep with Perl syntax (`-P` option) this allows the use of positive 61 look-behind regex `(?<=version)`. 62 63 * [Previous diff file as GitHub gist](https://gist.github.com/mjkloeckner/214a0ee42c920affe572e12e933a1bb0)
