Native VHD in Windows 7

I received this article from a college: Roel Janssens and I published it here with his permission.

The Virtual Hard Disk file format is getting more and more important for Microsoft (for example think Windows Azure) and with the introduction of Windows 7 Microsoft offers for the first time native VHD support. Working in Windows XP, Windows Vista and Windows Server 2003 you could mount a VHD with vhdmount, but the possibilities now have expanded and a lot more is going to happen in the future.

During TechEd 2008 Mark Russinovich gave a very interesting presentation called “Inside Windows 2008 R2 Virtualization Improvements and Native VHD Support”. The first hour has some nice enhancements in Hyper-V 2.0 and the last quarter Mark live demonstrates what Windows 7 is currently capable of regarding VHD.

All steps and findings in the following story are tested and confirmed working under Windows 7 Ultimate build 7000 and Windows Server 2008 R2 build 7000.


There is no need to install additional programs when you want to create, attach or detach a VHD, this is all default built in within Disk Management. When you are working on Windows Server 2008 R2 this is an easy way to transfer data between the parent and child partition, you can see it as a “VHD Stick”. A requirement for a child partition is that a SCSI Controller is available, otherwise you can’t live (hot) attach a VHD.

Besides working in Disk Management you now have the option to install Windows 7 inside a VHD and boot from it. After that it is also possible to make differencing VHD’s based on that installation and boot from them. Some advantages and possibilities that this offers are:

– The installation of a new Operating System no longer requires you to redesign how your partitions are arranged. All that is added is one big VHD file and one boot entry. If you want to get rid of the installation those are all you have to delete.

– Differencing VHD’s make it possible to easily and safely test an upgrade to for example a new build of Windows 7. Do you like the upgrade then you can merge the differencing VHD, otherwise throw away the differencing VHD and continue to work where you left of in the original installation.


Microsoft originally set the target of maximum 10% performance loss when Windows 7 is installed inside a VHD compared to a bare metal installation. They have done good work on this part because tests show that this loss is about 1 or 2 %. There is always some noise inside those tests so you can say that it nearly approaches a bare metal installation. My own experiences during the last weeks are the same; you almost never feel you are working inside a VHD.

The boot loader of Windows Vista isn’t compatible with VHD entries; if you look at those entries from within Vista you will see some ‘unknown’ parameters. If you also have Vista on your system and for some reason it starts up in Vista Repair then all boot entries referencing a VHD will be lost! Therefore it is wise to regularly make a backup of you Boot Configuration Database with bcdedit /export, that way you can always go back.

An option that has disappeared when booted from a VHD is the option to hibernate your machine. With power management you now only have the options of Sleep and Shut Down (this also happens when you enable the Hyper-V role on Windows Server 2008). Time will tell if Microsoft is going to develop or support hibernation when working with VHD’s.

Installation Windows 7 inside a VHD

To install Windows 7 inside a VHD you need at least 20GB free disk space. For now the installation is only supported on internal disks, so no external USB drives yet. In the following procedure we are going to install Windows 7 inside a 20GB VHD which we create in the directory c:\vhd. If you have an existing fixed size VHD (for example one created with Hyper-V Manager) you can use that one and skip step 05.

01 boot from Windows 7 DVD or USB
02 Shift-F10 for a command prompt
03 dir C: (of D: E: etc.) to see where your VHD-directory has gone
04 diskpart
05 create vdisk file=c:\vhd\win7.vhd type=fixed maximum=20000
06 select vdisk file=c:\vhd\win7.vhd
07 attach vdisk
08 exit
09 setup
10 install Windows 7 on the new 20GB Unallocated Space (ignore the warning)

After the installation there will be a new boot entry created where the system default will boot from. Start a command prompt with Administrator credentials and type bcdedit /v to see the newly created entry:

As you can see the two entries ‘device’ and ‘osdevice’ don’t reference a partition (e.g. with Windows Vista), but a physical file somewhere on your computer. The funny thing is when you are booted inside this installation you can look for this file with Windows Explorer; this is somewhat strange to understand when looking at it. Something else that changes is the location of the pagefile; it can’t exist within a VHD so Windows will automatically select another location for it.

