mount SD card image (partitioned image) w/o kpartx

If you are working with SD card image I pretty sure that you were in the situation when you had to mount the image before write it to the SD card.
Particular example when you want to modify cmdline.txt in a Raspberry PI image (because you want to use different partition for booting).

1. With kpartx utility

If your system doesn't have kpartx utility install it for example with apt-get install kpartx command in case of Debian-Like systems.

For demonstration I use 2016-05-27-raspbian-jessie-lite.img image.

  1. set up loop devices
    losetup -f 2016-05-27-raspbian-jessie-lite.img

  2. (optional) Check the loop device
    losetup
    NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
    /dev/loop0 0 0 0 0 /home/vinyo/Downloads/2016-05-27-raspbian-jessie-lite.img

  3. Create device maps from partition tables
    kpartx -av /dev/loop0
    add map loop0p1 (254:0): 0 129024 linear /dev/loop0 8192
    add map loop0p2 (254:1): 0 2572288 linear /dev/loop0 137216

  4. (optional) Check mapped partitions with blkid
    Simpliy type blkid and hit enter. Output:
    ...
    /dev/mapper/loop0p1: SEC_TYPE="msdos" LABEL="boot" UUID="22E0-C711" TYPE="vfat" PARTUUID="6fcf21f3-01"
    /dev/mapper/loop0p2: UUID="202638e1-4ce4-45df-9a00-ad725c2537bb" TYPE="ext4" PARTUUID="6fcf21f3-02"
    ...

  5. Mount these partitions
    mkdir /mnt/tmp1
    mkdir /mnt/tmp2
    mount -t vfat /dev/mapper/loop0p1 /mnt/tmp1
    mount -t ext4 /dev/mapper/loop0p2 /mnt/tmp2
    After you are done with the neccessary modifications you can dismount everything.

  6. DisMount
    umount /mnt/tmp1
    umount /mnt/tmp2
    kpartx -dv /dev/loop0
    losetup -d /dev/loop0

You can check it everything is unmounted by running losetup command, it should return with "nothing".

2. Without kpartx utility

It is possible to mount partitions inside an image without kpart utility as well, but I think this way a little bit more complicated.

Follow these steps:

1. Determine the size partitions (where is it started and ended)

1.1. Run parted 2016-05-27-raspbian-jessie-lite.img
1.2. Type u b and enter. --> This will change the display unit to bytes.
1.3. Type print to display partition layout. Sample output:

parted 2016-05-27-raspbian-jessie-lite.img  
GNU Parted 3.2  
Using /home/vinyo/Downloads/2016-05-27-raspbian-jessie-lite.img  
Welcome to GNU Parted! Type 'help' to view a list of commands.  
(parted) u b                                                              
(parted) print                                                            
Model:  (file)  
Disk /home/vinyo/Downloads/2016-05-27-raspbian-jessie-lite.img: 1387266048B  
Sector size (logical/physical): 512B/512B  
Partition Table: msdos  
Disk Flags: 

Number  Start      End          Size         Type     File system  Flags  
 1      4194304B   70254591B    66060288B    primary  fat16        lba
 2      70254592B  1387266047B  1317011456B  primary  ext4

(parted) q                                                                
2. Set up loopbak devices

As you can see there are two partition inside the image file. We need to create two loopback device for them:

losetup -f -o 4194304 --sizelimit 66060288 2016-05-27-raspbian-jessie-lite.img  
losetup -f -o 70254592 --sizelimit 1317011456 2016-05-27-raspbian-jessie-lite.img  

Please double check the offset and sizelimit parameters!

Check with losetup and blkid commands:
losetup:

NAME        SIZELIMIT   OFFSET AUTOCLEAR RO BACK-FILE  
/dev/loop0   66060288  4194304         0  0 /home/vinyo/Downloads/2016-05-27-raspbian-jessie-lite.img
/dev/loop1 1317011456 70254592         0  0 /home/vinyo/Downloads/2016-05-27-raspbian-jessie-lite.img

blkid:

/dev/loop0: SEC_TYPE="msdos" LABEL="boot" UUID="22E0-C711" TYPE="vfat"
/dev/loop1: UUID="202638e1-4ce4-45df-9a00-ad725c2537bb" TYPE="ext4"
2. Mount the partitions
mount /dev/loop0 /mnt/tmp1  
mount /dev/loop1 /mnt/tmp2  

Check:

df -hT /dev/loop*  
Filesystem     Type      Size  Used Avail Use% Mounted on  
/dev/loop0     vfat       63M   21M   43M  33% /mnt/tmp1
/dev/loop1     ext4      1.2G  738M  389M  66% /mnt/tmp2
udev           devtmpfs   10M     0   10M   0% /dev  
udev           devtmpfs   10M     0   10M   0% /dev  
udev           devtmpfs   10M     0   10M   0% /dev  
udev           devtmpfs   10M     0   10M   0% /dev  
udev           devtmpfs   10M     0   10M   0% /dev  
udev           devtmpfs   10M     0   10M   0% /dev  
udev           devtmpfs   10M     0   10M   0% /dev  

After you are done with you work unmount everything.

3. Unmount the partitions
root@debian:~# umount /mnt/tmp1 /mnt/tmp2/  
root@debian:~# losetup  
NAME        SIZELIMIT   OFFSET AUTOCLEAR RO BACK-FILE  
/dev/loop0   66060288  4194304         0  0 /home/vinyo/Downloads/2016-05-27-raspbian-jessie-lite.img
/dev/loop1 1317011456 70254592         0  0 /home/vinyo/Downloads/2016-05-27-raspbian-jessie-lite.img
root@debian:~# losetup -d /dev/loop0 /dev/loop1  
root@debian:~# losetup  
root@debian:~#  

Vincze Janos Istvan

Read more posts by this author.

Hungary

Subscribe to Blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!