X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=mount.vdi;h=69fb458c1f9f8762f50ed852d006fd312d247240;hb=fbcc804e103fb05de8e7446b5c6e9249f10d07d9;hp=5aafb7f817cd764a2a9ba5a55af9177f0dae3fd4;hpb=299eae76df033d778ccb577f1e36107eef2d225b;p=packages%2FVirtualBox.git diff --git a/mount.vdi b/mount.vdi old mode 100644 new mode 100755 index 5aafb7f..69fb458 --- a/mount.vdi +++ b/mount.vdi @@ -27,12 +27,15 @@ export PATH=/bin:/sbin:/usr/bin:/usr/sbin # Commands LOSETUP=/sbin/losetup MOUNT=/bin/mount +PARTED=/usr/sbin/parted +SED=/bin/sed PROGRAM=${0##*/} +MOUNTARGS= OPTIONS= FSTYPE= -USAGE="VDI image mountpoint [-o options,...] +USAGE=" [-o options,...] Options: partition= Specify partition to mount @@ -55,9 +58,12 @@ while :; do -h | "-?" ) echo >&2 "Usage: $PROGRAM $USAGE" exit 0 ;; - -o ) + -o) OPTIONS="$2"; shift ;; + -n) + MOUNTARGS="$MOUNTARGS $1" + ;; -?* ) echo >&2 "$PROGRAM: unrecognized option: $1" exit 1 ;; @@ -89,10 +95,17 @@ fi # check magic magic=$(head -n 1 "$DEVICE") -if [ "$magic" != "<<< innotek VirtualBox Disk Image >>>" ]; then +case "$magic" in +"<<< innotek VirtualBox Disk Image >>>") + ;; +"<<< Sun VirtualBox Disk Image >>>") + ;; +"<<< Oracle VM VirtualBox Disk Image >>>") + ;; +*) echo >&2 "$PROGRAM: $DEVICE: bad magic, not VDI image" exit 1 -fi +esac MOUNTOPTIONS= PARTITION= @@ -100,8 +113,8 @@ OFFSET= OLDIFS=$IFS IFS=", " for opt in $OPTIONS; do - KEY=${opt%=*}; - VAL=${opt#*=}; + KEY=${opt%=*}; + VAL=${opt#*=}; case "$KEY" in part|partition) PARTITION="$VAL" @@ -129,45 +142,27 @@ fi dskoff=8704 # find free loop device. XXX race possible -imgdev=$(losetup -f) -losetup $imgdev -o $dskoff "$DEVICE" -# http://vserver.13thfloor.at/Stuff/QEMU/hdloop.sh -sfd=$(/sbin/sfdisk -dump $imgdev 2>/dev/null | sed -n ' - /:/ s/[a-zA-Z]*=\ *\([0-9a-f]*\)\(,\|$\)/\1/g; - T; s/^.*:\ //; p' | tr ' ' '.') -losetup -d $imgdev - -getoffset() { - pstart=$1 - psize=$2 - - blksize=512 - offset=$((pstart*blksize)) - size=$((psize*blksize)) - echo $((offset+dskoff)) -} - -p=1 -for a in $sfd; do - if [ "$p" = "$PARTITION" ]; then - OFFSET=$(getoffset $(echo "$a" | tr '.' ' ')) - fi - x=$((p++)) -done +imgdev=$($LOSETUP -f) || exit 1 +$LOSETUP $imgdev -o $dskoff "$DEVICE" +dump=$($PARTED -s -m $imgdev unit B print) +$LOSETUP -d $imgdev || exit 1 + +partoff=$(echo "$dump" | $SED -ne "s/^$PARTITION:"'\([0-9]*\)B:.*/\1/p') +OFFSET=$((dskoff + partoff)) -if [ -z "$OFFSET" ]; then +if [ -z "$partoff" -o -z "$OFFSET" ]; then echo >&2 "$PROGRAM: couldn't figure out offset, perhaps out of range?" exit 1 fi if [ -z "$MOUNTOPTIONS" ]; then - MOUNTOPTIONS="offset=$OFFSET" + MOUNTOPTIONS="loop,offset=$OFFSET" else - MOUNTOPTIONS="$MOUNTOPTIONS,offset=$OFFSET" + MOUNTOPTIONS="$MOUNTOPTIONS,loop,offset=$OFFSET" fi # $MOUNTPOINT might not exist as mount can try to read it from /etc/fstab -"$MOUNT" ${FSTYPE:+-t "$FSTYPE"} ${MOUNTOPTIONS:+-o "$MOUNTOPTIONS"} "$DEVICE" "$MOUNTPOINT" +$MOUNT $MOUNTARGS ${FSTYPE:+-t "$FSTYPE"} ${MOUNTOPTIONS:+-o "$MOUNTOPTIONS"} "$DEVICE" "$MOUNTPOINT" if [ $? -ne 0 ]; then - echo >&2 "$PROGRAM: error mounting $DEVICE" + echo >&2 "$PROGRAM: error mounting $DEVICE" fi