22

I tried to update my grub config file to timeout to 0 value, so OS starts quickly. I modified /etc/default/grub configuration file on my Ubuntu 18.04 and then ran:

sudo update-grub

and it didn't work. I also ran:

sudo grub-mkconfig
sudo update-grub

but they didn't work.

I searched a lot on the web to solve this issue, but all guides say to run the update-grub command to update grub by /etc/default/grub config file. I don't know if is Ubuntu 18.04 that handles grub files in a different way, but I cannot update my grub with my parameters.

This is my /etc/default/grub file:

# 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=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=0
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"
14
  • 3
    Please edit your question and include your modified grub config file. Otherwise we're just trying to guess what you did. Commented May 14, 2018 at 12:04
  • Do you have other distributions installed (dual boot)?
    – mook765
    Commented May 14, 2018 at 12:22
  • it didn't work mean that my grub timeout is still set to 10 sec as by default @Melebius
    – Bob91
    Commented May 14, 2018 at 12:27
  • I have windows in the same ssd and other distros installed on other hdd, but last month i had fedora 27 (instead of ubuntu 18) and it worked when i changed grub config file, so i think the other distros aren't the causes of this behavior @mook765
    – Bob91
    Commented May 14, 2018 at 12:35
  • 1
    Could you please run Boot-Info and edit your question to include a link to its resulting info log? Thanks. Commented May 15, 2018 at 13:48

9 Answers 9

18

In /boot/grub/grub.cfg file there is a condition, almost at the end of the file, that sets the timeout to 10 if the timeout is set to 0. In other words, if you set the timeout to 0 in your /etc/default/grub and then update grub, the condition above reset it to 10 seconds.

if [ "${timeout}" = 0 ]; then
     set timeout=10
fi

However, /boot/grub/grub.cfg is a read-only file and I cannot remove that condition. I made some tests with different values of the timeout in /etc/default/grub. I tried with 1ms (0.001), 0.1s and 1s and I found out that values below 1 (like 0.1 and 0.001) work in the same way and almost like timeout set to 0.

3
  • 2
    work in the same way and almost like timeout that's because math in bash supports integers only. The shortest timeout that would make a difference is 1. Commented Dec 3, 2019 at 4:46
  • The GRUB manual says Set [GRUB_TIMEOUT] to '0' to boot immediately without displaying the menu, so this is either a patch added downstream by Ubuntu, or the GRUB project forgot to update their documentation. I'll have to set it to 1 instead, but it sucks. Commented Oct 4, 2023 at 4:22
  • I found more info. That conditional comes from the "os prober" module. If you don't need it, disable it with GRUB_DISABLE_OS_PROBER=true, then you can set timeout to zero. Commented Oct 4, 2023 at 4:31
10

In my case, the problem was that my system didn't support "recordfail" which caused a separate block to get added to the grub.cfg which defaults to a timeout of 30 seconds. The relevant code in /etc/grub.d/00_header:

if [ "$recordfail_broken" = 1 ]; then
  cat << EOF
if lsefi; then
  set timeout=${GRUB_RECORDFAIL_TIMEOUT:-30}
  if [ x\$feature_timeout_style = xy ] ; then
    set timeout_style=menu
  fi
fi
EOF

The fix is simply to add a value for GRUB_RECORDFAIL_TIMEOUT in /etc/default/grub and run update-grub again. For example:

GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""

# Adjusted timeout for system which doesn't support recordfail
GRUB_RECORDFAIL_TIMEOUT=2

# 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"
5

You can set GRUB_TIMEOUT to 0.

The part overwriting timeout value is written in ajust_timeout function in the top of /etc/grub.d/30_os-prober.

ajust_timeout () {
...
if [ "\${timeout}" = 0]; then
  set timeout=10
fi
...
}

So, you can set the value by editing the file and comment out if-block.

1
  • Or you can do what @mook765 says and override the timeout in /etc/grub.d/40_custom instead, which is more correct because it's a file that is meant to be customized by the user.
    – Adrian
    Commented Sep 26, 2023 at 10:47
4

Like the other answers say, uncomment GRUB_HIDDEN_TIMEOUT and run update-grub. Then comment out the

if [ "${timeout}" = 0 ]; then
  set timeout=10
fi

section in /boot/grub/grub.cfg. In vim you can just override the read-only property with an exclamation point :x!. Or you can run

