Ubuntu: Mount single partition from image of entire disk (device)



Question:

I made an image of my entire disk with

dd if=/dev/sda of=/media/external_media/sda.img  

Now the problem is I'd like to mount an ext4 filesystem that was on that disk but

mount -t ext4 -o loop /media/external_media/sda.img /media/sda_image  

obviously gives a superblock error since the image contains the whole disk (mbr, other partitions) not just the partition I need. So I guess I should find a way to make the disk image show up in the /dev/ folder... Does anyone know how to do that?

PS: I can always dd back the image to the original disk, but that would be very inconvenient (I updated the OS and I'd like to keep it as it is)


Solution:1

Get the partition layout of the image

$ sudo fdisk -lu sda.img  ...  Units = sectors of 1 * 512 = 512 bytes  Sector size (logical/physical): 512 bytes / 512 bytes  ...    Device Boot      Start         End      Blocks   Id  System  sda.img1   *          56     6400000     3199972+   c  W95 FAT32 (LBA)  

Calculate the offset from the start of the image to the partition start

Sector size * Start = (in the case) 512 * 56 = 28672

Mount it on /dev/loop0 using the offset

sudo losetup -o 28672 /dev/loop0 sda.img  

Now the partition resides on /dev/loop0. You can fsck it, mount it etc

sudo fsck -fv /dev/loop0  sudo mount /dev/loop0 /mnt  

Unmount

sudo umount /mnt  sudo losetup -d /dev/loop0  


Solution:2

Update for Ubuntu 16.04: With the new losetup this is now easier:

sudo losetup -Pf disk_image.raw  

See the rest of the answer for older versions of Ubuntu.


An easy solution is using kpartx: it will figure out the partition layout and map each to a block devices. After that all you have to do is mount the one you want.

Open Terminal, locate the disk image, and enter this command:

$ sudo kpartx -av disk_image.raw   add map loop0p1 (252:2): 0 3082240 linear /dev/loop0 2048  add map loop0p2 (252:3): 0 17887232 linear /dev/loop0 3084288  

This created loop0p1 and loop0p2 under /dev/mapper. From the output you can see the sizes of the partitions which helps you identify them. You can mount the one you want with:

$ sudo mount /dev/mapper/loop0p2 /mnt  

Alternatively, the block device is detected by Nautilus and you can mount it from the side bar:

enter image description here

When you are done, unmount what you mounted and remove the device mapping:

$ sudo umount /mnt  $ sudo kpartx -d disk_image.raw  


Solution:3

Edit : works with util-linux >=2.21. At the time of writing ubuntu ships with version 2.20 only

From man losetup :

       -P, --partscan            force kernel to scan partition table on newly created loop device  

So just run

$ sudo losetup -f --show -P /path/to/image.img  

to create device nodes for every partition of your disk image on the first unused loop device and print it to stdout. If using /dev/loop0 device it will create at least /dev/loop0p1 that you will be able to mount as usual.


Solution:4

Try gnome-disk-image-mounter:

$ gnome-disk-image-mounter sda.img

No sudo required. It will be mounted at /media/your_user_name/partition_name, just like USB drives.


Solution:5

losetup -P automation

losetup -P is the best method starting in Ubuntu 16.04 as mentioned at https://askubuntu.com/a/496576/52975 , here are functions to automate if further. Usage:

$ los my.img  /dev/loop0  /mnt/loop0p1  /mnt/loop0p2    $ ls /mnt/loop0p1  /whatever  /files  /youhave  /there    $ # Cleanup.  $ losd 0  $ ls /mnt/loop0p1  $ ls /dev | grep loop0  loop0  

Source:

los() (    img="$1"    dev="$(sudo losetup --show -f -P "$img")"    echo "$dev"    for part in "$dev"?*; do      dst="/mnt/$(basename "$part")"      echo "$dst"      sudo mkdir -p "$dst"      sudo mount "$part" "$dst"    done  )  losd() (    dev="/dev/loop$1"    for part in "$dev"?*; do      dst="/mnt/$(basename "$part")"      sudo umount "$dst"    done    sudo losetup -d "$dev"  )  

loop module max_part config

This is a decent method before 16.04.

loop is a kernel module, built into the kernel in Ubuntu 14.04.

If you configure it right, Linux automatically splits up the devices for you.

cat /sys/module/loop/parameters/max_part  

says how many partitions loop devices can generate.

It is 0 by default on Ubuntu 14.04 which is why no auto-splitting happens.

To change it, we can either add:

options loop max_part=31  

to a file in /etc/modprobe, or:

GRUB_CMDLINE_LINUX="loop.max_part=31"  

to /etc/default/grub and then sudo update-grub.

How to set a module parameter is also covered at: How to add kernel module parameters?

After a reboot, when you do:

sudo losetup -f --show my.img  

it mounts the image to a /dev/loopX device, and automatically mounts the partitions to /dev/loopXpY devices.

So this is the most convenient method if you are willing to reboot.

See also


Solution:6

Use losetup to attach the whole disk image.

# sudo losetup /dev/loop2 sda.img  

Then use mdadm to create an md device and block devices will be created for all of the partitions.

# sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2  mdadm: array /dev/md2 built and started.  

Now you should see the partition devices.

nile-172-b0fef38-76:/mnt/sdb1 # ls -l /dev/md2*  brw-rw---- 1 root disk   9, 2 Oct 10 12:37 /dev/md2  brw-rw---- 1 root disk 259, 0 Oct 10 12:37 /dev/md2p1  


Solution:7

The simplest way, in my opinion, is using mount -o loop,offset=... as mentioned in this answer on StackOverflow. The idea is as follows:

fdisk -l $IMAGE  # calculate the offset in bytes  mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT  

The method is best because it doesn't require deleting the loop device after you umount the mounted partition.

To further simplify the task (which is needed if you do it often), you may use my script mountimg to do everything for you. Just get it from https://github.com/AlexanderAmelkin/mountimg and use like this:

mountimg /media/external_media/sda.img 2 /media/sda_image  

You may as well specify filesystem type and any other additional mount options if you like:

mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8  

When you're done with the partition, simply umount it:

umount /media/sda_image  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »