From a1d31a77548b3c60139ea9b4f49c1eb463f66593 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Tue, 21 May 2019 17:23:46 +0200 Subject: [PATCH] - fix mounting of mmcblk partitions; thanks to DBoxOldie --- skel-root/armbox/hd51/lib/mdev/fs/mdev-mmcblk | 147 ++++++++++++++---- 1 file changed, 119 insertions(+), 28 deletions(-) diff --git a/skel-root/armbox/hd51/lib/mdev/fs/mdev-mmcblk b/skel-root/armbox/hd51/lib/mdev/fs/mdev-mmcblk index 43c89a76..6f4df380 100755 --- a/skel-root/armbox/hd51/lib/mdev/fs/mdev-mmcblk +++ b/skel-root/armbox/hd51/lib/mdev/fs/mdev-mmcblk @@ -4,15 +4,64 @@ MOUNTBASE=/mnt MOUNTPOINT="$MOUNTBASE/$MDEV" -if [ "$MDEV" = "mmcblk0p3" ]; then - MOUNTPOINT="$MOUNTBASE/linuxrootfs1" -elif [ "$MDEV" = "mmcblk0p7" ]; then - MOUNTPOINT="$MOUNTBASE/userdata" -fi ROOTDEV=$(readlink /dev/root) - +BLOCKS="/sys/block/mmcblk0/mmcblk0p*/uevent" +KERNELDEV="" +K_PARTNAME="" +ROOTFSDEV="" +R_PARTNAME="" +ROOTSUBDIR="" +NEWLAYOUT=0 +# to use partnames in old layout, set it to 1 +USE_PARTNAMES=0 +# +check_mmcblk() +{ +devname="" +partname="" +for i in $BLOCKS;do + if [ "$i" != "$BLOCKS" ];then + devname=$(cat $i | grep DEVNAME | cut -d '=' -f 2) + if [ "$devname" == "$MDEV" ];then + partname=$(cat $i | grep PARTNAME | cut -d '=' -f 2) + if [ -n "$(echo $partname | grep 'kernel')" ];then + KERNELDEV=$devname + K_PARTNAME=$partname + break + elif [ -n "$(echo $partname | grep 'rootfs')" ];then + ROOTFSDEV=$devname + R_PARTNAME=$partname + if [ -n "$(echo $partname | grep 'linuxrootfs')" ];then + NEWLAYOUT=1 + R_PARTNAME="linuxrootfs1" + fi + break + elif [ -n "$(echo $partname | grep 'userdata')" ];then + ROOTFSDEV=$devname + R_PARTNAME=$partname + NEWLAYOUT=1 + break + fi + fi + fi +done +[ "$partname" == "swap" -o "$partname" == "swapdata" ] && exit 0 +[ "$NEWLAYOUT" == "1" -o "$USE_PARTNAMES" == "1" ] && MOUNTPOINT="$MOUNTBASE/$R_PARTNAME" +} +# +read_cmdline() +{ +for param in $(cat /proc/cmdline);do + if [ -n "$(echo $param | grep rootsubdir)" ];then + ROOTSUBDIR=$(echo $param | cut -d '=' -f 2) + break + fi +done +} +# check partition names +check_mmcblk # do not add or remove root device again... -[ "$ROOTDEV" = "$MDEV" ] && exit 0 +[ "$ROOTDEV" = "$MDEV" -a "$R_PARTNAME" != "userdata" ] && exit 0 if [ -e /tmp/.nomdevmount ]; then LOGINFO "no action on $MDEV -- /tmp/.nomdevmount exists" @@ -22,36 +71,78 @@ fi case "$ACTION" in add) # do not mount kernel partitions - for i in 2 4 6 8; do - if [ ${MDEV:$((${#MDEV}-1)):1} -eq $i ]; then - LOGINFO "[$ACTION] /dev/$MDEV is a kernel partition - not mounting." - exit 0 - fi - done - # TODO: check for partitions - if grep -q "/dev/$MDEV" /proc/mounts; then - LOGINFO "/dev/$MDEV already mounted - not mounting again" + if [ "$KERNELDEV" == "$MDEV" ];then + LOGINFO "[$ACTION] /dev/$MDEV is a kernel partition [$K_PARTNAME] - not mounting." exit 0 fi - LOGINFO "[$ACTION] mounting /dev/$MDEV to $MOUNTPOINT" - # remove old mountpoint symlinks we might have for this device - rm -f $MOUNTPOINT - mkdir -p $MOUNTPOINT - mount -t auto /dev/$MDEV $MOUNTPOINT 2>&1 >/dev/null - RET=$? - if [ $RET != 0 ]; then - LOGWARN "mount /dev/$MDEV $MOUNTPOINT failed with $RET" - LOGWARN " $OUT1" - rmdir $MOUNTPOINT + # TODO: check for partitions + if [ "$NEWLAYOUT" == "1" ];then + if grep -q $MOUNTPOINT /proc/mounts; then + LOGINFO "/dev/$MDEV already mounted [$R_PARTNAME] - not mounting again" + exit 0 + fi + mkdir -p /tmp/$MDEV + mount -t auto /dev/$MDEV /tmp/$MDEV 2>&1 >/dev/null + RET=$? + [ $RET != 0 ] && LOGWARN "mount /dev/$MDEV to /tmp/$MDEV failed with $RET" && rmdir /tmp/$MDEV + if [ "$R_PARTNAME" == "linuxrootfs1" ];then + LOGINFO "mounting /dev/$MDEV [$R_PARTNAME] to $MOUNTPOINT" + mkdir -p $MOUNTPOINT + mount --bind /tmp/$MDEV/linuxrootfs1 $MOUNTPOINT + elif [ "$R_PARTNAME" == "userdata" ];then + # parse cmdline for rootsubdir + read_cmdline + for i in /tmp/$MDEV/*;do + if [ -n "$(echo $i | grep linuxrootfs)" ];then + if [ "$ROOTSUBDIR" == "$(basename $i)" ];then + LOGINFO "/dev/$MDEV rootsubdir [$ROOTSUBDIR] is already mounted as root" + continue + fi + MOUNTPOINT="$MOUNTBASE/$(basename $i)" + if grep -q $MOUNTPOINT /proc/mounts; then + LOGINFO "/dev/$MDEV already mounted [$(basename $i)] - not mounting again" + else + LOGINFO "mounting /dev/$MDEV [$(basename $i)] to $MOUNTPOINT" + mkdir -p $MOUNTPOINT + mount --bind /tmp/$MDEV/$(basename $i) $MOUNTPOINT + fi + fi + done + fi + umount -lf /tmp/$MDEV + RET=$? + if [ $RET = 0 ]; then + rmdir /tmp/$MDEV + else + LOGWARN "umount /tmp/$MDEV failed with $RET" + fi + else + if grep -q "/dev/$MDEV" /proc/mounts; then + LOGINFO "/dev/$MDEV already mounted - not mounting again" + exit 0 + fi + LOGINFO "[$ACTION] mounting /dev/$MDEV to $MOUNTPOINT" + # remove old mountpoint symlinks we might have for this device + rm -f $MOUNTPOINT + mkdir -p $MOUNTPOINT + mount -t auto /dev/$MDEV $MOUNTPOINT 2>&1 >/dev/null + RET=$? + if [ $RET != 0 ]; then + LOGWARN "mount /dev/$MDEV $MOUNTPOINT failed with $RET" + LOGWARN " $OUT1" + rmdir $MOUNTPOINT + fi fi ;; + # I think never comes a 'remove' from mdev, because never the mmcblock will be removed + # It can be used for manually ( or per script ) umounting remove) LOGINFO "[$ACTION] unmounting $MOUNTBASE/$MDEV" - grep -q "^/dev/$MDEV " /proc/mounts || exit 0 # not mounted... + grep -q "$MOUNTBASE/$MDEV " /proc/mounts || exit 0 # not mounted... umount -lf $MOUNTBASE/$MDEV RET=$? if [ $RET = 0 ]; then - rmdir $MOUNTPOINT + rmdir $MOUNTBASE/$MDEV else LOGWARN "umount $MOUNTBASE/$MDEV failed with $RET" fi