Grub finds all old OSs again even though they are not in /boot/efi

I have this issue again:

Weirdly, I paid attention during previous updates and this did not show. Today suddenly I see this again.

Generating grub configuration file ...
Found theme: /usr/share/grub/themes/manjaro/theme.txt
Found linux image: /boot/vmlinuz-5.15-x86_64
Found initrd image: /boot/intel-ucode.img /boot/initramfs-5.15-x86_64.img
Found initrd fallback image: /boot/initramfs-5.15-x86_64-fallback.img
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Found Debian GNU/Linux 10 (buster) on /dev/nvme0n1p2
Found Debian GNU/Linux 11 (bullseye) on /dev/nvme0n1p2
Found Debian GNU/Linux 10 (buster) on /dev/nvme0n1p2
Found Ubuntu 18.04.5 LTS on /dev/nvme0n1p2
Found Ubuntu 20.04.4 LTS on /dev/nvme0n1p2
Found Ubuntu 20.04.4 LTS on /dev/nvme0n1p2
Found Debian GNU/Linux 11 (bullseye) on /dev/nvme0n1p2
Found Ubuntu 20.04.4 LTS on /dev/nvme0n1p2
Adding boot menu entry for UEFI Firmware Settings ...
Detecting snapshots ...

The proposed solution:

Just remove the directories for previous Linux installations from /boot/efi/EFI.

