# 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="<VDI image> <mountpoint> [-o options,...]
Options:
partition=<number> Specify partition to mount
# 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 >>>")
+ ;;
+*)
echo >&2 "$PROGRAM: $DEVICE: bad magic, not VDI image"
exit 1
-fi
+esac
MOUNTOPTIONS=
PARTITION=
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" $MOUNTARGS ${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"
fi