I’m dual booting Windows and Linux Mint on my laptop. The grub default is to boot into Linux Mint, however many people will probably want to either boot the last boot entry saved, or boot into Windows instead. My preference is for grub to select by default and boot into whatever boot entry was selected last. This makes it easy if I want to just hit reboot and know that I’m going to load into the last used operating system.
Boot into last booted Operating System:
FYI: This won’t work if your boot partition resides on BTRFS file system.
GRUB_SAVEDEFAULT= on the other hand makes use of grubenv and GRUB_SAVEDEFAULT=saved makes a …‘setting’ or ‘entry’ in /boot/grub/grubenv.
When we boot up, the grub.cfg has a ‘stanza’ to check if there is any entry in /boot/grub/grubenv and use that to make make the last ‘saved’ or ‘last boot entry’ as the default.
So to enable ‘last boot entry’ as default, we will need both
GRUB_SAVEDEFAULT=true
GRUB_DEFAULT= savedThat’s the reason these are 2 separate options in /etc/default/grub.
Hope this explains
Now, btrfs (and f2fs) by reason of their file structure, cannot use grubenv and when the grub.cfg tries to access it, there will be a non-fatal error. So since GRUB_DEFAULT= does not need to access grubenv (without GRUB_SAVEDEFAULT=true), there will be no error.
{note we now do not need to have separate boot partitions for these file systems}
https://forum.manjaro.org/t/solved-grub-btrfs-error-sparse-file-not-allowed/70031/9
You will need to change/add the following two lines in the grub config:
/etc/default/grub.cfg
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
For me on Linux Mint 19 the GRUB_SAVEDEFAULT definition was missing so I needed to add it in there.
And then update the grub boot config by:
update-grub
Boot into specific Grub entry:
/etc/default/grub.cfg
GRUB_DEFAULT=saved
Then you will need to:
Tip: Grub boot entries begin with 0, so if you want to select the third boot option which was Windows in my case then enter 2
grub-set-default <Enter here the boot entry you want to preselect>
Example:
grub-set-default 2
update-grub
Here are the contents of my entire grub.cfg:
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
/boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function recordfail {
set recordfail=1
if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
else
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
fi
font="/usr/share/grub/unicode.pf2"
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=$prefix/locale
set lang=en_US
insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
set timeout=30
else
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=hidden
set timeout=5
# Fallback hidden-timeout code in case the timeout_style feature is
# unavailable.
elif sleep --interruptible 5 ; then
set timeout=0
fi
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
set gfxpayload="${1}"
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=1
else
set vt_handoff=
fi
}
if [ "${recordfail}" != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Linux Mint 19.1 Cinnamon' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-5768e3fd-cf47-48fc-a631-6027001dbf01' {
recordfail
savedefault
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
else
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
fi
linux /boot/vmlinuz-4.15.0-47-generic root=UUID=5768e3fd-cf47-48fc-a631-6027001dbf01 ro quiet splash $vt_handoff
initrd /boot/initrd.img-4.15.0-47-generic
}
submenu 'Advanced options for Linux Mint 19.1 Cinnamon' $menuentry_id_option 'gnulinux-advanced-5768e3fd-cf47-48fc-a631-6027001dbf01' {
menuentry 'Linux Mint 19.1 Cinnamon, with Linux 4.15.0-47-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-47-generic-advanced-5768e3fd-cf47-48fc-a631-6027001dbf01' {
recordfail
savedefault
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
else
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
fi
echo 'Loading Linux 4.15.0-47-generic ...'
linux /boot/vmlinuz-4.15.0-47-generic root=UUID=5768e3fd-cf47-48fc-a631-6027001dbf01 ro quiet splash $vt_handoff
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.15.0-47-generic
}
menuentry 'Linux Mint 19.1 Cinnamon, with Linux 4.15.0-47-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-47-generic-recovery-5768e3fd-cf47-48fc-a631-6027001dbf01' {
recordfail
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
else
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
fi
echo 'Loading Linux 4.15.0-47-generic ...'
linux /boot/vmlinuz-4.15.0-47-generic root=UUID=5768e3fd-cf47-48fc-a631-6027001dbf01 ro recovery nomodeset
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.15.0-47-generic
}
menuentry 'Linux Mint 19.1 Cinnamon, with Linux 4.15.0-20-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-20-generic-advanced-5768e3fd-cf47-48fc-a631-6027001dbf01' {
recordfail
savedefault
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
else
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
fi
echo 'Loading Linux 4.15.0-20-generic ...'
linux /boot/vmlinuz-4.15.0-20-generic root=UUID=5768e3fd-cf47-48fc-a631-6027001dbf01 ro quiet splash $vt_handoff
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.15.0-20-generic
}
menuentry 'Linux Mint 19.1 Cinnamon, with Linux 4.15.0-20-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-20-generic-recovery-5768e3fd-cf47-48fc-a631-6027001dbf01' {
recordfail
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
else
search --no-floppy --fs-uuid --set=root 5768e3fd-cf47-48fc-a631-6027001dbf01
fi
echo 'Loading Linux 4.15.0-20-generic ...'
linux /boot/vmlinuz-4.15.0-20-generic root=UUID=5768e3fd-cf47-48fc-a631-6027001dbf01 ro recovery nomodeset
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.15.0-20-generic
}
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_memtest86+ ###
### END /etc/grub.d/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows Boot Manager (on /dev/nvme0n1p2)' --class windows --class os $menuentry_id_option 'osprober-efi-361F-370E' {
savedefault
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root 361F-370E
else
search --no-floppy --fs-uuid --set=root 361F-370E
fi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
set timeout=10
fi
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/30_uefi-firmware ###
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {
fwsetup
}
### END /etc/grub.d/30_uefi-firmware ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###