But my `/boot/efi/EFI does not contain folders for previous Linux installations:

  /boot/efi/EFI>  ls -a
.  ..  boot  Manjaro

And my grub.cfg file also did not contain the words ubuntu or debian.

How can I permanently stop this from happening?

Hi @zilexa,

Please provide the output of:

ls -l /boot

Hi, here you go:

ls -l /boot                                                      ✔ 
total 67108
drwx------ 3 root root     4096  1 jan  1970 efi
drwxr-xr-x 1 root root      112 25 jun 15:02 grub
-rw------- 1 root root 38567680 25 jun 15:00 initramfs-5.15-x86_64-fallback.img
-rw------- 1 root root 14508356 25 jun 15:00 initramfs-5.15-x86_64.img
-rw-r--r-- 1 root root  5174272 10 mei 20:27 intel-ucode.img
-rw-r--r-- 1 root root       22 22 jun 16:14 linux515-x86_64.kver
drwxr-xr-x 1 root root       22 14 mrt 10:32 memtest86+
-rw-r--r-- 1 root root 10451552 25 jun 15:00 vmlinuz-5.15-x86_64

You can also use Maxi

to collect information about the boot process. This works,

  • when you are in your running system (with CTRL+ALT+F2).
  • And also in a live environment

Hmmm, curiouser and curiouser. I see nothing funny there.

What is the output of:

cat /etc/grub.d/10_linux

I’ve got to be off, so listen to @andreas85’s advice.

There is no rush:

#! /bin/sh                                                                set -e                                                                                                                                              # grub-mkconfig helper script.                                            # Copyright (C) 2006,2007,2008,2009,2010  Free Software Foundation, Inc.  #                                                                         # GRUB is free software: you can redistribute it and/or modify            # it under the terms of the GNU General Public License as published by    # the Free Software Foundation, either version 3 of the License, or       # (at your option) any later version.                                     #                                                                         # GRUB is distributed in the hope that it will be useful,                 # but WITHOUT ANY WARRANTY; without even the implied warranty of          # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           # GNU General Public License for more details.                            #                                                                         # You should have received a copy of the GNU General Public License       # along with GRUB.  If not, see <http://www.gnu.org/licenses/>.                                                                                     prefix="/usr"                                                             exec_prefix="/usr"                                                        datarootdir="/usr/share"                                                  quiet_boot="1"                                                                                                                                      . "$pkgdatadir/grub-mkconfig_lib"                                                                                                                   export TEXTDOMAIN=grub                                                    export TEXTDOMAINDIR="${datarootdir}/locale"                                                                                                        CLASS="--class gnu-linux --class gnu --class os"                          
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS=Linux
else
  OS="${GRUB_DISTRIBUTOR} Linux"
  CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi

# loop-AES arranges things so that /dev/loop/X can be our root device, but# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
  /dev/loop/*|/dev/loop[0-9])
    GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
  ;;
esac

if [ "x${GRUB_CMDLINE_LINUX_RECOVERY}" = "x" ] ; then
  GRUB_CMDLINE_LINUX_RECOVERY=single
fi

# Default to disabling partition uuid support to maintian compatibility with
# older kernels.
GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true}

# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter
# and mounting btrfs requires user space scanning, so force UUID in this case.
if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \
    || ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
&& [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \
    || ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
&& ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \
    || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then
  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \
    || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then
  LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID}
else
  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi

case x"$GRUB_FS" in
    xbtrfs)
rootsubvol="`make_system_path_relative_to_its_root /`"
rootsubvol="${rootsubvol#/}"
if [ "x${rootsubvol}" != x ]; then
    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
fi;;
    xzfs)
rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs%/}"
;;
esac

title_correction_code=

linux_entry ()
{
  os="$1"
  version="$2"
  type="$3"
  args="$4"

  if [ -z "$boot_device_id" ]; then
      boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
  fi
  if [ x$type != xsimple ] ; then
      case $type in
  recovery)
      title="$(gettext_printf "%s (Kernel: %s - recovery mode)" "${os}" "${version}")" ;;
  fallback)
      title="$(gettext_printf "%s (Kernel: %s - fallback initramfs)" "${os}" "${version}")" ;;
  *)
      title="$(gettext_printf "%s (Kernel: %s)" "${os}" "${version}")" ;;
      esac
      if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
  replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
  quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
  title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
  grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
      fi
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  else
      echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  fi      
  if [ x$type != xrecovery ] && [ x$type != xfallback ] ; then
      save_default_entry | grub_add_tab
  fi

  # Use ELILO's generic "efifb" when it's known to be available.
  # FIXME: We need an interface to select vesafb in case efifb can't be used.
  if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
      echo "load_video" | sed "s/^/$submenu_indentation/"
      if grep -qx "CONFIG_FB_EFI=y" "${config}" 2> /dev/null \
  && grep -qx "CONFIG_VT_HW_CONSOLE_BINDING=y" "${config}" 2> /dev/null; then
  echo "set gfxpayload=keep" | sed "s/^/$submenu_indentation/"
      fi
  else
      if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
  echo "load_video" | sed "s/^/$submenu_indentation/"
      fi
      echo "set gfxpayload=$GRUB_GFXPAYLOAD_LINUX" | sed "s/^/$submenu_indentation/"
  fi

  echo "insmod gzio" | sed "s/^/$submenu_indentation/"

  if [ x$dirname = x/ ]; then
    if [ -z "${prepare_root_cache}" ]; then
      prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)"
    fi
    printf '%s\n' "${prepare_root_cache}" | sed "s/^/$submenu_indentation/"
  else
    if [ -z "${prepare_boot_cache}" ]; then
      prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
    fi
    printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
  fi

  if [ "x${GRUB_ROOT_FS_RO}" = "xtrue" ]; then
    grub_root_fs_mode=ro
  else
    grub_root_fs_mode=rw
  fi

  if [ x"$quiet_boot" = x0 ]; then
    message="$(gettext_printf "Loading Linux %s ..." "${version}")"
    sed "s/^/$submenu_indentation/" << EOF
echo'$(echo "$message" | grub_quote)'
EOF
  fi
    sed "s/^/$submenu_indentation/" << EOF
linux${rel_dirname}/${basename} root=${linux_root_device_thisversion} ${grub_root_fs_mode} ${args}
EOF
  if test -n "${initrd}" ; then
    # TRANSLATORS: ramdisk isn't identifier. Should be translated.
    message="$(gettext_printf "Loading initial ramdisk ...")"
    initrd_path=
    for i in ${initrd}; do
      initrd_path="${initrd_path} ${rel_dirname}/${i}"
    done
    if [ x"$quiet_boot" = x0 ]; then
      sed "s/^/$submenu_indentation/" << EOF
echo'$(echo "$message" | grub_quote)'
EOF
  fi
    sed "s/^/$submenu_indentation/" << EOF
initrd$(echo $initrd_path)
EOF
  fi
  sed "s/^/$submenu_indentation/" << EOF
}
EOF
}

machine=`uname -m`
case "x$machine" in
    xi?86 | xx86_64)
list=
for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
    if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
    *) 
list=
for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
                  if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
esac

case "x$machine" in
    aarch64)
list=
for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* /boot/Image ; do
    if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
    *) 
list=
for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* /boot/Image ; do
                  if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi
done ;;
esac

case "$machine" in
    i?86) GENKERNEL_ARCH="x86" ;;
    mips|mips64) GENKERNEL_ARCH="mips" ;;
    mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
    arm*) GENKERNEL_ARCH="arm" ;;
    *) GENKERNEL_ARCH="$machine" ;;
esac

prepare_boot_cache=
prepare_root_cache=
boot_device_id=
title_correction_code=

# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""

is_top_level=true
while [ "x$list" != "x" ] ; do
  linux=`version_find_latest $list`
  gettext_printf "Found linux image: %s\n" "$linux" >&2
  basename=`basename $linux`
  dirname=`dirname $linux`
  rel_dirname=`make_system_path_relative_to_its_root $dirname`
  version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
  alt_version=`echo $version | sed -e "s,\.old$,,g"`
  linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"

  if test -e "/etc/manjaro-release" ; then
    kbasename="`echo "${basename}" | sed -e 's,vmlinuz-,linux,g'`"
    if test -e "${dirname}/${kbasename}.kver" ; then
 version="$(cat ${dirname}/${kbasename}.kver)"
    fi
    kbasename2="`echo "${basename}" | sed -e 's,vmlinuz-,linux-,g'`"
    if test -e "${dirname}/${kbasename2}.kver" ; then
 version="$(cat ${dirname}/${kbasename2}.kver)"
    fi
    kbasename3="`echo "${basename}" | sed -e 's,vmlinuz-,linux,g' | sed -e 's,\.,,g'`"
    if test -e "${dirname}/${kbasename3}.kver" ; then
 version="$(cat ${dirname}/${kbasename3}.kver)"
    fi
    kbasename4="`echo "${basename}" | sed -e 's,vmlinuz-,linux-,g' | sed -e 's,\.,,g'`"
    if test -e "${dirname}/${kbasename4}.kver" ; then
 version="$(cat ${dirname}/${kbasename4}.kver)"
    fi
  fi

  initrd_early=
  for i in ${GRUB_EARLY_INITRD_LINUX_STOCK} \
   ${GRUB_EARLY_INITRD_LINUX_CUSTOM}; do
    if test -e "${dirname}/${i}" ; then
      initrd_early="${initrd_early} ${i}"
    fi
  done

  initrd_real=
  initramfs_manjaro="`echo "${basename}" | sed -e 's,vmlinuz,initramfs,g'`"
  for i in "initrd.img-${version}" "initrd-${version}.img" \
   "initrd-${alt_version}.img.old" "initrd-${version}.gz" \
   "initrd-${alt_version}.gz.old" "initrd-${version}" \
   "initramfs-${version}.img" "initramfs-${alt_version}.img.old" \   "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
   "initrd-${alt_version}" "initramfs-${alt_version}.img" \
   "initramfs-genkernel-${version}" \
   "initramfs-genkernel-${alt_version}" \
   "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
   "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}" \
   "${initramfs_manjaro}.img" \
   "initramfs-linux.img" ; do
    if test -e "${dirname}/${i}" ; then
      initrd_real="${i}"
      break
    fi
  done

  initrd=
  if test -n "${initrd_early}" || test -n "${initrd_real}"; then
    initrd="${initrd_early} ${initrd_real}"

    initrd_display=
    for i in ${initrd}; do
      initrd_display="${initrd_display} ${dirname}/${i}"
    done
    gettext_printf "Found initrd image: %s\n" "$(echo $initrd_display)" >&2
  fi

  config=
  for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
    if test -e "${i}" ; then
      config="${i}"
      break
    fi
  done

  initramfs=
  if test -n "${config}" ; then
      initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"`
  fi

  if test -z "${initramfs}" && test -z "${initrd_real}" ; then
    # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs.  Since there's
    # no initrd or builtin initramfs, it can't work here.
    if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \
