Let’s assume you created a disk image with dd on a linux computer like

1$ sudo dd if=/dev/sda of=disk.img bs=4M status=progress conv=fsync

There are several partitions in that image and we want to access the linux filesystem on it. For reference, I’ll bring in some old backup I made from a Raspberry Pi. That backup is taken from a 8GB sdcard, which is 2.6GB compressed with xz.

When uncompressed, look at the partition table with fdisk:

 1$ fdisk -l disk.img
 2Festplatte disk.img: 7,4 GiB, 7948206080 Bytes, 15523840 Sektoren
 3Einheiten: Sektoren von 1 * 512 = 512 Bytes
 4Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
 5E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
 6Festplattenbezeichnungstyp: dos
 7Festplattenbezeichner: 0x1b7f4bbb
 8
 9Gerät      Boot Anfang     Ende Sektoren Größe Kn Typ
10disk.img1         8192   532479   524288  256M  c W95 FAT32 (LBA)
11disk.img2       532480 15523839 14991360  7,1G 83 Linux

We will refer to this output later again.

Using losetup

The output of fdisk is not that important to us, unless we have an unknown disk image that we need to inspect first. I already know the partitions. The first is the FAT32 partition used for UEFI and the second is the root file system.

Creating and mounting the loop device

1$ sudo losetup --partscan --find --show disk.img
2/dev/loop1

The second line is the output of the program. I used losetup already today, so this is not loop0 but loop1. You may get /dev/loop0 usually.

Mount the new virtual loop device to the directory that you like. This is ~/tmp in my case.

1$ sudo mount /dev/loop1p2 tmp

Removing the loop device

1$ sudo umount tmp
2$ sudo losetup -d /dev/loop1

Using fdisk and mount

From the output above, we see that 532480 is the starting unit of the linux filesystem in this image file. Further above you see the Units (Einheiten): 1 Unit is 1 sector of 512 Bytes.

I use a german speaking computer, so you might look for Start or Offset or Beginning—you know what to look for…

We calculate the needed offset like: 532480 * 512 = 272629760

And the resulting command is

1$ sudo mount -o loop,offset=272629760 disk.img tmp/

A remount is simple as

1$ sudo umount tmp

When do you need this stuff

I often create quick and dirty (big) card images from my Raspberry Pies. They are saved and easy to copy over to another storage (because they are a single file).

If you have less space, dd is probably not the best method to create a disk backup. partimage for example creates images from partitions, but it only saves the used data from that partition. Those images are smaller.