17

Is it possible (how) to mount an VHD file created by Windows 7 in OS X?

I found some information about how to do this on linux. There is a fuse fs "vdfuse" which uses virtualbox libs to mount filesystems supported by virtualbox. However I was unable to compile the package on osx because nearly all headers are missing and I doubt that it would work anyway...

EDIT #2: Okay I got my hands dirty and finally compiled vdfuse (http://forums.virtualbox.org/viewtopic.php?f=26&t=33355&start=0) on osx. As a starting point I used macfuse (http://code.google.com/p/macfuse/) and looked at the example file systems.

This led me to the following build script

infile=vdfuse.c
outfile=vdfuse
incdir="your/path/to/vbox/headers"
INSTALL_DIR="/Applications/VirtualBox.app/Contents/MacOS"
CFLAGS="-pipe"

gcc -arch i386 "${infile}" \
         "${INSTALL_DIR}"/VBoxDD.dylib \
         "${INSTALL_DIR}"/VBoxDDU.dylib \
         "${INSTALL_DIR}"/VBoxVMM.dylib \
         "${INSTALL_DIR}"/VBoxRT.dylib \
         "${INSTALL_DIR}"/VBoxDD2.dylib \
         "${INSTALL_DIR}"/VBoxREM.dylib \
        -o "${outfile}" \
        -I"${incdir}" -I"/usr/local/include/fuse" \
        -Wl,-rpath,"${INSTALL_DIR}"  \
        -lfuse_ino64  \
        -Wall ${CFLAGS}

You actually don't need to compile VirtualBox on your machine, just install a recent version of VirtualBox.

So now I can partially mount vhds. The separate partitions appear as block files Partition1, Partition2, ... on my mount point. However Mac OS X does not include a loopback file system and macfuse's loopback fs does not work with block files, so we need a loopback fs to mount the blockfiles as actual partitions.

Chealion
  • 5,753

8 Answers8

7

Finally I got it working. So in summary here are the steps to perform

  1. Install macfuse
  2. Install Virtual Box
  3. Compile vdfuse as mentioned in the question
  4. Mount the vhd disk

    sudo ./vdfuse -tVHD -w -f/Path/To/VHD /Path/To/Mountpoint

  5. Attach the virtual partition blockfiles

    hdiutil attach -imagekey diskimage-class=CRawDiskImage -nomount /Path/To/Mountpoint/PartitionN

  6. Mount the virtual partition

    mount -t YourFS /dev/diskK /Path/To/ParitionMountPoint

6

It's now 2020, and these 10-year-old instructions almost worked. Here's what I did to mount an old Backup Image from Windows 7 on my Mojave Mac, based on the accepted answer from Jan Bernlöhr, as well as the script in the question.

  1. Install osxfuse (the successor to macfuse)
  2. Install VirtualBox
  3. Download the vdfuse source code (vdfuse.c) from https://github.com/Thorsten-Sick/vdfuse (currently at v83 - the original link is pegged to v80).
  4. Download the VirtualBox headers, but you have to get a version from 2012. I used the following command: svn co -r '{20120801}' http://www.virtualbox.org/svn/vbox/trunk/include/
  5. Use the following build instructions, adapted from the question, but with a few small alterations (64-bit build, and newer VirtualBoxes don't seem to have VBoxREM.dylib:
  infile=vdfuse.c
  outfile=vdfuse
  incdir="$(pwd)/include"
  INSTALL_DIR="/Applications/VirtualBox.app/Contents/MacOS"
  CFLAGS="-pipe"

  gcc -arch x86_64 "${infile}" \
         "${INSTALL_DIR}"/VBoxDD.dylib \
         "${INSTALL_DIR}"/VBoxDDU.dylib \
         "${INSTALL_DIR}"/VBoxVMM.dylib \
         "${INSTALL_DIR}"/VBoxRT.dylib \
         "${INSTALL_DIR}"/VBoxDD2.dylib \
        -o "${outfile}" \
        -I"${incdir}" -I"/usr/local/include/fuse" \
        -Wl,-rpath,"${INSTALL_DIR}"  \
        -lfuse_ino64  \
        -Wall ${CFLAGS}
  1. Mount the vhd disk

    sudo ./vdfuse -tVHD -w -f/Path/To/VHD /Path/To/Mountpoint

  2. Attach the virtual partition blockfiles

    hdiutil attach -imagekey diskimage-class=CRawDiskImage -nomount /Path/To/Mountpoint/PartitionN

  3. Mount the virtual partition

    mount -t YourFS /dev/diskK /Path/To/ParitionMountPoint

Miraculously, this works a charm!

Ben XO
  • 161
4

This worked for me on Mountain Lion. No installation or compilation necessary:

hdiutil attach -readonly -imagekey diskimage-class=CRawDiskImage <Path to .vhd file>
henning77
  • 345
2

In 2025 WinZip for Mac works as well: https://www.winzip.com/en/learn/file-formats/vhd/

1

FUSE works on MacOSX, however you would need the headers.

gWaldo
  • 12,027
1

If you don't find another solution, you could use VirtualBox (or another similar tool that supports VHD files) to run a virtual system that uses that virtual disk image, and then access or copy the files you need using Samba or sftp or such.

JanC
  • 398
1

Just rename your VHD file to IMG.. double click on it to mount it. That's all.

Remember that Mac OS X provides read access only for NTFS volume, so if your VHD has a NTFS volume, you have only read access.

Bart De Vos
  • 18,171
FiReBaT
  • 11
-1

The easiest way (in 2022): Rename the .vhd to .img and double click. Change what you need to change, eject the drive and rename back to .vhd.

Works like a charm.