|| [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then

linux_root_device_thisversion=${GRUB_DEVICE}
    else
linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID}
    fi
  fi

  # The GRUB_DISABLE_SUBMENU option used to be different than others since it was
  # mentioned in the documentation that has to be set to 'y' instead of 'true' to
  # enable it. This caused a lot of confusion to users that set the option to 'y',
  # 'yes' or 'true'. This was fixed but all of these values must be supported now.
  if [ "x${GRUB_DISABLE_SUBMENU}" = xyes ] || [ "x${GRUB_DISABLE_SUBMENU}" = xy ]; then
    GRUB_DISABLE_SUBMENU="true"
  fi

  if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xtrue ]; then
    linux_entry "${OS}" "${version}" simple \
    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"

    submenu_indentation="$grub_tab"
    
    if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
    fi
    # TRANSLATORS: %s is replaced with an OS name
    echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
    is_top_level=false
  fi

  linux_entry "${OS}" "${version}" advanced \
              "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"

  for i in "${initramfs_manjaro}-fallback.img" "initramfs-${version}-fallback.img" ; do
    if test -e "${dirname}/${i}" ; then
      initrd="${i}"
      gettext_printf "Found initrd fallback image: %s\n" "${dirname}/${initrd}" >&2
      linux_entry "${OS}" "${version}" fallback \
                  "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
      break
    fi
  done

  if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
    linux_entry "${OS}" "${version}" recovery \
                "${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
  fi

  list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '`
