[Bug 1918736] Re: update-grub uses the wrong timout for efi system
Mate Kukri
1918736 at bugs.launchpad.net
Wed Jun 19 08:43:46 UTC 2024
The long timeout only happens when boot fails and GRUB must show the
menu for kernel selection.
Otherwise your set timeout is respected.
As per the above command, GRUB drivers cannot write the environment
block to certain filesystems and recordfail doesn't work, so the timeout
is always shown.
** Changed in: grub2 (Ubuntu)
Importance: Undecided => Wishlist
** Summary changed:
- update-grub uses the wrong timout for efi system
+ recordfail timeout always forced on FS without writable envblocks
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to grub2 in Ubuntu.
https://bugs.launchpad.net/bugs/1918736
Title:
recordfail timeout always forced on FS without writable envblocks
Status in grub2 package in Ubuntu:
Confirmed
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)
```
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1918736/+subscriptions
More information about the foundations-bugs
mailing list