Create differencing VHD

A differencing VHD is a disk that only saves the differences compared to his parent. This way you can quickly and easily test something without modifying your current installation. Currently Microsoft only supports placing both the parent and the differencing disk on the same volume, but this might change in the future. Parent disks are only used for read only operations while differencing disks perform more write operations, I can imagine placing them on separate disk subsystems optimized for read or write operations.

You can only create a differencing VHD when the parent you want to create a differencing disk from is not in use at that moment (so you can’t be booted inside your parent VHD). Following procedure again makes use of the boot functionality of the Windows 7 DVD, but you can also use a separate Windows Server 2008 installation and use Hyper-V Manager from there to create a differencing VHD. You don’t have to specify a size; this is specified by the parent.

01 boot from Windows 7 DVD or USB
02 Shift-F10 for a command prompt
03 dir C: (or D: E: etc.) to see where your VHD-directory has gone
04 diskpart
05 create vdisk file=c:\vhd\win7-diff.vhd parent=c:\vhd\win7.vhd
06 exit

99 No need to reboot right now, you can continue the next procedure at step 03

Now a differencing VHD is created with the previous Windows 7 installation as parent. The initial size of the differencing VHD will be very small, but this will grow during usage. When booted from within this differencing VHD and looking at it from within Windows Explorer you will see it’s size is the same as that from the parent. When you look at the VHD from another Operating System you will the normal size again.

Create additional boot entry

To be able to boot from previous differencing VHD you have to add an additional boot entry. You can do this from within a working Window 7 installation or again after booting from the Windows 7 DVD. The following steps can be done immediately after creating the differencing VHD.

01 boot from Windows 7 DVD or USB
02 Shift-F10 for a command prompt
03 bcdedit /v
04 bcdedit /copy {identifier-of-Windows7} /d “Windows 7 diff”
05 bcdedit /v
06 bcdedit /set {identifier-of-Windows7-diff} device vhd=[locate]\VHD\Win7-diff.vhd
07 bcdedit /set {identifier-of-Windows7-diff} osdevice vhd=[locate]\VHD\Win7-diff.vhd
08 bcdedit /v

In step 03 you have to look for the entry of Windows 7, you can Copy and Paste this identifier and use it in step 04. In step 04 the entry “Windows 7” will be copied to a new entry named “Windows 7 diff”. In step 05 you have to look for the new entry “Windows 7 diff” and Copy & Paste the identifier in step 06 and 07. In step 06 and 07 the correct parameters for ‘device’ and ‘osdevice’ will be filled in. Check the newly created “Windows 7 diff” entry with bcdedit /v

Take care of above notation, because there are some inconsistencies with the entry that is used for a normal VHD. With a normal VHD ‘device’ uses the notation device file= and with a differencing VHD we have to use device vhd=. With a normal VHD a drive letter is used, with a differencing VHD the word locate is used. A drive letter should have worked here also, but I did not manage to get that to work.

I don’t know if above inconsistencies are in fact well over thought choices by Microsoft, but I have the feeling that this is because of using beta software. With bcdedit /? /formats you get a little more information but it doesn’t give an explanation about the difference between the formats. I tried many other combinations but above screenshot is the only one found 100% working.

Merge differencing VHD

If you tried something out in a differencing VHD and you are satisfied with the result then you can merge this information in the parent VHD. You might have created a long differencing VHD chain, you can specify the depth to which you want to merge.

01 boot from Windows 7 DVD or USB
02 Shift-F10 for a command prompt
03 dir C: (or D: E: etc.) to see where your VHD-directory has gone
04 diskpart
05 select vdisk file=c:\vhd\win7-diff.vhd depth=2
06 merge vdisk depth=1
07 exit

In step 05 you have to select the differencing VHD with a depth greater than or equal to the depth of step 06. In this example we merge one level back.

Delete above experiments

Are you ready testing and do you want to get rid of the obsolete boot entries? Start a command prompt with Administrator credentials and delete them with bcdedit /delete {identifier-of-entry-to-be-deleted} Delete the physical VHD file(s) from your hard drive and everything is gone without leaving a trace.

Read More