done

# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
  echo '}'
fi

echo "$title_correction_code"

I suspect you’ll have to reinstall GRUB:

What filesystem do you use ?
If btrfs:

  • did you reformat when installing ?
  • Did you clean up old subvolumes / snapshots ?

Reinstalling grub will not help :wink: because os-prober did find something remaining from the previous installs.

You have to find these, and clean up.

BTRFS, also 2 years ago on Ubuntu.

I reinstalled many times since (testing stuff) and always selected wipe disk in Calamares. To me, that means the drive is wiped. Not zeros written to every sector, but no files should exist (or subvolumes).

I can clean, but what should I clean, exactly?
Because I can’t find traces of old OSes.

1 Like

Please also have a look at:

So you did search your Filesystem :wink:
Grub does not only search your filesystem (a subvolume of your btrfs volume), but searches in all subvolumes of your btrfs volume.

Lets have a look into the list of subvolumes

sudo btrfs subvolume list /

In your case this may be a lot :wink:

Honestly, no. It contains exactly what I expect it to contain, plus lots of stuff auto-created by docker as I use docker-compose.

I did a clean install (selected wipe disk in Calamares) just a couple of months ago. btrfs subvolume list / only contained the subvolumes crated my Manjaro setup.
Now it contains the extra subvolumes I created and the ones created by Docker.

sudo btrfs subvolume list /  
ID 256 gen 216011 top level 5 path @                                      
ID 257 gen 216010 top level 5 path @home                             
ID 258 gen 215683 top level 5 path @cache                                 
ID 259 gen 216011 top level 5 path @log                                   
ID 261 gen 215670 top level 5 path @userdata                              
ID 264 gen 216011 top level 5 path @docker
ID 482 gen 215670 top level 256 path var/lib/docker/btrfs/subvolumes/b9540b9db8138cc6db6ddf282bec408607528317cf36a4cb382fd3be16a43154               
ID 483 gen 584 top level 256 path var/lib/docker/btrfs/subvolumes/24c48dd2e4a7bbd7244f9d3e9b202dac09ab97b46e5695105c2ce6ae73badf3e                  
ID 484 gen 588 top level 256 path var/lib/docker/btrfs/subvolumes/064a8615b61180b7c948e0628b54313b39c39da83615d788207bb381f5a5ca0b                  
ID 486 gen 165098 top level 256 path var/lib/docker/btrfs/subvolumes/043419c72d5bd7cbd8cd6f87837d740b63918d124d574c16c2bc992c34a39062               
ID 487 gen 215670 top level 256 path var/lib/docker/btrfs/subvolumes/b0473bd8ddaa65041dc3acec909271b29a86a8b7a3de4e7990c77c5cbb34c6c1               
ID 488 gen 592 top level 256 path var/lib/docker/btrfs/subvolumes/c2a6dcb429f25b0d771436d65721eb667c359c6ed5e086c566430206d665b470                  
ID 489 gen 593 top level 256 path var/lib/docker/btrfs/subvolumes/b7f51d35269a14b78de6a3a407a50de1a4b5eb6f98415bb66b7cf61b4e78a540                  
ID 490 gen 57876 top level 256 path var/lib/docker/btrfs/subvolumes/6dd6cd4f170a367960910d3b14af33d9a2c9c4e64ab45a70a80ac6b0f0002f14                
ID 505 gen 215670 top level 256 path var/lib/docker/btrfs/subvolumes/dd94d931fe79797cde8641d8fda336ae209d0dd37aeb25b9be4edb7c184920f8               
ID 1537 gen 215666 top level 5 path timeshift-btrfs/snapshots/2022-06-21_11-17-54/@
ID 1538 gen 203911 top level 5 path timeshift-btrfs/snapshots/2022-06-21_11-17-54/@home
ID 1539 gen 215667 top level 5 path timeshift-btrfs/snapshots/2022-06-25_14-58-35/@
ID 1540 gen 215668 top level 5 path timeshift-btrfs/snapshots/2022-06-25_14-58-35/@home
ID 1541 gen 215676 top level 5 path timeshift-btrfs/snapshots/2022-06-25_15-01-22/@
ID 1542 gen 215677 top level 5 path timeshift-btrfs/snapshots/2022-06-25_15-01-22/@home

I have omitted some of the docker-created subvols to keep it readable.

You can also use “efibootmgr” that can delete entries and much more.

Assuming there is no magic involved.

Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Found Debian GNU/Linux 10 (buster) on /dev/nvme0n1p2
Found Debian GNU/Linux 11 (bullseye) on /dev/nvme0n1p2
Found Debian GNU/Linux 10 (buster) on /dev/nvme0n1p2
Found Ubuntu 18.04.5 LTS on /dev/nvme0n1p2
Found Ubuntu 20.04.4 LTS on /dev/nvme0n1p2
Found Ubuntu 20.04.4 LTS on /dev/nvme0n1p2
Found Debian GNU/Linux 11 (bullseye) on /dev/nvme0n1p2
Found Ubuntu 20.04.4 LTS on /dev/nvme0n1p2

This is no good idea

Because without the full list it is a “guessing in the dark”


They are alle detected inside one partition (volume) /dev/nvme0n1p2
To me this seems only possible with btrfs and subvolumes :man_shrugging:

Maybe os-prober looks into your docker-subvolumes

This may irritate os-prober.

The question is, did you ever install Debian 10 and 11 on this system ?
If not ,then this is a false positive of os-prober from your docker containers

Then disable os-prober :wink:

By the way this has nothing to do with /boot/…

But you could have a look into efi-variables like suggested:

They reside in nvram / flash

Never installed debian, only Ubuntu Budgie, so indeed this must be because of Docker. I disabled os-prober in /etc/default/grub and ran sudo grub-mkconfig so that should solve it.

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.