Hi debian-boot@, Please find below a nice mail from Thierry, summarizing a number of changes that would be great to see merged into os-prober. If anyone wants to volunteer to coordinate merging those changes into Debian, to fix all the bugs©®™ for us and our downstream, that would be great! Thierry, if nobody steps up in the upcoming weeks, you're welcome to ping me back; I might try and allocate company time to it, but “when” would be the big question… Cheers, -- Cyril Brulebois (kibi@debian.org) <https://debamax.com/> D-I release manager -- Release team member -- Freelance Consultant Thierry Vignaud <thierry.vignaud@gmail.com> (2020-04-02): > Hi > There's quite some patches for os-prober that lurks in Mageia, Fedora & > SUSE packages and it looks like some patches just remain in > https://bugs.debian.org/cgi-bin/pkgreport.cgi?repeatmerged=no&src=os-prober > > So here's my attempt at getting some of them merged, which would reduce the > burden on us distro packagers: > (more chlog and/or comments may be find in them) > > os-prober-SUSE.patch: : Fix spelling of SUSE aj@suse.de > > os-prober-1.49-fix-grub2.cfg-parsing.patch: Fix several problems in parsing > of grub.cfg by linux-boot-probes/mounted/40grub2 [bnc#796919] > > 1. Look for /boot/grub2-efi/grub.cfg as well (openSUSE 12.2) > > 2. It checked for literal "(on /dev/.*)" to filter out menu entries > added by another os-prober on target system. But grub.cfg now includes > TRANSLATED strings, so this check will fail if grub.cfg was created in > non-English locale. Use menu entry ID to check whether entry was added > by os-prober (it always starts with osprober-). > > os-prober-probe-MD-devices.patch: Probe also unpartitioned Linux MD devices > (bnc#811006) > > os-prober-linux-secure-boot.patch: Detect linux secure boot entries too > (bnc#810912) > > > os-prober-btrfsfix.patch: btrfs support from Fedora (rediffed) > > os-prober-EFI-openSUSEfy.patch: Small cosmetic changes to ensure UEFI > scripts keep content > after upstream merged (slightly outdated) version of them. > - retain ELILO vendor prefix in case someone is really using it > - comment in 05efi is obviously wrong > > os-prober-accept-ESP-on-IMSM.patch: accept ESP on IMSM MD raid (bnc#818871) > > os-prober-dont-load-all-fs-module-and-dont-test-mount.patch: don't modprobe > all file system modules and don't test mount on unknown partition > (bnc#851722) > > os-prober-fix-btrfs-subvol-mounted-tests.patch: fix os-prober entries for > distro on btrfs root-fs not created (bnc#846003) > > os-prober-skip-part-on-multipath.patch: fix os-prober creates many > unusuable entries on multipath disk (bnc#875327) > > Improve-btrfs-handling-on-os-probing-for-grub2.patch: fix os-prober fails > to detect other SLES12 installation (bsc#892364) > > os-prober-btrfs-absolute-subvol.patch: fix os-prober mount error, no such > file or directory (bsc#931955) > the do_unmount has to be skipped for btrfs as it removes tmp mount point of > which btrfs is making use (bsc#1024196) > > os-prober-40grub-check-grub2.patch: also skip legacy grub if > /boot/grub2/grub.cfg is present > > os-prober-btrfs-snapshot-detection.patch: OpenSuSE patch: detect os on > default subvolume in snapshot (bsc#954225) > > os-prober-btrfs-always-detect-default.patch: os-prober update broke Linux > detection (bsc#957018) > > os-prober-linux-distro-avoid-expensive-ld-file-test.patch: y2base runs at > 100% cpu busy from beginning in installation of files to completion > (bsc#953987) > > os-prober-linux-distro-parse-os-release.patch: Leap does not recognize > Tumbleweed any more (bsc#997465) > > Improve slow os-prober (rhbz#875356) > (forward port of https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=694668) > os-prober-factor-out-logger.patch > os-prober-factored-logger-efi-fix.patch > > os-prober-umount-fix.patch: Fix separate /usr partitions for usrmove > distros (bug #1044760) > - Fix umount error when directory is temporarily busy (bug #903906) > > os-prober-grepfix.patch: Fix parsing grub2's initrd/linux variations, > rhbz#1108344 > > os-prober-gentoo-fix.patch: - Support a case where a kernel named vmlinuz/x > is used under Gentoo, bug #1223237 > > os-prober-mounted-partitions-fix.patch: Fix a bug in recent btrfs patch > when an extended partition is examined (H.J. Lu) (bug #906847) > - Fix naming of /boot partitions according to their fstab entry (bug > #893472) > - Don't generate .btrfsfix files which will be included in final rpm > - Fix wrong boot partition set by linux-boot-prober when / and /boot are > mounted (bug #906886) > - Factor out 'logger', so that it is run once and logs are piped to it > (John > Reiser) (bug #875356) > > os-prober-bootpart-name-fix.patch: Fix parsing grub2's initrd/linux > variations, rhbz #1108344 > > os-prober-no-dummy-mach-kernel.patch: Fix using grep for searching binary > files, fixes #1172405. > - Use shell string processing rather than 'basename' (#875356) > - Make it possible to disable logging debug messages by assigning a > value to > OS_PROBER_DISABLE_DEBUG environment variable (#893997). > - Detect multi btrfs pools/volumes (#888341) > > os-prober-mdraidfix.patch: Add mdraid detection fix patch > > Can you merge at least part of them in next os-prober release in order to > reduce our workload rebase on new releases and in order to share fixes with > all users? > Thanks > Index: os-prober-1.76/os-probes/common/50mounted-tests > =================================================================== > --- os-prober-1.76.orig/os-probes/common/50mounted-tests > +++ os-prober-1.76/os-probes/common/50mounted-tests > @@ -49,19 +49,13 @@ elif [ -z "$types" ]; then > debug "$1 is a LUKS partition; skipping" > exit 0 > fi > - for type in $(grep -v nodev /proc/filesystems); do > - # hfsplus filesystems are mountable as hfs. Try hfs last so > - # that we can tell the difference. > - if [ "$type" = hfs ]; then > - delaytypes="${delaytypes:+$delaytypes }$type" > - elif [ "$type" = fuseblk ]; then > - if type ntfs-3g >/dev/null 2>&1; then > - types="${types:+$types }ntfs-3g" > - fi > - else > - types="${types:+$types }$type" > - fi > - done > + > + # Simply skip such partition is better than trying to detect > + # it by blinded test mounts with all kinds of kernel file system, > + # that would lead to unwanted consequence like kernel oops and > + # risk to corrupt your system and data. > + debug "$1 is a partition without file system; skipping" > + exit 0 > fi > > tmpmnt=/var/lib/os-prober/mount > Index: os-prober-1.76/os-probes/init/common/10filesystems > =================================================================== > --- os-prober-1.76.orig/os-probes/init/common/10filesystems > +++ os-prober-1.76/os-probes/init/common/10filesystems > @@ -1,39 +1,19 @@ > #!/bin/sh > # Make sure filesystems are available. > -set +e # ignore errors from modprobe > - > -FILESYSTEMS='ext2 ext3 ext4 xfs jfs msdos vfat ntfs minix hfs hfsplus qnx4 ufs btrfs' > -# fuse is needed to make grub-mount work. > -FILESYSTEMS="$FILESYSTEMS fuse" > -# The Ubuntu kernel udebs put a number of filesystem modules in > -# fs-{core,secondary}-modules. It's fairly cheap to check for these too. > -FILESYSTEMS="$FILESYSTEMS fs-core fs-secondary" > - > -if [ ! -e /var/lib/os-prober/modules ]; then > - # Check for anna-install to make it easier to use os-prober outside > - # d-i. > - if type anna-install >/dev/null 2>&1 && [ -d /lib/debian-installer ]; then > - for fs in $FILESYSTEMS; do > - ANNA_QUIET=1 DEBIAN_FRONTEND=none \ > - log-output -t os-prober \ > - anna-install "$fs-modules" || true > - done > - depmod -a >/dev/null 2>&1 || true > - fi > - > - for fs in $FILESYSTEMS; do > - case "$fs" in > - fs-*) > - ;; > - *) > - modprobe "$fs" 2>/dev/null | logger -t os-prober > - ;; > - esac > - done > - > - # We only want to keep this state inside d-i, so this is as good a > - # check as any. > - if type anna-install >/dev/null 2>&1 && [ -d /lib/debian-installer ]; then > - touch /var/lib/os-prober/modules > - fi > -fi > +set -e > + > +# Make sure fuse is available for grub2-mount > +# As long as we use grub2-mount, we use grub2's own file system modules > +# to mount the partitiion and the operation don't require kernel support > +# other than fuse. > +if ! cat /proc/filesystems | grep nodev | cut -f2 | grep -qw fuse; then > + modprobe fuse 2>&1 | logger -t os-prober > +fi > +# Regarding file systems not supported by grub2, or systems simply don't > +# have grub2-mount, will use linux 'mount' utility. This will require > +# kernel file system module to work, but still we don't need to modprobe > +# all of them before mount, because mount() syscall will take care of it > +# by __request_module the needed kernel module and we should leave it do > +# that for us in order to have only needed modules get loaded. > +# > +# Still if you want any kernel module loaded, add them here. > Index: os-prober-1.76/os-probes/common/50mounted-tests > =================================================================== > --- os-prober-1.76.orig/os-probes/common/50mounted-tests > +++ os-prober-1.76/os-probes/common/50mounted-tests > @@ -65,10 +65,40 @@ fi > > mounted= > > +if [ "$types" = btrfs ]; then > + partition="$BTRFSDEV" > +fi > + > +if type grub2-mount >/dev/null 2>&1 && \ > + type grub2-probe >/dev/null 2>&1 && \ > + grub2-mount "$partition" "$tmpmnt" 2>/dev/null; then > + mounted=1 > + type="$(grub2-probe -d "$partition" -t fs)" || true > + if [ "$type" ]; then > + debug "mounted using GRUB $type filesystem driver" > + else > + debug "mounted using GRUB, but unknown filesystem?" > + type=fuseblk > + fi > +fi > + > +if [ "$mounted" ]; then > + for test in /usr/lib/os-probes/mounted/*; do > + debug "running subtest $test" > + if [ -f "$test" ] && [ -x "$test" ]; then > + if "$test" "$partition" "$tmpmnt" "$type"; then > + debug "os found by subtest $test" > + do_unmount > + exit 0 > + fi > + fi > + done > +fi > +do_unmount > + > # all btrfs processing here. Handle both unmounted and > # mounted subvolumes. > if [ "$types" = btrfs ]; then > - partition="$BTRFSDEV" > debug "begin btrfs processing for $UUID" > # note that the btrfs volume must not be mounted ro > if mount -t btrfs -U "$UUID" "$tmpmnt" 2>/dev/null; then > @@ -129,37 +159,8 @@ if [ "$types" = btrfs ]; then > rmdir "$tmpmnt" || true > if [ "$found" ]; then > exit 0 > - else > - exit 1 > - fi > -fi > - > -if type grub-mount >/dev/null 2>&1 && \ > - type grub-probe >/dev/null 2>&1 && \ > - grub-mount "$partition" "$tmpmnt" 2>/dev/null; then > - mounted=1 > - type="$(grub-probe -d "$partition" -t fs)" || true > - if [ "$type" ]; then > - debug "mounted using GRUB $type filesystem driver" > - else > - debug "mounted using GRUB, but unknown filesystem?" > - type=fuseblk > fi > fi > > -if [ "$mounted" ]; then > - for test in /usr/lib/os-probes/mounted/*; do > - debug "running subtest $test" > - if [ -f "$test" ] && [ -x "$test" ]; then > - if "$test" "$partition" "$tmpmnt" "$type"; then > - debug "os found by subtest $test" > - do_unmount > - exit 0 > - fi > - fi > - done > -fi > -do_unmount > - > # No tests found anything. > exit 1 > Index: os-prober-1.61/os-prober > =================================================================== > --- os-prober-1.61.orig/os-prober > +++ os-prober-1.61/os-prober > @@ -23,6 +23,28 @@ > fi > return 1 > } > +mp_disks="UNDEF" > +on_multipath () { > + type multipath >/dev/null 2>&1 || return 1 > + local parent="${1%/*}" > + local device="${parent##*/}" > + > + if [ "$mp_disks" = "UNDEF" ]; then > + mp_disks=`multipath -d -l | sed -n -e 's/^.\+[0-9]\+:[0-9]\+:[0-9]\+:[0-9]\+ \([^ ]\+\) .*/\1/p'` > + fi > + > + if [ -z "$mp_disks" ]; then > + return 1 > + fi > + > + for i in $mp_disks; do > + if [ "$device" = "$i" ]; then > + debug "$1: part of multipath disk $i" > + return 0 > + fi > + done > + return 1 > +} > > partitions () { > os_name="$(uname -s)" > @@ -31,7 +54,7 @@ partitions () { > # Serial ATA RAID disk. > for part in /sys/block/*/*[0-9]; do > if [ -f "$part/start" ] && \ > - [ ! -f "$part/whole_disk" ] && ! on_sataraid $part; then > + [ ! -f "$part/whole_disk" ] && ! on_sataraid $part && ! on_multipath $part; then > name="$(echo "${part##*/}" | sed 's,[!.],/,g')" > if [ -e "/dev/$name" ]; then > echo "/dev/$name" > From: Egbert Eich <eich@suse.de> > Date: Fri May 29 08:55:21 2015 +0200 > Subject: Improve btrfs handling on os-probing for grub2 > Patch-mainline: never > > References: bsc#892364 > Signed-off-by: Egbert Eich <eich@suse.com> > > Currently probing of a grub2 config file is broken if > the root/boot fs is btrfs. This is due to a patch picked > from Fedora which attempts to determine the location of > the kernel and probe for it. > This code has meanwhile changed on Fedora, however the > new version works no better than the old one. > It is possible that this code works under very special > circumstances of the Fedora system, however it is by no > means valid. > Our goal is to > a. determine the location of the kernel in the mounted fs > regardless whether the grub2 config specifies an absolute > or relative path to the kernel file. > b. Prepend the correct prefix if grub2_btrfs expects an > absolute path (either because the current grub2 fs isn't > btrfs or absolute path addressing is explicitely requested). > c. Attempt to handle the location of the kernel file correctly > if this lives on a separate btrfs subvolume. > (Currently this only works if the path to this subvolume is > identical to the fs path). > > Signed-off-by: Egbert Eich <eich@suse.de> > > v2: > a. Fix missing linux16/initrd16 parsing in entry result > b. Fix kernelfile path if separate boot partition on btrfs > > Signed-off-by: Michael Chang <mchang@suse.com> > --- > linux-boot-probes/mounted/common/40grub2 | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > Index: os-prober-1.61/linux-boot-probes/mounted/common/40grub2 > =================================================================== > --- os-prober-1.61.orig/linux-boot-probes/mounted/common/40grub2 > +++ os-prober-1.61/linux-boot-probes/mounted/common/40grub2 > @@ -14,9 +14,19 @@ bootsv="$6" > found_item=0 > > entry_result () { > - if [ "x$type" = "xbtrfs" -a "$rootsv" = "$bootsv" ]; then > - # trim off the leading subvol > - kernelfile=$(echo "$kernel" | cut -d '/' -f 2- | cut -d '/' -f 2-) > + if [ "x$type" = "xbtrfs" ]; then > + bsv=${bootsv:+/}${bootsv} > + # if path is not relative to subvolume make it relative > + kernel=${kernel#${bsv}} > + kernelfile=$kernel > + initrd=${initrd#${bsv}} > + if [ "x$GRUB_FS" != "xbtrfs" -o "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" != "xtrue" ]; then > + # absolute path needed: prepend subvolume if $kernel isn't empty > + kernel=${kernel:+${bsv}}${kernel} > + initrd=${initrd:+${bsv}}${initrd} > + fi > + # assumed: rootsv != bootsv if rootsv isn't ancestor of bootsv > + [ "$partition" != "$bootpart" -o "$rootsv" != "$bootsv" ] && kernelfile="/boot${kernelfile}" > else > kernelfile=$kernel > fi > @@ -81,7 +91,7 @@ parse_grub_menu () { > ignore_item=1 > fi > ;; > - linux|linuxefi) > + linux|linuxefi|linux16) > # Hack alert: sed off any (hdn,n) but > # assume the kernel is on the same > # partition. > @@ -90,14 +100,14 @@ parse_grub_menu () { > parameters="$@" > # Systems with a separate /boot will not have > # the path to the kernel in grub.cfg. > - if [ "$partition" != "$bootpart" ]; then > + if [ "$partition" != "$bootpart" -a "$type" != "btrfs" ]; then > kernel="/boot$kernel" > fi > ;; > - initrd|initrdefi) > + initrd|initrdefi|initrd16) > initrd="$(echo "$2" | sed 's/(.*)//')" > # Initrd same. > - if [ "$partition" != "$bootpart" ]; then > + if [ "$partition" != "$bootpart" -a "$type" != "btrfs" ]; then > initrd="/boot$initrd" > fi > ;; > Index: os-prober/os-probes/common/50mounted-tests > =================================================================== > --- os-prober.orig/os-probes/common/50mounted-tests > +++ os-prober/os-probes/common/50mounted-tests > @@ -72,9 +72,7 @@ mounted= > > if [ "$types" = btrfs ]; then > partition="$BTRFSDEV" > -fi > - > -if type grub2-mount >/dev/null 2>&1 && \ > +elif type grub2-mount >/dev/null 2>&1 && \ > type grub2-probe >/dev/null 2>&1 && \ > grub2-mount "$partition" "$tmpmnt" 2>/dev/null; then > mounted=1 > @@ -110,7 +108,11 @@ if [ "$mounted" ]; then > fi > done > fi > -do_unmount > + > +if [ "$types" != "btrfs" ]; then > + do_unmount > + exit 1 > +fi > > # all btrfs processing here. Handle both unmounted and > # mounted subvolumes. > @@ -125,9 +127,9 @@ if [ "$types" = btrfs ]; then > exit 1 > fi > # besides regular subvols, get ro and snapshot so thet can be excluded > - subvols=$(btrfs subvolume list "$tmpmnt" | cut -d ' ' -f 9) > - rosubvols=$(btrfs subvolume list -r "$tmpmnt" | cut -d ' ' -f 9) > - sssubvols=$(btrfs subvolume list -s "$tmpmnt" | cut -d ' ' -f 14) > + subvols=$(btrfs subvolume list -a "$tmpmnt" | cut -d ' ' -f 9 | sed -e s!^\<FS_TREE\>/!!) > + rosubvols=$(btrfs subvolume list -r -a "$tmpmnt" | cut -d ' ' -f 9 | sed -e s!^\<FS_TREE\>/!!) > + sssubvols=$(btrfs subvolume list -s -a "$tmpmnt" | cut -d ' ' -f 14 | sed -e s!^\<FS_TREE\>/!!) > if ! umount "$tmpmnt"; then > warn "failed to umount btrfs volume on $tmpmnt" > rmdir "$tmpmnt" || true > From: Andrei Borzenkov <arvidjaar@gmail.com> > Subject: Also skip legacy grub if grub2 is found > > Check for grub.cfg also in /boot/grub2, not only in /boot/grub. > Index: os-prober/linux-boot-probes/mounted/x86/40grub > =================================================================== > --- os-prober.orig/linux-boot-probes/mounted/x86/40grub > +++ os-prober/linux-boot-probes/mounted/x86/40grub > @@ -95,7 +95,9 @@ fi > > if [ "$grubconf" ] && \ > ([ ! -e "$mpoint/boot/grub/grub.cfg" ] || \ > - [ "$mpoint/boot/grub/$grubconf" -nt "$mpoint/boot/grub/grub.cfg" ]); then > + [ "$mpoint/boot/grub/$grubconf" -nt "$mpoint/boot/grub/grub.cfg" ]) && \ > + ([ ! -e "$mpoint/boot/grub2/grub.cfg" ] || \ > + [ "$mpoint/boot/grub/$grubconf" -nt "$mpoint/boot/grub2/grub.cfg" ]); then > debug "parsing $grubconf" > parse_grub_menu "$mpoint" "$partition" "$bootpart" < "$mpoint/boot/grub/$grubconf" > fi > Index: os-prober/os-probes/common/50mounted-tests > =================================================================== > --- os-prober.orig/os-probes/common/50mounted-tests > +++ os-prober/os-probes/common/50mounted-tests > @@ -115,6 +115,7 @@ if [ "$types" = btrfs ]; then > subvols=$(btrfs subvolume list -a "$tmpmnt" | cut -d ' ' -f 9 | sed -e s!^\<FS_TREE\>/!!) > rosubvols=$(btrfs subvolume list -r -a "$tmpmnt" | cut -d ' ' -f 9 | sed -e s!^\<FS_TREE\>/!!) > sssubvols=$(btrfs subvolume list -s -a "$tmpmnt" | cut -d ' ' -f 14 | sed -e s!^\<FS_TREE\>/!!) > + defaultvol=$(btrfs subvolume get-default "$tmpmnt" | cut -d ' ' -f 9) > if ! umount "$tmpmnt"; then > warn "failed to umount btrfs volume on $tmpmnt" > rmdir "$tmpmnt" || true > @@ -127,11 +128,13 @@ if [ "$types" = btrfs ]; then > found= > for subvol in $subvols; do > debug "begin btrfs processing for $UUID subvol=$subvol" > - if echo "$rosubvols" | grep -q -x "$subvol"; then > - continue > - fi > - if echo "$sssubvols" | grep -q -x "$subvol"; then > - continue > + if [ "$subvol" != "$defaultvol" ]; then > + if echo "$rosubvols" | grep -q -x "$subvol"; then > + continue > + fi > + if echo "$sssubvols" | grep -q -x "$subvol"; then > + continue > + fi > fi > mounted= > mpoint="$(grep btrfs /proc/self/mountinfo | grep "$partition " | grep "/$subvol " | cut -d ' ' -f 5)" > Index: os-prober/linux-boot-prober > =================================================================== > --- os-prober.orig/linux-boot-prober > +++ os-prober/linux-boot-prober > @@ -67,7 +67,12 @@ if [ "$type" = btrfs ]; then > fi > if [ -z "$mpoint" ]; then > # mount the btrfs root > - if ! mount -o subvol=$subvol -t btrfs -U $UUID "$tmpmnt" 2>/dev/null; then > + > + if [ -n "$subvol" ]; then > + opts="-o subvol=$subvol" > + fi > + > + if ! mount $opts -t btrfs -U $UUID "$tmpmnt" 2>/dev/null; then > warn "error mounting btrfs subvol=$subvol UUID=$UUID" > umount "$tmpmnt/boot" 2>/dev/null > umount "$tmpmnt" 2>/dev/null > Index: os-prober/os-probes/common/50mounted-tests > =================================================================== > --- os-prober.orig/os-probes/common/50mounted-tests > +++ os-prober/os-probes/common/50mounted-tests > @@ -114,6 +114,47 @@ if [ "$types" != "btrfs" ]; then > exit 1 > fi > > +probe_subvol () > +{ > + local subvol=$1 > + local partition=$2 > + local UUID=$3 > + local tmpmnt=$4 > + > + mounted= > + mpoint="$(grep btrfs /proc/self/mountinfo | grep "$partition " | grep "/$subvol " | cut -d ' ' -f 5)" > + ret=1 > + > + if [ -n "$subvol" ]; then > + opts="-o subvol=$subvol" > + fi > + > + if [ -n "$mpoint" ]; then > + if [ "x$mpoint" = "x/" ]; then > + continue # this is the root for the running system > + fi > + mounted=1 > + else > + # again, do not mount btrfs ro > + mount -t btrfs $opts -U "$UUID" "$tmpmnt" > + mpoint="$tmpmnt" > + fi > + test="/usr/lib/os-probes/mounted/90linux-distro" > + if [ -f "$test" ] && [ -x "$test" ]; then > + debug "running subtest $test" > + if "$test" "$partition" "$mpoint" btrfs "UUID=$UUID" "subvol=$subvol"; then > + debug "os found by subtest $test on subvol $subvol" > + ret=0 > + fi > + fi > + if [ -z "$mounted" ]; then > + if ! umount "$tmpmnt"; then > + warn "failed to umount $tmpmnt" > + fi > + fi > + return $ret > +} > + > # all btrfs processing here. Handle both unmounted and > # mounted subvolumes. > if [ "$types" = btrfs ]; then > @@ -136,45 +177,23 @@ if [ "$types" = btrfs ]; then > rmdir "$tmpmnt" || true > exit 1 > fi > - if [ -z "$subvols" ]; then > - debug "no subvols found on btrfs volume $UUID" > - exit 1 > - fi > + > found= > - for subvol in $subvols; do > - debug "begin btrfs processing for $UUID subvol=$subvol" > - if [ "$subvol" != "$defaultvol" ]; then > - if echo "$rosubvols" | grep -q -x "$subvol"; then > - continue > - fi > - if echo "$sssubvols" | grep -q -x "$subvol"; then > - continue > - fi > - fi > - mounted= > - mpoint="$(grep btrfs /proc/self/mountinfo | grep "$partition " | grep "/$subvol " | cut -d ' ' -f 5)" > - if [ -n "$mpoint" ]; then > - if [ "x$mpoint" = "x/" ]; then > - continue # this is the root for the running system > - fi > - mounted=1 > - else > - # again, do not mount btrfs ro > - mount -t btrfs -o subvol="$subvol" -U "$UUID" "$tmpmnt" > - mpoint="$tmpmnt" > - fi > - test="/usr/lib/os-probes/mounted/90linux-distro" > - if [ -f "$test" ] && [ -x "$test" ]; then > - debug "running subtest $test" > - if "$test" "$partition" "$mpoint" btrfs "UUID=$UUID" "subvol=$subvol"; then > - debug "os found by subtest $test on subvol $subvol" > - found=1 > - fi > + # Always probe subvol or root set as default > + if probe_subvol "$defaultvol" "$partition" "$UUID" "$tmpmnt"; then > + found=1 > + fi > + > + # Probe any other OS on subvol > + for subvol in $subvols; do > + if echo "$rosubvols" | grep -q -x "$subvol" || > + echo "$sssubvols" | grep -q -x "$subvol" || > + echo "$defaultvol" | grep -q -x "$subvol"; then > + continue > fi > - if [ -z "$mounted" ]; then > - if ! umount "$tmpmnt"; then > - warn "failed to umount $tmpmnt" > - fi > + debug "begin btrfs processing for $UUID subvol=$subvol" > + if probe_subvol "$subvol" "$partition" "$UUID" "$tmpmnt"; then > + found=1 > fi > done > rmdir "$tmpmnt" || true > Index: os-prober/os-probes/mounted/common/90linux-distro > =================================================================== > --- os-prober.orig/os-probes/mounted/common/90linux-distro > +++ os-prober/os-probes/mounted/common/90linux-distro > @@ -10,147 +10,133 @@ type="$3" > uuid="$4" > subvol="$5" > > -# This test is inaccurate, but given separate / and /boot partitions and the > -# fact that only some architectures have ld-linux.so, I can't see anything > -# better. Make sure this test has a high number so that more accurate tests > -# can come first. > -# Unless volumes to checked are already mounted, they will be mounted using > -# GRUB's own filesystems through FUSE. Since these ATM doesn't support > -# symlinks we need to also check in $dir/usr/lib* for distributions that > -# moved /lib* to /usr and only left symlinks behind. > -# TODO: look for ld-linux.so on arches that have it > -if (ls "$dir"/lib*/ld*.so* && [ -d "$dir/boot" ] || ls "$dir"/usr/lib*/ld*.so*) >/dev/null 2>/dev/null; then > - if [ -e "$dir/etc/os-release" ]; then > - short="$(grep ^NAME= "$dir/etc/os-release" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g; s/[[:space:]].*//')" > - long="$(grep ^PRETTY_NAME= "$dir/etc/os-release" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g')" > - elif [ -e "$dir/etc/debian_version" ]; then > - short="Debian" > - long="$(printf "Debian GNU/Linux (%s)\n" "$(cat "$dir/etc/debian_version")")" > - # RPM derived distributions may also have a redhat-release or > - # mandrake-release, so check their files first. > - elif [ -e "$dir/etc/altlinux-release" ]; then > - short="ALTLinux" > - long="$(cat "$dir/etc/altlinux-release")" > - elif [ -e "$dir/etc/magic-release" ]; then > - short="Magic" > - long="$(cat "$dir/etc/magic-release")" > - elif [ -e "$dir/etc/blackPanther-release" ]; then > - short="blackPanther" > - long="$(cat "$dir/etc/blackPanther-release")" > - elif [ -e "$dir/etc/ark-release" ]; then > - short="Ark" > - long="$(cat "$dir/etc/ark-release")" > - elif [ -e "$dir/etc/arch-release" ]; then > - short="Arch" > - long="$(cat "$dir/etc/arch-release")" > - elif [ -e "$dir/etc/asplinux-release" ]; then > - short="ASPLinux" > - long="$(cat "$dir/etc/asplinux-release")" > - elif [ -e "$dir/etc/lvr-release" ]; then > - short="LvR" > - long="$(cat "$dir/etc/lvr-release")" > - elif [ -e "$dir/etc/caos-release" ]; then > - short="cAos" > - long="$(cat "$dir/etc/caos-release")" > - elif [ -e "$dir/etc/aurox-release" ]; then > - short="Aurox" > - long="$(cat "$dir/etc/aurox-release")" > - elif [ -e "$dir/etc/engarde-release" ]; then > - short="EnGarde" > - long="$(cat "$dir/etc/engarde-release")" > - elif [ -e "$dir/etc/vine-release" ]; then > - short="Vine" > - long="$(cat "$dir/etc/vine-release")" > - elif [ -e "$dir/etc/whitebox-release" ]; then > - short="WhiteBox" > - long="$(cat "$dir/etc/whitebox-release")" > - elif [ -e "$dir/etc/pld-release" ]; then > - short="PLD" > - long="$(cat "$dir/etc/pld-release")" > - elif [ -e "$dir/etc/startcom-release" ]; then > - short="StartCom" > - long="$(cat "$dir/etc/startcom-release")" > - elif [ -e "$dir/etc/trustix-release" ]; then > - short="Trustix" > - long="$(cat "$dir/etc/trustix-release")" > - elif [ -e "$dir/etc/openna-release" ]; then > - short="OpenNA" > - long="$(cat "$dir/etc/openna-release")" > - elif [ -e "$dir/etc/mageia-release" ]; then > - short="Mageia" > - long="$(cat "$dir/etc/mageia-release")" > - elif [ -e "$dir/etc/conectiva-release" ]; then > - short="Conectiva" > - long="$(cat "$dir/etc/conectiva-release")" > - elif [ -e "$dir/etc/mandrake-release" ]; then > - short="Mandrake" > - long="$(cat "$dir/etc/mandrake-release")" > - elif [ -e "$dir/etc/fedora-release" ]; then > - short="Fedora" > - long="$(cat "$dir/etc/fedora-release")" > - elif [ -e "$dir/etc/redhat-release" ]; then > - short="RedHat" > - long="$(cat "$dir/etc/redhat-release")" > - elif [ -e "$dir/etc/SuSE-release" ]; then > - short="SUSE" > - long="$(head -n 1 "$dir/etc/SuSE-release")" > - elif [ -e "$dir/etc/gentoo-release" ]; then > - short="Gentoo" > - long="$(cat "$dir/etc/gentoo-release")" > - elif [ -e "$dir/etc/cobalt-release" ]; then > - short="Cobalt" > - long="$(cat "$dir/etc/cobalt-release")" > - elif [ -e "$dir/etc/yellowdog-release" ]; then > - short="YellowDog" > - long="$(cat "$dir/etc/yellowdog-release")" > - elif [ -e "$dir/etc/turbolinux-release" ]; then > - short="Turbolinux" > - long="$(cat "$dir/etc/turbolinux-release")" > - elif [ -e "$dir/etc/pardus-release" ]; then > - short="Pardus" > - long="$(cat "$dir/etc/pardus-release")" > - elif [ -e "$dir/etc/kanotix-version" ]; then > - short="Kanotix" > - long="$(cat "$dir/etc/kanotix-version")" > - elif [ -e "$dir/etc/slackware-version" ]; then > - short="Slackware" > - long="$(printf "Slackware Linux (%s)\n" "$(cat "$dir/etc/slackware-version")")" > - elif [ -e "$dir/sbin/pkgtool" ]; then > - short="Slackware" > - long="Slackware Linux" > - elif grep -qs OpenLinux "$dir/etc/issue"; then > - short="Caldera" > - long="Caldera OpenLinux" > - elif [ -e "$dir/etc/frugalware-release" ]; then > - short="Frugalware Linux" > - long="$(cat "$dir/etc/frugalware-release")" > - elif [ -e "$dir/etc/kdemar-release" ]; then > - short="K-DEMar" > - long="$(printf "K-DEMar GNU/Linux (%s)\n" "$(cat "$dir/etc/kdemar-release")")" > - elif [ -e "$dir/etc/lfs-release" ]; then > - short="LFS" > - long="$(printf "Linux From Scratch (%s)\n" "$(cat "$dir/etc/lfs-release")")" > - elif [ -e "$dir/etc/meego-release" ]; then > - short="MeeGo" > - long="$(head -1 "$dir/etc/meego-release")" > - elif [ -e "$dir/etc/4MLinux-version" ]; then > - short="4MLinux" > - long="4MLinux $(head -1 "$dir/etc/4MLinux-version")" > - elif [ -e "$dir/etc/devuan_version" ]; then > - short="Devuan" > - long="$(printf "Devuan GNU/Linux (%s)\n" "$(cat "$dir/etc/devuan_version")")" > - else > - short="Linux" > - long="unknown Linux distribution" > - fi > - > - label="$(count_next_label "$short")" > - if [ "x$type" = "xbtrfs" -a "x$uuid" != "x" -a "x$subvol" != "x" ]; then > - result "$partition:$long:$label:linux:$type:$uuid:$subvol" > - else > - result "$partition:$long:$label:linux" > - fi > - exit 0 > +if [ -e "$dir/etc/os-release" ]; then > + short="$(grep ^NAME= "$dir/etc/os-release" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g; s/[[:space:]].*//')" > + long="$(grep ^PRETTY_NAME= "$dir/etc/os-release" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g')" > +elif [ -e "$dir/etc/debian_version" ]; then > + short="Debian" > + long="$(printf "Debian GNU/Linux (%s)\n" "$(cat "$dir/etc/debian_version")")" > +# RPM derived distributions may also have a redhat-release or > +# mandrake-release, so check their files first. > +elif [ -e "$dir/etc/altlinux-release" ]; then > + short="ALTLinux" > + long="$(cat "$dir/etc/altlinux-release")" > +elif [ -e "$dir/etc/magic-release" ]; then > + short="Magic" > + long="$(cat "$dir/etc/magic-release")" > +elif [ -e "$dir/etc/blackPanther-release" ]; then > + short="blackPanther" > + long="$(cat "$dir/etc/blackPanther-release")" > +elif [ -e "$dir/etc/ark-release" ]; then > + short="Ark" > + long="$(cat "$dir/etc/ark-release")" > +elif [ -e "$dir/etc/arch-release" ]; then > + short="Arch" > + long="$(cat "$dir/etc/arch-release")" > +elif [ -e "$dir/etc/asplinux-release" ]; then > + short="ASPLinux" > + long="$(cat "$dir/etc/asplinux-release")" > +elif [ -e "$dir/etc/lvr-release" ]; then > + short="LvR" > + long="$(cat "$dir/etc/lvr-release")" > +elif [ -e "$dir/etc/caos-release" ]; then > + short="cAos" > + long="$(cat "$dir/etc/caos-release")" > +elif [ -e "$dir/etc/aurox-release" ]; then > + short="Aurox" > + long="$(cat "$dir/etc/aurox-release")" > +elif [ -e "$dir/etc/engarde-release" ]; then > + short="EnGarde" > + long="$(cat "$dir/etc/engarde-release")" > +elif [ -e "$dir/etc/vine-release" ]; then > + short="Vine" > + long="$(cat "$dir/etc/vine-release")" > +elif [ -e "$dir/etc/whitebox-release" ]; then > + short="WhiteBox" > + long="$(cat "$dir/etc/whitebox-release")" > +elif [ -e "$dir/etc/pld-release" ]; then > + short="PLD" > + long="$(cat "$dir/etc/pld-release")" > +elif [ -e "$dir/etc/startcom-release" ]; then > + short="StartCom" > + long="$(cat "$dir/etc/startcom-release")" > +elif [ -e "$dir/etc/trustix-release" ]; then > + short="Trustix" > + long="$(cat "$dir/etc/trustix-release")" > +elif [ -e "$dir/etc/openna-release" ]; then > + short="OpenNA" > + long="$(cat "$dir/etc/openna-release")" > +elif [ -e "$dir/etc/mageia-release" ]; then > + short="Mageia" > + long="$(cat "$dir/etc/mageia-release")" > +elif [ -e "$dir/etc/conectiva-release" ]; then > + short="Conectiva" > + long="$(cat "$dir/etc/conectiva-release")" > +elif [ -e "$dir/etc/mandrake-release" ]; then > + short="Mandrake" > + long="$(cat "$dir/etc/mandrake-release")" > +elif [ -e "$dir/etc/fedora-release" ]; then > + short="Fedora" > + long="$(cat "$dir/etc/fedora-release")" > +elif [ -e "$dir/etc/redhat-release" ]; then > + short="RedHat" > + long="$(cat "$dir/etc/redhat-release")" > +elif [ -e "$dir/etc/SuSE-release" ]; then > + short="SUSE" > + long="$(head -n 1 "$dir/etc/SuSE-release")" > +elif [ -e "$dir/etc/gentoo-release" ]; then > + short="Gentoo" > + long="$(cat "$dir/etc/gentoo-release")" > +elif [ -e "$dir/etc/cobalt-release" ]; then > + short="Cobalt" > + long="$(cat "$dir/etc/cobalt-release")" > +elif [ -e "$dir/etc/yellowdog-release" ]; then > + short="YellowDog" > + long="$(cat "$dir/etc/yellowdog-release")" > +elif [ -e "$dir/etc/turbolinux-release" ]; then > + short="Turbolinux" > + long="$(cat "$dir/etc/turbolinux-release")" > +elif [ -e "$dir/etc/pardus-release" ]; then > + short="Pardus" > + long="$(cat "$dir/etc/pardus-release")" > +elif [ -e "$dir/etc/kanotix-version" ]; then > + short="Kanotix" > + long="$(cat "$dir/etc/kanotix-version")" > +elif [ -e "$dir/etc/slackware-version" ]; then > + short="Slackware" > + long="$(printf "Slackware Linux (%s)\n" "$(cat "$dir/etc/slackware-version")")" > +elif [ -e "$dir/sbin/pkgtool" ]; then > + short="Slackware" > + long="Slackware Linux" > +elif grep -qs OpenLinux "$dir/etc/issue"; then > + short="Caldera" > + long="Caldera OpenLinux" > +elif [ -e "$dir/etc/frugalware-release" ]; then > + short="Frugalware Linux" > + long="$(cat "$dir/etc/frugalware-release")" > +elif [ -e "$dir/etc/kdemar-release" ]; then > + short="K-DEMar" > + long="$(printf "K-DEMar GNU/Linux (%s)\n" "$(cat "$dir/etc/kdemar-release")")" > +elif [ -e "$dir/etc/lfs-release" ]; then > + short="LFS" > + long="$(printf "Linux From Scratch (%s)\n" "$(cat "$dir/etc/lfs-release")")" > +elif [ -e "$dir/etc/meego-release" ]; then > + short="MeeGo" > + long="$(head -1 "$dir/etc/meego-release")" > +elif [ -e "$dir/etc/4MLinux-version" ]; then > + short="4MLinux" > + long="4MLinux $(head -1 "$dir/etc/4MLinux-version")" > +elif [ -e "$dir/etc/devuan_version" ]; then > + short="Devuan" > + long="$(printf "Devuan GNU/Linux (%s)\n" "$(cat "$dir/etc/devuan_version")")" > else > exit 1 > fi > + > +label="$(count_next_label "$short")" > +if [ "x$type" = "xbtrfs" -a "x$uuid" != "x" -a "x$subvol" != "x" ]; then > + result "$partition:$long:$label:linux:$type:$uuid:$subvol" > +else > + result "$partition:$long:$label:linux" > +fi > +exit 0 > Index: os-prober/os-prober > =================================================================== > --- os-prober.orig/os-prober > +++ os-prober/os-prober > @@ -186,6 +186,11 @@ for partition in $(partitions); do > # be handled by 50mounted-tests so we can do a subvol only once. > type=$(blkid -o value -s TYPE $mapped || true) > if [ "$type" = btrfs ]; then > + mpoint=$(grep "^$mapped " "$OS_PROBER_TMP/mounted-map" | head -n1 | cut -d " " -f 2) > + mpoint="$(unescape_mount "$mpoint")" > + if [ "$mpoint" = "/target/boot" ] || [ "$mpoint" = "/target" ] || [ "$mpoint" = "/" ]; then > + continue > + fi > uuid=$(blkid -o value -s UUID $mapped) > if grep -q "^$uuid" "$OS_PROBER_TMP/btrfs-vols" ; then > continue > Index: os-prober/os-probes/mounted/common/90linux-distro > =================================================================== > --- os-prober.orig/os-probes/mounted/common/90linux-distro > +++ os-prober/os-probes/mounted/common/90linux-distro > @@ -10,7 +10,18 @@ type="$3" > uuid="$4" > subvol="$5" > > -if [ -e "$dir/etc/os-release" ]; then > +if [ -L "$dir/etc/os-release" ]; then > + RELPATH=$(readlink -f "$dir/etc/os-release") > + if readlink "$dir/etc/os-release" | grep -q '^/'; then > + RELPATH="$dir$RELPATH" > + fi > + if [ -f "$RELPATH" ]; then > + short="$(grep ^NAME= "$RELPATH" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g; s/[[:space:]].*//')" > + long="$(grep ^PRETTY_NAME= "$RELPATH" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g')" > + else > + exit 1 > + fi > +elif [ -e "$dir/etc/os-release" ]; then > short="$(grep ^NAME= "$dir/etc/os-release" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g; s/[[:space:]].*//')" > long="$(grep ^PRETTY_NAME= "$dir/etc/os-release" | sed 's/^[^=]*=//; s/^['\''"]\(.*\)['\''"]$/\1/; s/\\\(.\)/\1/g')" > elif [ -e "$dir/etc/debian_version" ]; then > Index: os-prober/os-probes/mounted/x86/05efi > =================================================================== > --- os-prober.orig/os-probes/mounted/x86/05efi > +++ os-prober/os-probes/mounted/x86/05efi > @@ -59,7 +59,11 @@ ret=1 > for test in /usr/lib/os-probes/mounted/efi/*; do > debug "running subtest $test" > if [ -f "$test" ] && [ -x "$test" ]; then > + # we need results of subtest in stdout > + orig_fd_res=$fd_result > + export fd_result=1 > entry=$("$test" "$mpoint/$efi") > + export fd_result=$orig_fd_res > if [ -n "$entry" ]; then > debug "bootloader $entry found by subtest $test" > ret=0 > Index: os-prober/common.sh > =================================================================== > --- os-prober.orig/common.sh > +++ os-prober/common.sh > @@ -62,10 +62,14 @@ cache_progname() { > esac > } > > -log() { > - cache_progname > - logger -t "$progname" "$@" > -} > +# fd_logger: bind value now, possibly after assigning default. > +eval ' > + log() { > + cache_progname > + echo "$progname: $@" 1>&'${fd_logger:=9}' > + } > +' > +export fd_logger # so subshells inherit current value by default > > error() { > log "error: $@" > @@ -81,10 +85,14 @@ debug() { > fi > } > > -result () { > - log "result:" "$@" > - echo "$@" > -} > +# fd_result: bind value now, possibly after assigning default. > +eval ' > + result() { > + log "result:" "$@" > + echo "$@" 1>&'${fd_result:=1}' > + } > +' > +export fd_result # so subshells inherit current value by default > > # shim to make it easier to use os-prober outside d-i > if ! type mapdevfs >/dev/null 2>&1; then > Index: os-prober/linux-boot-prober > =================================================================== > --- os-prober.orig/linux-boot-prober > +++ os-prober/linux-boot-prober > @@ -1,4 +1,12 @@ > #!/bin/sh > + > +# dash shell does not have "{varname}>&1" feature that bash shell has > +# for auto-assignment of new filedescriptors. > +# It is cumbersome to write the 'eval' to use our own variables in redirections. > +# Therefore use fixed numbers. > +export fd_result=3 # file descriptor for external results > +export fd_logger=9 # file descriptor for input to logger > + > . /usr/share/os-prober/common.sh > > set -e > @@ -19,6 +27,7 @@ bootuuid= > > grep "^/dev/" /proc/mounts | parse_proc_mounts >"$OS_PROBER_TMP/mounted-map" || true > > +( ( > if [ -z "$1" ]; then > ERR=y > elif [ "$1" = btrfs -a -z "$2" ]; then > @@ -186,3 +195,5 @@ else > fi > fi > fi > +) 9>&1 | logger 1>&- # fd_logger > +) 3>&1 # fd_result > Index: os-prober/os-prober > =================================================================== > --- os-prober.orig/os-prober > +++ os-prober/os-prober > @@ -1,7 +1,14 @@ > #!/bin/sh > set -e > > -. /usr/share/os-prober/common.sh > +# dash shell does not have "{varname}>&1" feature that bash shell has > +# for auto-assignment of new filedescriptors. > +# It is cumbersome to write the 'eval' to use our own variables in redirections. > +# Therefore use fixed numbers. > +export fd_result=3 # file descriptor for external results > +export fd_logger=9 # file descriptor for input to logger > + > + . /usr/share/os-prober/common.sh > > newns "$@" > require_tmpdir > @@ -136,6 +143,7 @@ fi > > : >"$OS_PROBER_TMP/btrfs-vols" > > +( ( > for partition in $(partitions); do > if ! mapped="$(mapdevfs "$partition")"; then > log "Device '$partition' does not exist; skipping" > @@ -200,3 +208,5 @@ for partition in $(partitions); do > fi > fi > done > +) 9>&1 | logger 1>&- # fd_logger > +) 3>&1 # fd_result > Index: os-prober/common.sh > =================================================================== > --- os-prober.orig/common.sh > +++ os-prober/common.sh > @@ -336,3 +336,13 @@ linux_mount_boot () { > > mountboot="$bootpart $mounted" > } > + > +umount_exec=$(which umount) > +umount() { > + if ! $umount_exec $@ 2> /dev/null; then > + error "umount error, retrying after 1 sec" > + sleep 1 > + $umount_exec $@ > + fi > +} > + > Index: os-prober/os-probes/mounted/x86/83haiku > =================================================================== > --- os-prober.orig/os-probes/mounted/x86/83haiku > +++ os-prober/os-probes/mounted/x86/83haiku > @@ -13,7 +13,7 @@ case "$type" in > *) debug "$partition is not a BeFS partition: exiting"; exit 1 ;; > esac > > -if head -c 512 "$partition" | grep -qs "system.haiku_loader"; then > +if head -c 512 "$partition" | grep -aqs "system.haiku_loader"; then > debug "Stage 1 bootloader found" > else > debug "Stage 1 bootloader not found: exiting" > Index: os-prober/linux-boot-probes/mounted/common/90fallback > =================================================================== > --- os-prober.orig/linux-boot-probes/mounted/common/90fallback > +++ os-prober/linux-boot-probes/mounted/common/90fallback > @@ -33,7 +33,7 @@ for kernpat in /vmlinuz /vmlinux /boot/v > # Dracut initramfses are named differently again. > initrdname3=$(echo "$kernfile" | sed "s/vmlinu[zx]/initramfs\*/" | sed 's/$/.img/') > # And Gentoo's also > - initrdname4=$(echo "$kernfile" | sed "s/kernel/initramfs\*/") > + initrdname4=$(echo "$kernfile" | sed "s/kernel\|vmlinu[zx]/initramfs\*/") > foundinitrd=0 > for initrd in $(eval ls "$initrdname" "$initrdname1" "$initrdname2" "$initrdname3" "$initrdname4" 2>/dev/null); do > if [ "$initrd" != "$kernfile" ] && [ -f "$initrd" ] && [ ! -L "$initrd" ]; then > Index: os-prober/common.sh > =================================================================== > --- os-prober.orig/common.sh > +++ os-prober/common.sh > @@ -146,7 +146,7 @@ parse_proc_mounts () { > set -f > set -- $line > set +f > - printf '%s %s %s\n' "$(mapdevfs "$1")" "$2" "$3" > + printf '%s %s %s %s\n' "$(mapdevfs "$1")" "$2" "$3" "$1" > done > } > > Index: os-prober/linux-boot-prober > =================================================================== > --- os-prober.orig/linux-boot-prober > +++ os-prober/linux-boot-prober > @@ -167,7 +167,7 @@ else > bootpart="${mountboot%% *}" > bootmounted="${mountboot#* }" > else > - bootpart="$partition" > + bootpart="$(grep " $mpoint/boot " "$OS_PROBER_TMP/mounted-map" | head -n1 | cut -d " " -f 4)" > bootmounted=0 > fi > for test in /usr/lib/linux-boot-probes/mounted/*; do > Index: os-prober/common.sh > =================================================================== > --- os-prober.orig/common.sh > +++ os-prober/common.sh > @@ -269,7 +269,7 @@ linux_mount_boot () { > if [ "$bindfrom" != "$tmpmnt/boot" ]; then > if mount --bind "$bindfrom" "$tmpmnt/boot"; then > mounted=1 > - bootpart="$1" > + bootpart="$tmppart" > else > debug "failed to bind-mount $bindfrom onto $tmpmnt/boot" > fi > @@ -277,6 +277,15 @@ linux_mount_boot () { > fi > if [ "$mounted" ]; then > : > + elif [ -e "$tmppart" ]; then > + bootpart="$tmppart" > + boottomnt="$tmppart" > + elif [ -e "$tmpmnt/$tmppart" ]; then > + bootpart="$tmppart" > + boottomnt="$tmpmnt/$tmppart" > + elif [ -e "/target/$tmppart" ]; then > + bootpart="$tmppart" > + boottomnt="/target/$tmppart" > elif [ -e "$1" ]; then > bootpart="$1" > boottomnt="$1" > Index: os-prober-1.58/linux-boot-probes/mounted/common/40grub2 > =================================================================== > --- os-prober-1.58.orig/linux-boot-probes/mounted/common/40grub2 > +++ os-prober-1.58/linux-boot-probes/mounted/common/40grub2 > @@ -77,7 +77,7 @@ parse_grub_menu () { > ignore_item=1 > fi > ;; > - linux) > + linux*) > # Hack alert: sed off any (hdn,n) but > # assume the kernel is on the same > # partition. > @@ -90,7 +90,7 @@ parse_grub_menu () { > kernel="/boot$kernel" > fi > ;; > - initrd) > + initrd*) > initrd="$(echo "$2" | sed 's/(.*)//')" > # Initrd same. > if [ "$partition" != "$bootpart" ]; then > From f71f7eb5c492720c24033901ef8c6c420e188ff2 Mon Sep 17 00:00:00 2001 > From: Peter Jones <pjones@redhat.com> > Date: Thu, 10 May 2012 14:47:35 -0400 > Subject: [PATCH] Don't count our dummy mach_kernel as real MacOS X. > > --- > os-probes/mounted/powerpc/20macosx | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/os-probes/mounted/powerpc/20macosx > =================================================================== > --- a/os-probes/mounted/powerpc/20macosx > +++ b/os-probes/mounted/powerpc/20macosx > @@ -21,7 +21,7 @@ esac > # but I don't think it exists on Mac OS <= 9, and it's XML so parsing in > # shell will be nasty. > > -if [ -e "$2/mach_kernel" ]; then > +if [ -e "$2/mach_kernel" ] && ! dd if="$2/mach_kernel" count=1 bs=5 2>/dev/null | grep -aq Dummy ; then > label="$(count_next_label MacOSX)" > result "$1:Mac OS X:$label:macosx" > exit 0 > Index: os-prober/os-prober > =================================================================== > --- os-prober.orig/os-prober > +++ os-prober/os-prober > @@ -64,6 +64,11 @@ partitions () { > exit 0 > fi > > + # Add MD RAID devices > + if [ -f /proc/mdstat ] ; then > + awk '/^md/ {printf "/dev/"$1"\n"}' /proc/mdstat > + fi > + > # Also detect OSes on LVM volumes (assumes LVM is active) > if type lvs >/dev/null 2>&1; then > echo "$(LVM_SUPPRESS_FD_WARNINGS=1 log_output lvs --noheadings --separator : -o vg_name,lv_name | > @@ -123,7 +128,7 @@ if [ -f /proc/swaps ]; then > fi > : >"$OS_PROBER_TMP/raided-map" > if [ -f /proc/mdstat ] ; then > - grep "^md" /proc/mdstat | parse_proc_mdstat >"$OS_PROBER_TMP/raided-map" || true > + grep "^md" /proc/mdstat | cut -d: -f2- | parse_proc_mdstat >"$OS_PROBER_TMP/raided-map" || true > fi > > for partition in $(partitions); do
Attachment:
signature.asc
Description: PGP signature