Current File : //proc/self/root/usr/local/jetapps/usr/share/rear/prep/USB/Linux-i386/340_find_mbr_bin.sh
# The file mbr.bin is only added since syslinux 3.08
# The extlinux -i option is only added since syslinux 3.20

# Find out what the actual USB disk partition table type is
# of the USB disk that is the parent device of the USB data partition
# that is the value of the USB_DEVICE variable.
# For example
#   BACKUP_URL=usb:///dev/disk/by-label/REAR-000
# leads to
#   USB_DEVICE=/dev/disk/by-label/REAR-000
# which is a symbolic link e.g. to /dev/sdb3 (on a hybrid UEFI and BIOS dual boot USB disk)
# so its parent device /dev/sdb is where we need to inspect the partition table type.
# See the code of the write_protection_ids() function in lib/write-protect-functions.sh
# how to get the parent device.
# See the output of
#   # find usr/sbin/rear usr/share/rear -type f | xargs grep 'Partition Table'
# for code how to autodetect the partition table type via 'parted ... print'.
# In summary it goes like this example:
#   # USB_DEVICE=/dev/disk/by-label/REAR-000
#   # usb_disk="$( lsblk -inpo PKNAME "$USB_DEVICE" 2>/dev/null | awk NF | head -n1 )"
#   # echo $usb_disk
#   /dev/sdb
#   # usb_disk_label=$( parted -s $usb_disk print | grep -E "Partition Table|Disk label" | cut -d ":" -f "2" | tr -d " " )
#   # echo $usb_disk_label
#   gpt
# see https://github.com/rear/rear/pull/2829/files#r906006257

local usb_disk usb_disk_label mbr_image_file

usb_disk="$( lsblk -inpo PKNAME "$USB_DEVICE" 2>/dev/null | awk NF | head -n1 )"
# Older Linux distributions do not contain lsblk (e.g. SLES10)
# and older lsblk versions do not support the output column PKNAME
# e.g. lsblk in util-linux 2.19.1 in SLES11 supports NAME and KNAME but not PKNAME
# see the code of the write_protection_ids() function in lib/write-protect-functions.sh
# so we use USB_DEVICE_PARTED_LABEL as fallback when the 'lsblk' automatism does not work
# and also when 'parted' does not show "msdos" or "gpt":
if test -b "$usb_disk" ; then
    usb_disk_label=$( parted -s $usb_disk print | grep -E "Partition Table|Disk label" | cut -d ":" -f "2" | tr -d " " )
    if test "$usb_disk_label" = "msdos" || test "$usb_disk_label" = "gpt" ; then
        # Tell the user when his specified USB_DEVICE_PARTED_LABEL does not match the actual USB disk partition type:
        if test "$USB_DEVICE_PARTED_LABEL" && test "$usb_disk_label" != "$USB_DEVICE_PARTED_LABEL" ; then
            LogPrintError "Overwriting USB_DEVICE_PARTED_LABEL with '$usb_disk_label' to match USB disk partition type"
        fi
        USB_DEVICE_PARTED_LABEL="$usb_disk_label"
    fi
fi

# Choose the right MBR image file for the partition table type (issue #1153)
case "$USB_DEVICE_PARTED_LABEL" in
    (msdos)
        mbr_image_file="mbr.bin"
        ;;
    (gpt)
        mbr_image_file="gptmbr.bin"
        ;;
    (*)
        Error "Unsupported USB disk partition table type '$USB_DEVICE_PARTED_LABEL' (neither 'msdos' nor 'gpt')"
        ;;
esac

SYSLINUX_MBR_BIN=$( find_syslinux_file $mbr_image_file )

test -s "$SYSLINUX_MBR_BIN" || Error "Could not find SYSLINUX MBR image file '$mbr_image_file' (at least SYSLINUX 3.08 is required, 4.x preferred)"