32

Is it possible to mount a virtual hard disk (VHD, HDD, VDI, VMDK) on Ubuntu? How can this be done?

3
  • 1
    Have you searched Google? It abounds with guides on mounting VMDK, VDI, VHD, and raw disk image files on Ubuntu.
    – SirCharlo
    Oct 18, 2012 at 17:53
  • 2
    I have searched google, but I did not find like your result. Thanks :) Oct 19, 2012 at 2:16
  • Ubuntugeek link for VHD above failed.
    – K7AAY
    Nov 9, 2018 at 21:57

4 Answers 4

21

According to this wikibooks article:

Linux and other Unix-like hosts can mount images created with the raw format type using a loopback device. From a root login (or using sudo), mount a loopback with an offset of 32,256.

mount -o loop,offset=32256 /path/to/image.img /mnt/mountpoint

For other types of qemu images, you can use qemu-nbd

modprobe nbd max_part=16
qemu-nbd -c /dev/nbd0 image.qcow2
partprobe /dev/nbd0
mount /dev/nbd0p1 /mnt/image

Plus, usually, you can convert image from one format to another.

raw - (default) the raw format is a plain binary image of the disc 
       image, and is very portable. 
       On filesystems that support sparse files, 
       images in this format only use the 
       space actually used by the data recorded in them.
cloop -     Compressed Loop format, mainly used for reading Knoppix 
       and similar live CD image formats
cow - copy-on-write format, supported for historical reasons only and
       not available to QEMU on Windows
qcow - the old QEMU copy-on-write format, supported for 
       historical reasons and superseded by qcow2
qcow2 - QEMU copy-on-write format with a range of special features, 
       including the ability to take multiple snapshots, smaller 
       images on filesystems that don't support sparse files, 
       optional AES encryption, and optional zlib compression
vmdk - VMware 3 & 4, or 6 image format, for exchanging images 
       with that product
vdi - VirtualBox 1.1 compatible image format, for exchanging 
       images with VirtualBox.

I found this solution for (VirtualBox) .VDI when I searched, on this website:

modprobe nbd max_part=16
qemu-nbd -c /dev/nbd0 /path/to/some.vdi
mount -o loop /dev/nbd0p1 /mnt
# do stuff
umount /mnt
qemu-nbd -d /dev/nbd0
rmmod nbd

The same as "Qemu's way" commands. No borders!

1
  • As of today (November, 2022) this solution still works! Maybe it is worth adding that demanded partition is not neccesserilly nbd0p1. List all partitions: ls /dev/nbd0* and try to mount them one by one (umount /mnt/image if you get what you don't want).
    – Pawel
    Nov 3, 2022 at 11:33
9

This is on Ubuntu 16.04.

Install and mount using affuse:

sudo apt-get install afflib-tools
sudo affuse /path/file.vmdk /mnt/vmdk

Check sector size:

sudo fdisk -l /mnt/vmdk/file.vmdk.raw

# example

Disk file.vmdk.raw: 20 GiB, 21474836480 bytes, 41943040 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
Disklabel type: dos
Disk identifier: 0x000da525

Device       Boot Start      End  Sectors Size Id Type
/mnt/vmdk/file.vmdk.raw1 *     2048 41943039 41940992  20G 83 Linux

Multiply sectorsize and startsector. In this example it would be 2048*512:

$ echo 2048*512 | bc
1048576

Mount using that offset:

sudo mount -o ro,loop,offset=1048576 /mnt/vmdk/file.raw /mnt/vmdisk

Disk should now be mounted and readable on /mnt/vmdisk

3
  • 1
    great!!! did it for me on Ubuntu 17.10
    – cljk
    Nov 15, 2017 at 8:47
  • This is not working for me on 16.04.5 for my .vmdk...works through the fdisk step, and the main partition of my VM, the one I want to mount, also starts at 2048, but mount -o ro,loop,offset=1048576 ./foo.raw /mnt/foo fails with only root can use "--options" option. With sudo, it fails with failed to setup loop device: Permission denied. Aug 14, 2018 at 21:00
  • at least on ubuntu 22.04, affuse doesn't support vmdk files Jan 24, 2023 at 23:51
6

You can also use qemu:

For .vdi

sudo modprobe nbd
sudo qemu-nbd -c /dev/nbd1 ./linux_box/VM/image.vdi

if they are not installe you can install them (on Ubuntu is this comand)

sudo apt install qemu-utils

and then mount it

mount /dev/nbd1p1 /mnt

For .vmdk

sudo modprobe nbd
sudo qemu-nbd -r -c /dev/nbd1 ./linux_box/VM/image.vmdk

notice tha I use the option -r that's because VMDK version 3 must be read only to be able to be mounted by qemu

and then I mount it

mount /dev/nbd1p1 /mnt

I use nbd1 because nbd0 sometimes gives 'mount: special device /dev/nbd0p1 does not exist'

For .ova

tar -tf image.ova
tar -xvf image.ova

The above will extract the .vmdk disk and then mount that.

2

For vmdk and vhd files, I only got lucky with the kpartx command below:

sudo kpartx -a -v <image-flat.vmdk>

Check the output for the losetup, it should contain loop device /dev/loop0; also check sudo blkid for partition /dev/mapper/loop0p1, then use it in the mount command:

sudo mount -o rw /dev/mapper/loop0p1 /mnt/vmdk

Where /mnt/vmdk is your mount point, to be created with sudo mkdir /mnt/vmdk if non-existent.

source at commandlinefu.com (kpartx and mount command)

Unmount with:

sudo umount /mnt/vmdk
sudo kpartx -d -v <image-flat.vmdk>
2
  • Just tested this method with vhd, it works!
    – N0rbert
    Feb 23, 2019 at 11:30
  • just tested with vmdk and it didn't work. it seems that kpartx only supports raw images (without metadata and space-saving tricks). this also makes sense because kpartx is not more than a partition-aware wrapper over losetup (loopback devices), and these can only support raw files Jan 25, 2023 at 11:09

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .