I recently had a windows backup in vhd format stored on an EXT3 drive, only readable by my Ubuntu VM. Don't ask me how this happened, but I need to pull a few files off the backup.

Instead of copying the giant file to a Windows VM, I decided to mount the vhd image then ntfs partition in Ubuntu.

First build and install libvhdi and dependencies

sudo apt-get install -y autopoint libfuse-dev
# all my sources lives in ~/src
mkdir -p ~/src && cd ~/src
git clone [email protected]:libyal/libvhdi.git
cd libvhdi
./synclibs.sh
./autogen.sh
./configure
make
sudo make install

Mount the image

sudo mkdir /mnt/vhdiimage
sudo vhdimount -X allow_root /media/mydrive/WindowsImageBackup/uuid.vhd /mnt/vhdiimage/

Figure out what type of disk image we're dealing with:

sudo su
cd /mnt/vhdiimage
fdisk -lu vhdi1

Find the offset of the partition you want to mount. Oh, look at that, what do you know? It's NTFS.

Disk vhdi1: 239.3 GB, 239286190080 bytes
16 heads, 48 sectors/track, 608536 cylinders, total 467355840 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
Disk identifier: 0x00000000

 Device Boot      Start         End      Blocks   Id  System
vhdi1p1             128   467353727   233676800    7  HPFS/NTFS/exFAT

Calc the offset (Sector size * Start) and mount:

losetup -o $((128*512)) /dev/loop0 vhdi1
mkdir /mnt/backup
mount -o ro,noload /dev/loop0 /mnt/backup

The disk is now mounted in /mnt/backup