[Bug 1968149] Re: grub ignores GRUB_TIMEOUT_STYLE when on efi+btrfs

Launchpad Bug Tracker 1968149 at bugs.launchpad.net
Sun Dec 15 09:03:28 UTC 2024


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

** Changed in: grub2 (Ubuntu)
       Status: New => Confirmed

-- 
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/1968149

Title:
  grub ignores GRUB_TIMEOUT_STYLE when on efi+btrfs

Status in grub2 package in Ubuntu:
  Confirmed

Bug description:
  I'm using grub2, but with a configuration that may be a bit special:
  1) I'm using native UEFI boot.
  2) I have / formatted using btrfs (and no external /boot).
  3) / is contained inside a LUKS volume with just grub on the ESP. (with GRUB_ENABLE_CRYPTODISK=y)

  Everything works so far, but what I'm seeing on boot is this:
  1) the vendor logo
  2) a password prompt beneath
  3) a grub menu with a countdown
  4) a bootsplash with the vendor logo

  I'd like 3) to be gone, so I've set GRUB_TIMEOUT_STYLE to countdown,
  but it does not seem to have any effect.

  My /etc/default/grub looks like this:

  GRUB_DEFAULT=0
  # GRUB_HIDDEN_TIMEOUT=0
  # GRUB_HIDDEN_TIMEOUT_QUIET=true
  GRUB_RECORDFAIL_TIMEOUT=5
  GRUB_TIMEOUT=3
  GRUB_TIMEOUT_STYLE=countdown
  GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash kaslr i915.alpha_support=1"
  GRUB_CMDLINE_LINUX=""
  GRUB_ENABLE_CRYPTODISK=y

  
  My generated grub.cfg contains those two snippets which I guess are the cause:

  function recordfail {
    set recordfail=1
    # GRUB lacks write support for btrfs, so recordfail support is disabled.
  }

  which is generated by the following lines in /etc/grub.d/00_header:

   131   │ if [ "$quick_boot" = 1 ]; then
   132   │     cat <<EOF
   133   │ function recordfail {
   134   │   set recordfail=1
   135   │ EOF
   136   │ 
   137   │   check_writable () {
   138   │     abstractions="$(grub-probe --target=abstraction "${grubdir}")"
   139   │     for abstraction in $abstractions; do
   140   │       case "$abstraction" in
   141   │         diskfilter | lvm)
   142   │           cat <<EOF
   143   │   # GRUB lacks write support for $abstraction, so recordfail support is disabled.
   144   │ EOF
   145   │           return 1
   146   │           ;;
   147   │       esac
   148   │     done
   149   │ 
   150   │     FS="$(grub-probe --target=fs "${grubdir}")"
   151   │     case "$FS" in
   152   │       btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
   153   │     cat <<EOF
   154   │   # GRUB lacks write support for $FS, so recordfail support is disabled.
   155   │ EOF
   156   │     return 1
   157   │     ;;
   158   │     esac
   159   │ 
   160   │     cat <<EOF
   161   │   if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
   162   │ EOF
   163   │   }
   164   │ 
   165   │   if ! check_writable; then
   166   │     recordfail_broken=1
   167   │   fi
   168   │ 
   169   │   cat <<EOF
   170   │ }
   171   │ EOF
   172   │ fi

  and

  if [ "${recordfail}" = 1 ] ; then
    set timeout=5
  else
    if [ x$feature_timeout_style = xy ] ; then
      set timeout_style=countdown
      set timeout=3
    # Fallback hidden-timeout code in case the timeout_style feature is
    # unavailable.
    elif sleep --interruptible 3 ; then
      set timeout=0
    fi
  fi
  if [ $grub_platform = efi ]; then
    set timeout=5
    if [ x$feature_timeout_style = xy ] ; then
      set timeout_style=menu
    fi
  fi

  which is generated by:

   358   │ make_timeout ()
   359   │ {
   360   │     cat << EOF
   361   │ if [ "\${recordfail}" = 1 ] ; then
   362   │   set timeout=${GRUB_RECORDFAIL_TIMEOUT:-30}
   363   │ else
   364   │ EOF
   365   │     if [ "x${3}" != "x" ] ; then
   366   │     timeout="${2}"
   367   │     style="${3}"
   368   │     elif [ "x${1}" != "x" ] && \
   369   │      ([ "$quick_boot" = 1 ] || [ "x${1}" != "x0" ]) ; then
   370   │     # Handle the deprecated GRUB_HIDDEN_TIMEOUT scheme.
   371   │     timeout="${1}"
   372   │     if [ "x${2}" != "x0" ] ; then
   373   │         grub_warn "$(gettext "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set
         │  is no longer supported.")"
   374   │     fi
   375   │     if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
   376   │         style="hidden"
   377   │         verbose=
   378   │     else
   379   │         style="countdown"
   380   │         verbose=" --verbose"
   381   │     fi
   382   │     else
   383   │     # No hidden timeout, so treat as GRUB_TIMEOUT_STYLE=menu
   384   │     timeout="${2}"
   385   │     style="menu"
   386   │     fi
   387   │     cat << EOF
   388   │   if [ x\$feature_timeout_style = xy ] ; then
   389   │     set timeout_style=${style}
   390   │     set timeout=${timeout}
   391   │ EOF
   392   │     if [ "x${style}" = "xmenu" ] ; then
   393   │     cat << EOF
   394   │   # Fallback normal timeout code in case the timeout_style feature is
   395   │   # unavailable.
   396   │   else
   397   │     set timeout=${timeout}
   398   │ EOF
   399   │     else
   400   │     cat << EOF
   401   │   # Fallback hidden-timeout code in case the timeout_style feature is
   402   │   # unavailable.
   403   │   elif sleep${verbose} --interruptible ${timeout} ; then
   404   │     set timeout=0
   405   │ EOF
   406   │     fi
   407   │     cat << EOF
   408   │   fi
   409   │ fi
   410   │ EOF
   411   │ if [ "$recordfail_broken" = 1 ]; then
   412   │   cat << EOF
   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
   419   │ EOF
   420   │ fi
   421   │ }

  
  I realize that I'm running into a combination of #425979, #1878107, and #1964719 here, but the timeout style was never really mentioned in any of those (and supporting at least countdown would not interfere with either uefi or btrfs support), so I thought I'd open a new bug. Feel free to mark as a duplicate of any of them. :)

  Regarding the root cause, I guess saving the recordfail value in the
  ESP or a UEFI variable would probably work?

  $ lsb_release -rd
  Description:    Ubuntu 20.04.4 LTS
  Release:        20.04
  $ apt-cache policy grub2-common 
  grub2-common:
    Installed: 2.04-1ubuntu26.15
    Candidate: 2.04-1ubuntu26.15
    Version table:
   *** 2.04-1ubuntu26.15 500
          500 http://de.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
          100 /var/lib/dpkg/status
       2.04-1ubuntu26.12 500
          500 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages
       2.04-1ubuntu26 500
          500 http://de.archive.ubuntu.com/ubuntu focal/main amd64 Packages

  ProblemType: Bug
  DistroRelease: Ubuntu 20.04
  Package: grub2 (not installed)
  ProcVersionSignature: Ubuntu 5.13.0-40.45~20.04.1-generic 5.13.19
  Uname: Linux 5.13.0-40-generic x86_64
  ApportVersion: 2.20.11-0ubuntu27.23
  Architecture: amd64
  CasperMD5CheckResult: skip
  CurrentDesktop: KDE
  Date: Thu Apr  7 11:01:59 2022
  InstallationDate: Installed on 2015-12-11 (2308 days ago)
  InstallationMedia: Kubuntu 14.04.3 LTS "Trusty Tahr" - Beta amd64 (20150805)
  SourcePackage: grub2
  UpgradeStatus: Upgraded to focal on 2020-05-15 (691 days ago)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1968149/+subscriptions




More information about the foundations-bugs mailing list