sudo chmod +w /boot/grub/grub.cfg
sudo vim /boot/grub/grub.cfg
sudo chmod -w /boot/grub/grub.cfg

to temporarily have write permission while editing the file.

2
  • 3
    You are right, but i think everytime you update grub (manually or when there are any os upgrade) the /boot/grub/grub.cfg will recreated with the condition above.
    – Bob91
    Commented May 24, 2018 at 16:37
  • 2
    That is true, the file is overwritten on update, as I experienced recently.
    – asantas93
    Commented May 25, 2018 at 17:20
1

Uncomment GRUB_HIDDEN_TIMEOUT=0 and run update-grub again.

4
  • 1
    it doesn't work
    – Bob91
    Commented May 15, 2018 at 14:14
  • GRUB_HIDDEN_TIMEOUT=-1
    – kuhajeyan
    Commented Nov 20, 2018 at 16:33
  • 1
    GRUB_HIDDEN_TIMEOUT=-1 worked on Ubuntu 18.10.
    – Manish
    Commented Feb 2, 2019 at 10:01
  • This option is unset by default and deprecated in favour of GRUB_TIMEOUT_STYLE
    – Adrian
    Commented Sep 26, 2023 at 10:52
1

This behaviour is experienced in both Ubuntu 18.04 and 20.04 and even though some of the other answers has solutions that work as expected, either files that has on the header an "do not edit this file" notice such as the /boot/grub/grub.cfg are manually edited, or the changes are not persistent after system updates or regenerating grub configuration files (at least weren't for me). Here's a step by step of what I've been doing to change such behaviour in a persistent fashion.

Step 1 - Modify the template file /etc/grub.d/30_os-prober

Grub uses some template files located at /etc/grub.d in order to generate the /boot/grub/grub.cfg. Edit the file with your editor of choice...

# vim /etc/grub.d/30_os-prober

... and either comment or remove the lines below that override the timeout when it's set to zero.

if [ "\${timeout}" = 0 ]; then
  set timeout=10
fi

Step 2 - Modify the file /etc/default/grub

Grub uses this file to set configuration values in order to generate the /boot/grub/grub.cfg. Edit the file with your editor of choice...

# vim /etc/default/grub

... and set the timeout for zero (use the second option if the GRUB_TIMEOUT_STYLE is set to hidden)

GRUB_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT=0

Step 3 - Generate the file /boot/grub/grub.cfg

# update-grub2

... and after the next machine reboot the expected behaviour is having a timeout of zero on grub menu.

1
  • Why commenting or removing the lines that set the timeout to 10 in /etc/grub.d/30_os-prober when you can edit it to set it to zero instead and save yourself from doing step 2? Or even better, instead of editing this file, edit /etc/grub.d/40_custom as @mook765 suggests
    – Adrian
    Commented Sep 26, 2023 at 10:56
1

We can simply add the line

set timeout=0

to /etc/grub.d/40_custom, make the file executable with

sudo chmod +x /etc/grub.d/40_custom

and run

sudo update-grub

to generate the new /boot/grub/grub.cfg-file. The set timeout-command we added is the last set timeout-command in /boot/grub/grub.cfg now, that is what counts.

0

You can set GRUB_TIMEOUT to -1.

Ex:GRUB_TIMEOUT="-1"

2
  • 1
    'GRUB_TIMEOUT' Boot the default entry this many seconds after the menu is displayed, unless a key is pressed. The default is '5'. Set to '0' to boot immediately without displaying the menu, or to '-1' to wait indefinitely. from command info -f grub -n 'Simple configuration
    – Vijay
    Commented Feb 20, 2019 at 14:10
  • @GiceuCassiano your solution is the complete opposite of setting the timeout to zero because -1 waits forever until the user selects an option. It is therefore as if you specified infinity.
    – Adrian
    Commented Sep 26, 2023 at 10:50
-1

The solution is to add

GRUB_RECORDFAIL_TIMEOUT=0

to /etc/default/grub.

All other solutions will be reset on grub updates.

1
  • This solution works when the timeout is set to 30 seconds because the 30 seconds timeout comes from the default value of GRUB_RECORDFAIL_TIMEOUT, which is used when the first attempt to boot fails if I recall correctly (I might be wrong). Also, not all other solutions will be reset on grub updates.
    – Adrian
    Commented Sep 26, 2023 at 11:00

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .