[Fedora-livecd-list] Bug 587411 - livecd-iso-to-disk --format fails with SD/MMC partitions

Frederick Grose fgrose at gmail.com
Wed May 12 20:35:48 UTC 2010


On Mon, May 10, 2010 at 6:27 PM, Alan Pevec <apevec at gmail.com> wrote:

> On Mon, May 10, 2010 at 10:20 PM, David Huff <dhuff at redhat.com> wrote:
> > Frederick's patch fixes issues with SD cards that do not have a standard
> > partitioning layout and requires part0 ie: /dev/mmcblk0
>
> issue is that partitions on mmc device use separator p i.e. 1st
> partition is mmcblk0p1
>
> > However the proposed patch requires users specify a
> > partition for the storage device or have --format option require a
> > partition number.
>
> --format will create one, first partition, so it doesn't make sense to
> specify the partition number
>

Yes,  currently we don't support multiple partition devices.  That will be
another bug and patch upcoming.


> > Any comments on this?
> >
> > Also Frederick can you please resend the patch to the list, that way I
> > can apply it and retain all header info for the commit.
>
> patch in BZ also merged checkLVMActive() which is now committed
>
> I don't like special case for mmc:
> [[ "${path/*mmc*/yes}" = yes ]] && mmc=p
>
> instead, why not simply detect partition separator here:
>
> path=/dev/`basename $path`
> partnum0=${path##$device}
> partnum=${partnum0/#p/}
> if [ "$partnum" = "$partnum0" ]; then
>  separator=""
> else
>  separator="p"
> fi
> ...
> USBDEV=${device}${separator}${partnum:-1}


A problem arises because users are allowed to --reset-mbr --format a
partition by simply supplying a device node such as /dev/sdb.  This means
the code must determine an appropriate partition name when one is not
supplied. So the suggested test fails for the case where "... --format
/dev/mmcblk0 ..." is supplied to livecd-iso-to-disk.

The path test works, but assumes that the separator is used, and apparently
some older systems did not use a 'p' separator.  So, better to just read
from /proc/partitions.

The following patch is proposed--but note: It has NOT been tested on EFI
code paths.

      --Fred


diff --git a/tools/livecd-iso-to-disk.sh b/tools/livecd-iso-to-disk.sh
index f4d0855..f92fe2b 100755
--- a/tools/livecd-iso-to-disk.sh
+++ b/tools/livecd-iso-to-disk.sh
@@ -47,21 +47,24 @@ getdisk() {
        return
     fi

-    p=$(udevadm info -q path -n $DEV)
-    if [ -e /sys/$p/device ]; then
- device=$(basename /sys/$p)
+    path=$(udevadm info -q path -n $DEV)
+    if [ -e /sys/$path/device ]; then
+    device=$(basename /sys/$path)
     else
- device=$(basename $(readlink -f /sys/$p/../))
+    device=$(basename $(readlink -f /sys/$path/../))
     fi
     if [ ! -e /sys/block/$device -o ! -e /dev/$device ]; then
- echo "Error finding block device of $DEV.  Aborting!"
- exitclean
+    echo "Error finding block device of $DEV.  Aborting!"
+    exitclean
     fi
-
-    device="/dev/$device"
+
     # FIXME: weird dev names could mess this up I guess
-    p=/dev/`basename $p`
-    partnum=${p##$device}
+    set $( awk '$4 ~ /'${device#/}'.*[0-9]$/ {print $4}' /proc/partitions )
+    partition=$1
+    path=/dev/$(basename $path)
+    partnum=${path##$device}
+    [[ -z "$partnum" ]] && partnum=${partition##$device}
+    device="/dev/$device"
 }

 resetMBR() {
@@ -157,16 +160,17 @@ createGPTLayout() {
     echo "WARNING: THIS WILL DESTROY ANY DATA ON $device!!!"
     echo "Press Enter to continue or ctrl-c to abort"
     read
-    umount ${device}? &> /dev/null
+    umount ${device}* &> /dev/null
     /sbin/parted --script $device mklabel gpt
     partinfo=$(LC_ALL=C /sbin/parted --script -m $device "unit b print"
|grep ^$device:)
     size=$(echo $partinfo |cut -d : -f 2 |sed -e 's/B$//')
     /sbin/parted --script $device unit b mkpart '"EFI System Partition"'
fat32 17408 $(($size - 17408)) set 1 boot on
-    USBDEV=${device}1
     # Sometimes automount can be _really_ annoying.
     echo "Waiting for devices to settle..."
     /sbin/udevadm settle
     sleep 5
+    partnum=$( awk '$4 ~ /'${device#/}'.*[0-9]$/ {print $4}'
/proc/partitions )
+    USBDEV=${device}${partnum}
     umount $USBDEV &> /dev/null
     /sbin/mkdosfs -n LIVE $USBDEV
     USBLABEL="UUID=$(/sbin/blkid -s UUID -o value $USBDEV)"
@@ -179,16 +183,17 @@ createMSDOSLayout() {
     echo "WARNING: THIS WILL DESTROY ANY DATA ON $device!!!"
     echo "Press Enter to continue or ctrl-c to abort"
     read
-    umount ${device}? &> /dev/null
+    umount ${device}* &> /dev/null
     /sbin/parted --script $device mklabel msdos
     partinfo=$(LC_ALL=C /sbin/parted --script -m $device "unit b print"
|grep ^$device:)
     size=$(echo $partinfo |cut -d : -f 2 |sed -e 's/B$//')
     /sbin/parted --script $device unit b mkpart primary fat32 17408
$(($size - 17408)) set 1 boot on
-    USBDEV=${device}1
     # Sometimes automount can be _really_ annoying.
     echo "Waiting for devices to settle..."
     /sbin/udevadm settle
     sleep 5
+    partnum=$( awk '$4 ~ /'${device#/}'.*[0-9]$/ {print $4}'
/proc/partitions )
+    USBDEV=${device}${partnum}
     umount $USBDEV &> /dev/null
     /sbin/mkdosfs -n LIVE $USBDEV
     USBLABEL="UUID=$(/sbin/blkid -s UUID -o value $USBDEV)"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.fedoraproject.org/pipermail/livecd/attachments/20100512/068a7a42/attachment-0001.html 


More information about the livecd mailing list