Set default kernel in GRUB

285,056

Solution 1

I think most distributions have moved additional kernels into the advanced options sub menu at this point, as TomTom found was the case with his Arch.

I didn't want to alter my top level menu structure in order to select a previous kernel as the default. I found the answer here:

http://www.humans-enabled.com/2014/08/how-to-set-default-grub-kernel-boot.html

To summarize:

1) Find the $menuentry_id_option for the submenu:

$ grep submenu /boot/grub/grub.cfg
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {

2) Find the $menuentry_id_option for the menu entry for the kernel you want to use:

$ grep gnulinux /boot/grub/grub.cfg
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {

3) Comment out your current default grub in /etc/default/grub and replace it with the sub-menu's $menuentry_id_option from step one, and the selected kernel's $menuentry_id_option from step two separated by >.

In my case the modified GRUB_DEFAULT is:

#GRUB_DEFAULT=0

GRUB_DEFAULT="gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc>gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc"

4) Update grub to make the changes. For Debian this is done like so:

$ sudo update-grub

Done. Now when you boot, the advanced menu should have an asterisk and you should boot into the selected kernel. You can confirm this with uname.

$ uname -a
Linux NAME 4.18.0-0.bpo.1-amd64 #1 SMP Debian 4.18.0-0 (2018-09-13) x86_64 GNU/Linux

Changing this back to the most recent kernel is as simple as commenting out the new line and uncommenting #GRUB_DEFAULT=0:

GRUB_DEFAULT=0

#GRUB_DEFAULT="gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc>gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc"

then rerunning update-grub.

Solution 2

After struggling for 2 hours, I have found a much easier way to achieve this. I just RTFM. ;)

Add two lines to /etc/default/grub

GRUB_SAVEDEFAULT=true
GRUB_DEFAULT=saved

Do the sudo update-grub, reboot, get into your grub menu and select whichever menu or submenu item you need. The choice will be saved every time and then your computer will boot into it automatically. When you manually choose a different entry, that becomes the new default.

Solution 3

As mentioned in the comments, you can set the default kernel to boot into using the grub-set-default X command, where X is the number of the kernel you want to boot into. In some distributions you can also set this number by editing the /etc/default/grub file and setting GRUB_DEFAULT=X, and then running update-grub.

The number is the index to an array of kernels/kernel settings shown in the GRUB menu during boot, with 0 being the first (top-most) entry. You can usually find the right number by looking for menuentry lines in /boot/grub/grub.cfg, like so:

grep menuentry /boot/grub/grub.cfg

You'll see each kernel listed with the name that is shown in the GRUB boot menu. The first one is 0, the second is 1, and so on.

Solution 4

Simply doing grep 'menuentry' /boot/grub/grub.cfg lists additional entries that are not related to the actual kernel or OS versions. For instance, it lists

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option

I would like to propose a small improvement to the method of searching that file: use awk

