From 6325cddb21dd9157a408d8f6b34d50e52caaffc8 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 20 May 2026 19:00:42 +0200 Subject: [PATCH] mount_digiparts: detect active block root by mounted device Bootable SD cards may boot with root=/dev/mmcblkXpY instead of root=PARTUUID=... In that case mount_digiparts.sh treated the system as NAND/UBI and failed to mount the Digi partitions. Resolve the active system from the block device mounted as "/" before falling back to the existing UBI logic. https://onedigi.atlassian.net/browse/DEL-9676 Signed-off-by: Isaac Hermida --- .../udev/udev-extraconf/mount_digiparts.sh | 85 ++++++++++++++----- 1 file changed, 64 insertions(+), 21 deletions(-) diff --git a/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh b/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh index 861559f6e..1a0acabd3 100644 --- a/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh +++ b/meta-digi-arm/recipes-core/udev/udev-extraconf/mount_digiparts.sh @@ -17,10 +17,61 @@ BASE_INIT="$(readlink -f "@base_sbindir@/init")" BASE_INIT_ORIG="$(readlink -f "@base_sbindir@/init.orig")" INIT_SYSTEMD="@systemd_unitdir@/systemd" -EMMCROOTFS="$(grep -qs 'root=PARTUUID.*' /proc/cmdline 2>/dev/null && echo 1)" + +get_block_disk() { + local dev + local syspath + + dev="${1##*/}" + syspath="$(readlink -f "/sys/class/block/${dev}")" + [ -n "${syspath}" ] || return + + if [ -f "${syspath}/partition" ]; then + basename "$(dirname "${syspath}")" + else + basename "${syspath}" + fi +} + +get_root_disk() { + local ROOT_DEV + local devname + local uevent + + ROOT_DEV="$(stat -c%D /)" + + for uevent in /sys/class/block/*/uevent; do + devname="$(sed -ne 's/^DEVNAME=//p' "${uevent}")" + [ -n "${devname}" ] || continue + + if [ "$(stat -c"%02t%02T" "/dev/${devname}")" = "${ROOT_DEV}" ]; then + get_block_disk "${devname}" + break + fi + done +} get_active_system() { - if [ -z "${EMMCROOTFS}" ]; then + local ROOT_DEV + local devname + local label + local uevent + + ROOT_DEV="$(stat -c%D /)" + + for uevent in /sys/class/block/*/uevent; do + devname="$(sed -ne 's/^DEVNAME=//p' "${uevent}")" + label="$(sed -ne 's/^PARTNAME=//p' "${uevent}")" + [ -n "${devname}" ] || continue + [ -n "${label}" ] || continue + + if [ "$(stat -c"%02t%02T" "/dev/${devname}")" = "${ROOT_DEV}" ]; then + ACTIVE_SYSTEM="${label}" + break + fi + done + + if [ -z "${ACTIVE_SYSTEM}" ]; then # For a read-only filesystem this will be /dev/ubiblock0_X # For an ubifs filesystem this will be ubiX:rootfs_X ACTIVE_SYSTEM="$(sed -e 's/^.*root=\([^ ]*\) .*$/\1/' /proc/cmdline 2>/dev/null)" @@ -36,25 +87,6 @@ get_active_system() { #Character device major/minor: 242:6 ACTIVE_SYSTEM="$(ubinfo "${ACTIVE_SYSTEM}" | sed -ne '/^Name/s,.* \([^[:blank:]]\+\)$,\1,g;T;p')" fi - else - local MMCROOT_DEV - local devname - local label - local uevent - - MMCROOT_DEV="$(stat -c%D /)" - - for uevent in /sys/class/block/*/uevent; do - devname="$(sed -ne 's/^DEVNAME=//p' "${uevent}")" - label="$(sed -ne 's/^PARTNAME=//p' "${uevent}")" - [ -n "${devname}" ] || continue - [ -n "${label}" ] || continue - - if [ "$(stat -c"%02t%02T" "/dev/${devname}")" = "${MMCROOT_DEV}" ]; then - ACTIVE_SYSTEM="${label}" - break - fi - done fi if [ -z "${ACTIVE_SYSTEM}" ]; then @@ -82,6 +114,17 @@ elif [ "${SUBSYSTEM}" = "ubi" ]; then [ -n "${result}" ] && exit 0 fi +if [ "${SUBSYSTEM}" = "block" ]; then + ROOT_DISK="$(get_root_disk)" + DEV_DISK="$(get_block_disk "${DEVNAME}")" + + if [ -n "${ROOT_DISK}" ] && [ -n "${DEV_DISK}" ] && + [ "${ROOT_DISK}" != "${DEV_DISK}" ]; then + logger "Skip mounting partition '${PARTNAME}', because it does not belong to the root disk" + exit 0 + fi +fi + MOUNT_FOLDER=${PARTNAME} MOUNT_PARAMS="-o silent" # Mount 'linux' partition as read-only