Mount Disk Image On Loop Device
From Wiki
Jump to navigationJump to search
Overview
Shell script to mount an image of a disk (created by something like 'dd if=/dev/sda of=sda.img') to a local directory.
If the image is named 'disk.img', and the image has two partitions, then
./mu.sh mount disk.img
will create the following:
./disk ./disk/p1 ./disk/p2
Where ./disk/p1 will be partition 1 from the image, ./disk/p2 will be partition 2, etc
Unmounting the image will remove the directory structure.
Caveat
I use this to mount Raspian images that get written to an SD card. I don't know exactly what will happen with extended partitions, swap partitions, etc.
Code
#!/bin/sh
mount_image () {
MOUNTPOINT=${IMAGE##*/}
MOUNTPOINT=${MOUNTPOINT%.*}
MOUNTPOINT="${MOUNTPOINT}/p"
COUNT=1
LINES=`fdisk -lu ${IMAGE} | grep "^${IMAGE}"`
echo "$LINES" | while read -r a; do
OFFSET=`echo $a | cut --delimiter=' ' -f 2`
NEXTFREELOOP=`losetup -f`
MOUNTPOINTFULL="${MOUNTPOINT}${COUNT}"
mkdir -p ${MOUNTPOINTFULL}
CMD="losetup ${NEXTFREELOOP} ${IMAGE} -o $((OFFSET * 512))"
if ! `${CMD}`; then
echo "\"${CMD}\" failed. Stopping."
exit 1
fi
CMD="mount ${NEXTFREELOOP} ${MOUNTPOINTFULL}"
if ! `${CMD}`; then
echo "\"${CMD}\" failed. Stopping."
exit 1
fi
COUNT=$((COUNT + 1))
done
}
umount_image () {
MOUNTPOINT=${IMAGE##*/}
MOUNTPOINT=${MOUNTPOINT%.*}
MOUNTLIST="${MOUNTPOINT}/p*"
for i in ${MOUNTLIST}; do
CMD="umount -d $i"
if ! `${CMD}`; then
echo "\"${CMD}\" failed. Stopping."
exit 1
fi
done
rm -r ${MOUNTPOINT}
}
usage () {
echo "Usage $0 {mount|umount} {image_name}"
exit 1;
}
if [ "$#" -ne 2 ]; then
usage
fi;
if ! [ $(id -u) = 0 ]; then
echo "Script requires root privileges"
exit 1
fi
if [ ! -f "$2" ]; then
echo "File \"$2\" does not exist. Stopping."
exit 1
fi
case $1 in
mount)
IMAGE="$2"
mount_image
;;
umount)
IMAGE="$2"
umount_image
;;
*)
usage
;;
esac
exit 0