Skip to main content

Mounting disk images on linux

··436 words·3 mins

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

$ 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:

$ fdisk -l disk.img
Festplatte disk.img: 7,4 GiB, 7948206080 Bytes, 15523840 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x1b7f4bbb

Gerät      Boot Anfang     Ende Sektoren Größe Kn Typ
disk.img1         8192   532479   524288  256M  c W95 FAT32 (LBA)
disk.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 #

$ sudo losetup --partscan --find --show disk.img

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.

$ sudo mount /dev/loop1p2 tmp

Removing the loop device #

$ sudo umount tmp
$ 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

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

A remount is simple as

$ 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.