47

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).

  • 2
    grub2-set-default <title or number> ? – taliezin Apr 22 '15 at 21:15
  • 1
    But how do I know the number? The numbers in grub.cfg only correspond to the OSs and not the kernels. – TomTom Apr 22 '15 at 21:17
  • In some cases this works: askubuntu.com/questions/216398/… You can find the menu names by looking through this file: /boot/grub/grub.cfg – TekOps Oct 4 '18 at 5:18
41

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 to the most recent kernel is as simple as commenting out the new line and uncommenting #GRUB_DEFAULT=0, then rerunning update-grub.

28
+150

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 and next time your computer will boot into it automatically.

21

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.

  • 1
    In Fedora 21 it's /boot/grub2/grub.cfg. – somethingSomething Apr 23 '15 at 0:01
  • 3
    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? – Dronacharya Feb 27 '17 at 14:40
  • This did not work for me either. I deleted the unwanted kernel like explained here: askubuntu.com/a/764242/456247 – Luis Jan 11 '18 at 10:52
8

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

  • 2
    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. – Aleksandr Dubinsky Sep 28 '16 at 8:50
2

jkt123's will work for most distributions I guess. However for Arch Linux it didn't work, at least not with the packages I have available.

The indices you can set with grub-set-default only correspond to the main menu entries. The kernel options are however in a submenu. So either you move the kernel entry out of the submenu into the main menu or you put the entry on top of the submenu list and select the submenu.

My Grub Menu

  • Arch Linux
  • Advanced options for Arch Linux
    • Kernel 1
    • Kernel 2
  • Windows

To be able to boot Kernel 2 you have to either swap it with Kernel 1 or you put it outside the submenu on the same level as Arch Linux or Windows. And then set the default number to one of the main menu indices. For example in the menu above "0" boots "Arch Linux" and "1" boots Kernel 1.

To change the hierarchy and swap, open /boot/grub/grub.cfg and move the entry you wish to move. An entry could look like this

menuentry 'ENTRY NAME'
   ... some code ...
}

Then you need to apply your changes. In my case with grub-mkconfig. But this might vary from system to system.

0

As recently as CentOS-6.6 grub.conf looked like this can could be manually edited to change the default selection:

default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
0

Debian Stretch:

Rather than messing around with config files, create a folder in /noot (call it what you want), leave the kernel you want, along with the matching config and system files, in /boot and move the rest to this new folder.

Run update-grub.

Double check the /boot folder that your kernel version and matching config and system files are are still there (in case you copied something you shouldn't have) and reboot.

protected by dr01 Jul 23 at 7:24

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.