bugGNU GRUB - Bugs: bug #66208, GRUB_OS_PROBER_SKIP_LIST...

 
 

You are not allowed to post comments on this tracker with your current authentication level.

bug #66208: GRUB_OS_PROBER_SKIP_LIST (mis)behaviour or documentation

Submitter:  billiardmarker <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
Open/Closed:  Open Release:  other
Release:  Reproducibility:  Every Time
Planned Release:  None

Thu 12 Sep 2024 01:25:58 PM UTC, comment #1: 

"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...."

should of course read

"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 not be needed in other circumstances...."

Apologies - bm2

billiardmarker <billiardmarker2>
Thu 12 Sep 2024 12:51:07 PM UTC, original submission:  


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?

billiardmarker <billiardmarker2>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by billiardmarker2 (Submitted the item)
  •  

    There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

     

    No changes have been made to this item

    Back to the top

    Powered by Savane 3.15-e6e5.
    Corresponding source code