Last time
I walked through creating a sparse disk image using dd
and
cp --sparse=always
. OK, we have a disk image. Now what?
Normally it would suffice to just set up a loop device and then mount,
but this disk image doesn’t just contain a filesystem. It has 4
partitions each with their own filesystem. This means in order to mount
one of the filesystems we have to take a few extra steps.
There is an easy and a hard way to do this. I’ll start with the hard
way..\
The Hard Way
To manually mount a particular partition on the disk we need to find a
little information about where the partition is located on the disk. We
need to use fdisk
to find the offsets of the start and end of the
partition.
\
dustymabe@media: mnt>sudo fdisk -l /mnt/lenovo.img
Disk /mnt/lenovo.img: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf82e2761
Device Boot Start End Blocks Id System
/mnt/lenovo.img1 * 2048 411647 204800 7 HPFS/NTFS/exFAT
/mnt/lenovo.img2 411648 884611071 442099712 7 HPFS/NTFS/exFAT
/mnt/lenovo.img3 884611072 946051071 30720000 7 HPFS/NTFS/exFAT
/mnt/lenovo.img4 946051072 976361471 15155200 12 Compaq diagnostics
From the fdisk
output we can see that the second partition starts at
411648 sectors times 512 bytes (210763776 bytes) into the disk image. We
can also see that the partition ends at 884611071 sectors times 512
bytes (452920868352 bytes). This means that the size of the partition is
452920868352 - 210763776 = 452710104576 bytes.
We can use this information to set up a loop device using losetup
like
so:
\
dustymabe@media: >sudo losetup -v -f -o 210763776 --sizelimit 452710104576 /mnt/lenovo.img
dustymabe@media: >
dustymabe@media: >losetup -a
/dev/loop0: []: (/mnt/lenovo.img), offset 210763776, sizelimit 452710104576
dustymabe@media: >
dustymabe@media: >sudo blkid /dev/loop0
/dev/loop0: LABEL="Windows7_OS" UUID="7C64B5C764B58504" TYPE="ntfs"
Finally, the loop device can be mounted just like a normal block
device:
\
dustymabe@media: >sudo mount -o ro /dev/loop0 ~/Desktop/mount/
dustymabe@media: >ls ~/Desktop/mount/Users
All Users Default Default User desktop.ini dustymabe Public
\
The Easy Way
You can use partx
to probe a disk image and detect all partitions. You
can also have partx
tell the kernel about all partitions and add
devices for each partition. An example of this is shown below:
\
dustymabe@media: >sudo losetup -v -f /mnt/lenovo.img
dustymabe@media: >sudo losetup -a
/dev/loop0: [2145]:12 (/mnt/lenovo.img)
dustymabe@media: >
dustymabe@media: >sudo partx --show /dev/loop0
[sudo] password for dustymabe:
NR START END SECTORS SIZE NAME UUID
1 2048 411647 409600 200M
2 411648 884611071 884199424 421.6G
3 884611072 946051071 61440000 29.3G
4 946051072 976361471 30310400 14.5G
dustymabe@media: >
dustymabe@media: >sudo partx -v --add /dev/loop0
partition: none, disk: /dev/loop0, lower: 0, upper: 0
/dev/loop0: partition table type 'dos' detected
/dev/loop0: partition #1 added
/dev/loop0: partition #2 added
/dev/loop0: partition #3 added
/dev/loop0: partition #4 added
dustymabe@media: >
dustymabe@media: >
dustymabe@media: >sudo blkid /dev/loop0*
/dev/loop0p1: LABEL="SYSTEM_DRV" UUID="0840B6DE40B6D224" TYPE="ntfs"
/dev/loop0p2: LABEL="Windows7_OS" UUID="7C64B5C764B58504" TYPE="ntfs"
/dev/loop0p3: LABEL="LENOVO" UUID="7652C00A52BFCCDD" TYPE="ntfs"
/dev/loop0p4: LABEL="LENOVO_PART" UUID="983479C03479A244" TYPE="ntfs"
Now you can directly mount /dev/loop0p2
just as we did before.
\
dustymabe@media: >sudo mount -o ro /dev/loop0p2 ~/Desktop/mount/
dustymabe@media: >ls ~/Desktop/mount/Users/
All Users Default Default User desktop.ini dustymabe Public
dustymabe@media: >
There ya go.. Two ways to mount partitions within a disk image. If I get
a chance I’ll go over a third using some free tools from the virt
community.
Dusty
References:
http://www.novell.com/communities/node/7066/accessing-file-systems-disk-block-image-files