update-grub uses the wrong timout for efi system

Bug #1918736 reported by Jasper
10
This bug affects 2 people
Affects Status Importance Assigned to Milestone
grub2 (Ubuntu)
Confirmed
Undecided
Unassigned

Bug Description

# What is happening
When `GRUB_TIMEOUT=1` is set in `/etc/default/grub` and `update-grub` is run, the desired grub boot menu timeout of 1 second is not acknowledged.
This is on an EFI system.

The following is the relevant snippet of `/boot/grub/grub.cfg`:
```
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=hidden
    set timeout=1
  # Fallback hidden-timeout code in case the timeout_style feature is
  # unavailable.
  elif sleep --interruptible 1 ; then
    set timeout=0
  fi
fi
if [ $grub_platform = efi ]; then
  set timeout=30
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
  fi
fi
```

The issue here is that on an EFI system, the `timeout` is overridden by the later test to 30 seconds.

# What is expected
I expect that when I set `GRUB_TIMEOUT=1` in `/etc/default/grub` that the grub menu will timeout (continue to boot) in 1 second.

# Workaround
The EFI timeout is taken from `GRUB_HIDDEN_TIMEOUT_QUIET` in `/etc/grub.d/00_header`. Adding `GRUB_HIDDEN_TIMEOUT_QUIET=1` solves the problem, but is the wrong approach.

# Possible solutions
As a user I do not see why on an EFI system there should be a separate timeout, or indeed that the timeout should even depend on the system type. i.e As a user I don't care.

Looking at the generated grub config I would expect that the generated output would be:
```
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=hidden
    set timeout=1
  # Fallback hidden-timeout code in case the timeout_style feature is
  # unavailable.
  elif sleep --interruptible 1 ; then
    set timeout=0
  fi
fi
if [ $grub_platform = efi ]; then
  set timeout=1
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
  fi
fi
```

but am confused as to why the EFI detection is in a separate `if...`

Clearly the code in `/etc/grub.d/00_header` should be changed from:
```
413 if [ \$grub_platform = efi ]; then
414 set timeout=${GRUB_RECORDFAIL_TIMEOUT:-30}
415 if [ x\$feature_timeout_style = xy ] ; then
416 set timeout_style=menu
417 fi
418 fi
```
to
```
413 if [ \$grub_platform = efi ]; then
414 set timeout=${GRUB_TIMEOUT:-30}
415 if [ x\$feature_timeout_style = xy ] ; then
416 set timeout_style=menu
417 fi
418 fi
```

# Additional information

Ubunutu version:
```
lsb_release -r
Release: 20.10
```

Package version
```
dpkg -l grub2-common
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-================-============-=====================================================
ii grub2-common 2.04-1ubuntu35.4 amd64 GRand Unified Bootloader (common files for version 2)
```

Revision history for this message
Jasper (jasper-mackenzie) wrote :

This is potentially the same as #1814403

Revision history for this message
goniomdq (jose-goni) wrote :

I don't think this is a duplicate of #1814403
And I agree with the OP that the menu timeout in EFI platforms should be controlled by GRUB_TIMEOUT and not by GRUB_RECORDFAIL_TIMEOUT. It doesn't make sense to me that it's GRUB_RECORDFAIL_TIMEOUT.
However, I'd be happy to be schooled here to understand why it needs to be this way.
Cheers.

Revision history for this message
Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in grub2 (Ubuntu):
status: New → Confirmed
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers