How can I mount a disk image?
Solution 1
The kpartx tool makes this easier. It creates loop devices in /dev/mapper for each partition in your image. Then you can mount the loop device that corresponds with your desired partition without having to calculate the offset manually.
For example, to mount the first partition of the disk image:
kpartx -a -v myimage.disk
mount /dev/mapper/loop0p1 /mnt/myimage
When you're done with the image, remove the loop devices:
umount /mnt/myimage
kpartx -d -v myimage.disk
Alternatively, if you have a recent kernel, and pass loop.max_part=63 on boot (if loop is built-in) or to modprobe (if loop is a module), then you can do it this way:
losetup /dev/loop0 myimage.disk
partprobe /dev/loop0 # Re-read partition table if /dev/loop0 was used with a different image before
mount /dev/loop0p1 /mnt/myimage
When you're done with the loop:
losetup -d /dev/loop0
Solution 2
Found this:
http://www.andremiller.net/content/mounting-hard-disk-image-including-partitions-using-linux
which seems exactly what I was looking for.
Here's the key part:
mount -o loop,ro,offset=32256 hda.img /mnt/rabbit
where the value of offset is in bytes. The suggested way to get the offset is to point parted
at the image, then unit B for bytes and take the start value from the print output. As an alternative, assuming you have the disk space, do the obvious: once you have the offset and size, just use dd
to extract each partition to a separate file.
Solution 3
Nowadays you can minimize your work by using udisks
. Solution from ArchWiki: udisks - Mount loop devices
To easily mount ISO images, use the following command:
udisksctl loop-setup -r -f image.iso
This will create a loop device and show the ISO image ready to mount. Once unmounted, the loop device will be terminated by udev.
-r
there for read only option.
Solution 4
local_image_file=/var/tmp/image.img
first_byte=$(parted -m ${local_image_file} unit B print | grep Linux | cut --fields 2 --delimiter ':' | sed 's/.$//')
loop_file=/var/tmp/loop
mkdir -p ${loop_file}
mount -o loop,ro,offset=${first_byte} ${local_image_file} ${loop_file}
Related videos on Youtube
Comments
-
Emiliano almost 2 years
I have a disk image
myimage.disk
which contains the partition table and a primary partition (i.e. a FAT32 filesystem). Think that as a USB pen image.I want to mount the primary partition to a local directory. I know how to mount a partition image using the loop utils but here I have disk image. My guess is that I have to mount the image "skipping" the partition table but how can I do that?
-
Flow over 9 yearsSee also superuser.com/questions/117136/… You may want to use simply
losetup --partscan --find --show disk.img
followed bymount /dev/loop0p1 /mnt/disk
-
Cristian Ciupitu over 6 yearsPossible duplicate of Mounting a multi-partition disk image in Linux
-
-
slhck over 12 yearsFor writing a really great answer, could you explain the most important parts here? Having a link is great, but having the info here would be best.
-
user over 12 yearsHere's the key part:
mount -o loop,ro,offset=32256 hda.img /mnt/rabbit
, where the value ofoffset
is in bytes. The suggested way to get the offset is to point parted at the image, thenunit
B
for bytes and take thestart
value from theprint
output. As an alternative, assuming you have the disk space, do the obvious: once you have the offset and size, just usedd
to extract each partition to a separate file. -
sch over 10 yearsYou don't need the
-o loop
above,/dev/mapper/loop0p1
is already a block device (a mapper device on top of a loop device, you don't want another layer of loop device on top of that). -
DavidPostill over 9 yearsWhile this may answer the question, it would be a better answer if you could provide some explanation why it does so.
-
Vladimir Panteleev over 8 yearsIf you don't get partition devices (
/dev/loop0p1
etc.) after runninglosetup
, runpartprobe /dev/loop0
. -
unfa over 6 years
kpartx
seems to be installed by default in Linux Mint 18.