URL:
  <https://savannah.gnu.org/bugs/?66208>

                 Summary: GRUB_OS_PROBER_SKIP_LIST (mis)behaviour or
documentation
                   Group: GNU GRUB
               Submitter: billiardmarker2
               Submitted: Thu 12 Sep 2024 12:51:07 PM UTC
                Category: User Interface
                Severity: Major
                Priority: 5 - Normal
              Item Group: Software Error
                  Status: None
                 Privacy: Public
             Assigned to: None
         Originator Name: billiardmarker2
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
                 Release: other
                 Release: 
         Reproducibility: Every Time
         Planned Release: None


    _______________________________________________________

Follow-up Comments:


-------------------------------------------------------
Date: Thu 12 Sep 2024 12:51:07 PM UTC By: billiardmarker <billiardmarker2>

Environment: machine running in BIOS mode with GPT mass storage (though I am
sure GPT or MBR is irrelevant) with multiple Linux versions and one Windows
version installed. I use Windows so seldom on this machine that I want to
exclude Windows & Windows Recovery entries from the Grub menu items built by
the OS Prober, while keeping the other Linux versions.

Using GRUB_OS_PROBER_SKIP_LIST in /etc/default/grub provides a way to do this,
but I found the documentation in Grub 2.12 Reference section 6.1 unhelpful and
had to add diagnostics to /etc/grub.d/30_os-prober to make progress.
Specifically, just using the UUID of the filesystem of the Windows partitions
I wanted to exclude did not work, and by experiment using just the UUID of the
filesystem of a Linux partition also did not work. Grub version is
2.12-1ubuntu7, I think it's unlikely that any changes made by ubuntu project
will affect matters.

The relevant code in Grub 2.12 /etc/grub.d/30_os-prober, round about line 140,
is


for OS in ${OSPROBED} ; do
  DEVICE="`echo ${OS} | cut -d ':' -f 1`"
  LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
  LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
  BOOT="`echo ${OS} | cut -d ':' -f 4`"
  if UUID="`${grub_probe} --target=fs_uuid --device ${DEVICE%@*}`"; then
    EXPUUID="$UUID"

    if [ x"${DEVICE#*@}" != x ] ; then
      EXPUUID="${EXPUUID}@${DEVICE#*@}"
    fi

    if [ "x${GRUB_OS_PROBER_SKIP_LIST}" != "x" ] && [ "x`echo
${GRUB_OS_PROBER_SKIP_LIST} | grep -i -e '\b'${EXPUUID}'\b'`" != "x" ] ; then
      echo "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2
      continue
    fi
  fi
  .
  .


where OSPROBED is a list of bootable partitions built starting from os-prober
utility output.

On my machine, the os-prober utility output for the main Windows partition is


/dev/sda5:Windows 8:Windows1:chain


and the filesystem uuid is C44C53AA4C5395D0. By adding "echo ... >&2"
statements, I can see that in BIOS mode the  code gives a EXPUUID value of
C44C53AA4C5395D0@/dev/sda5 and this is then checked for a match against the
GRUB_OS_PROBER_SKIP_LIST.

This is not what the documentation says. Is this behavior intentional? It
seems perverse, having specified a unique partition id, to also have to
specify the corresponding device name - expecially since this is not
guaranteed to remain the same if the machine's mass storage configuration
changes. (If you include this EXPUUID in the GRUB_OS_PROBER_SKIP_LIST then the
specified partition is indeed skipped, so my objective of skipping the Windows
entries could be achieved.)

In UEFI mode, for a (chain-loaded) Windows installation, the EXPUUID is as
documented, <UUID>@<EFI FILE>, with the <UUID> of the efi system partition and
the <EFI FILE> specifies the path to an .efi bootstrap file, for example
647D-0FDA@/EFI/Microsoft/Boot/bootmgfw.efi from one of my other machines. (I
don't have a uefi machine where the os prober would also encounter Linux
partitions, so cannot comment on that case.)

The documentation implies that the @xxxxx part of a skip list entry is
intended to be used only for chain-loading in UEFI mode, so should be needed
in other circumstances, but as there are no explanatory comments in the code
quoted above (or indeed in the rest of the script) about what it is trying to
do it is unclear to me whether the documentation is incomplete or the code is
wrong.

See also bug #63481 against Grub 2.06 open since 07 December 2022 which
plausibly suggests that the code is wrong. Can someone who is familiar with
the design and implementation of 30_os-prober address this issue, please?








    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?66208>

_______________________________________________
Message sent via Savannah
https://savannah.gnu.org/

Attachment: signature.asc
Description: PGP signature

Reply via email to