$ awk '/menuentry/ && /class/ {count++; print count-1"****"$0 }' /boot/grub/grub.cfg                                            
0****menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-86df21bf-d95f-435c-9292-273bdbcba056' {
1****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
2****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {
3****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
4****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {

With the command bellow and its output, you can see the awk code match actual OS version, and give you the number which you then may use in /etc/default/grub file.

In addition to editing the /etc/default/grub file by hand, I suggest using sed. In the command bellow, replace X with appropriate number you got from the awk command above:

sudo sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=X/g' /etc/default/grub; sudo update-grub

Solution 5

In order to do it with a GUI, I use Grub Customizer (I'm in Mint and have installed it like this.).

The idea is to keep the Advanced options in the grub list in case the default list is changed within Grub Customizer.

enter image description here

Then, under General settings select the default entry: previous booted entry.

enter image description here

Then, reboot, and during boot select the "Advanced options" entry in the grub list:

enter image description here

and select the desired kernel

enter image description here

On the next reboot, the "Advanced options" item will be the one selected by default in the grub list and the last selected kernel from under there will be booted (without opening the full list of kernels).

In case Windows is used, or other option in the grub list, remember to re-do the previous procedure.

Share:
285,056

Related videos on Youtube

TomTom
Author by

TomTom

Updated on September 18, 2022

Comments

  • TomTom
    TomTom over 1 year

    How can I pick which kernel GRUB2 should load by default? I recently installed a the linux realtime kernel and now it loads by default. I'd like to load the regular one by default.

    So far I only managed to pick the default OS.. and for some reason the /boot/grub.cfg already assumes that I want to load the rt-kernel and put it into the generic linux menu entry (in my case Arch Linux).

    • TomTom
      TomTom about 9 years
      But how do I know the number? The numbers in grub.cfg only correspond to the OSs and not the kernels.
    • TekOps
      TekOps over 5 years
      In some cases this works: askubuntu.com/questions/216398/… You can find the menu names by looking through this file: /boot/grub/grub.cfg
  • somethingSomething
    somethingSomething about 9 years
    In Fedora 21 it's /boot/grub2/grub.cfg.
  • Aleksandr Dubinsky
    Aleksandr Dubinsky over 7 years
    This isn't an answer. It reads like a comment. An answer should say, "This is how to set the default entry in GRUB", not "let me make an addendum to another answer". You can easily edit this into a proper answer, but it might be smarter to just leave a comment on jkt123's answer about using awk instead of grep.
  • Dronacharya
    Dronacharya about 7 years
    This is not working for me. The latest kernel in my installation is 4.4.0-64-generic (menuentry 0) but I want 4.4.0-59-generic (menuentry 9) to be the default boot kernel. I ran grub-set-default 9 and then grub-update and rebooted. I let grub boot with the default kernel and it still boots with 4.4.0-64-generic. I also tried editing /etc/default/grub and set GRUB_DEFAULT=9 and ran grub-update. On rebooting nothing changes, system still boots with 4.4.0-64-generic. Maybe I missed something, can anyone help me?
  • Luis
    Luis over 6 years
    This did not work for me either. I deleted the unwanted kernel like explained here: askubuntu.com/a/764242/456247
  • Cameron
    Cameron over 4 years
    I think this answer does improve signifcantly on the answer proposing grep, if you compare the output of the two, the awk output is much easier to use (includes number, easier to read). But, the introduction should probably be re-written so this answer stands alone, and doesn't read like a comment to the grep answer.
  • bela83
    bela83 almost 4 years
    As of 2020, sudo update-grub returns a command not found in Arch. Instead the command sudo grub-mkconfig -o /boot/grub/grub.cfg should be used.
  • daslicious
    daslicious over 3 years
    I had to comment out GRUB_DEFAULT=0
  • geekley
    geekley over 3 years
    "The choice will be saved and next time your computer will boot into it automatically". So it only saves the default once in the next reboot? Or will it it automatically change the default every time you choose a specific kernel?
  • RichieHH
    RichieHH over 3 years
    @geekley what do you think save default means?
  • geekley
    geekley over 3 years
    @RichieHH I made that comment before editing the answer. Before, it wasn't so clear if the default would be saved only on the first reboot or every time I choose an option. That's why I rephrased it to better clarify that the default changes every time you manually choose a different entry. Btw, this saved default is not necessarily the first choice (like "Ubuntu"), it can be a sub-entry (like "Ubuntu with linux X.Y.Z generic"). The first choice won't automatically reflect the default, which might get you a bit confused if you have 2 kernels like linux and linux-libre.
  • S.K. Venkat
    S.K. Venkat almost 3 years
    This method is quite adventurous with out having the GUI console or Serial console.... Trying to change the aws kernel to generic kernel and after rebooting the AWS EC2 instance (which has been deployed in the the region doesn't support serial console feature), its not accessible.. It seems, that was stuck at the grub menu itself, but the aws dashboard system checks are in green.
  • jarno
    jarno over 2 years
    The problem is that the default kernel does not update when a new kernel of the desired series gets installed.
  • Andyc
    Andyc over 2 years
    @Dronacharya After 5 years I can tell you that you probably needed to write both the submenu number (0 for the top one, 1 for "Advanced options") and then the menuentry number (9), all in between quotes, like GRUB_DEFAULT="1>9".
  • Andyc
    Andyc over 2 years
    I suspect this would not survive a kernel update (and neither would the method with the numbers).
  • hfingler
    hfingler about 2 years
    I would love to see a real helper to do this thing and not just scripts. I tried this solution and I broke my boot and, since I don't have physical access to the machine, I couldn't boot it anymore. On Ubuntu 20 the default option is GRUB_DEFAULT="1>0", and not just a number. I wanted to boot option 5 (from this awk cmd), but 1>5 broke it since apparently the second menu is a 0-indexed menu. Still looking for a reliable remote solution to set default kernel...