Booting from a VHD

Hosting an OS in a virtual machine can be very useful for developers, but sometimes one pays a price in terms of performance. In Windows 7 developers can get improved performance in virtual machines by native booting a VHD. First create a Virtual PC that hosts Windows 7, then restart your computer, and finally boot directly into the VHD that contains the Windows 7 OS. When you native boot a VHD your virtual machine runs very close to the metal; performance is greatly enhanced and you have much better support for OS features that may not be available inside a standard Virtual PC. I find this very useful, particularly when working with demanding software development projects. When I boot into a VHD that contains Windows 7 and Visual Studio, I can load big projects and still see good performance while coding and debugging.

Though I’m hardly the first to do so, I wanted to share some of what I discovered while experimenting with this technology. This post is not designed as a reference. Instead I wanted to chat about my experiences, and to explain a very simple way to get up and running. Please see the Additional Resources section at the bottom of this post if you want more detailed information, or if you have trouble with the directions I provide here.

Here are a few caveats and notes to keep in mind while reading this post. The VHD native boot technology is supported on Windows 7 Enterprise, Windows 7 Ultimate or Windows Server 2008, R2. The tools mentioned in this post such as bcdboot and bcdedit ship with Windows 7. Bitlocker cannot be used either in the VHD you are hosting, or on the drive that is hosting the VHD. Hibernation is also not supported in the VHD. Windows Virtual PC requires that your CPU supports the Intel® Virtualization Technology or AMD-V™ and that the feature be turned on.

Overview

If you already know a good deal about Virtual PCs, you may find the following synopsis of this post is enough to get you started:

  1. Use the Windows 7 Virtual PC to Create a VHD that hosts one of the versions of Windows 7 mentioned above.
  2. Use the Disk Managment console(diskmgmt.msc) to map (Attach) the VHD to a drive on a machine running Windows 7.
  3. Use BcdBoot to add the drive to the boot menu by typing: bcdboot x:\windows, where is X is the drive to which you mapped your VHD.

That’s all there is to it. Now you can restart your system and boot into your VHD. The rest of this post explains this process in more depth.

How it Looks when You Boot from a VHD

On one of my machines I have created two VHD’s based on Windows 7 that I can boot into as alternatives to my main operating system. The menu I see when I start my computer is shown in Figure 1. The options in Figure 1 labeled Sadhu-B and VHD are both VHDs containing complete versions of Windows 7 Enterprise. The default option, Windows 7, is my main OS, which is not run from a VHD, but is just a normal version of Windows Ultimate.

Figure01

Figure 1: This photograph of the boot menu I see when I start my computer shows that I can choose my main OS, or boot into one of two VHDs.

Creating a VHD

Virtual PC is not a new tool, and the steps necessary to launch a window that contains a virtual OS are covered extensively in many other posts. Nevertheless, I’ll highlight the main points here just in case you need a refresher course.

Install and launch Windows 7 Virtual PC and select Create a Virtual Machine. A wizard whirs to life and guides you through the process of creating your virtual OS. You can accept most of the default values offered by the wizard, but I would consider using the advanced option on the third page of the wizard to create a speedy fixed disk. Native boot tries to expand a dynamic VHD to its maximum size, which can lead to very ugly out of disk space errors. As a result, I prefer to create fixed VHD’s between 16 and 64 GB depending on my needs.

After creating the VHD, pop your Windows 7 DVD in a drive or open an ISO file and step through the normal Windows install procedure. If you want to use an ISO file, open the Settings for the Virtual Machine you created. In the Settings dialog, click on DVD in the left pane and select your ISO in the right pane. Now double click the virtual machine to start it. Your OS will install into your VHD.

Mapping a VHD as a Drive on Your System

After building a VHD that contains an instance of Windows 7 you should close the virtual machine your created and map your new VHD as a drive on your system. I do the mapping with the Disk Management console shown in Figure 2. You can launch this tool by opening the Start menu and typing diskmgmt.msc, or by following these steps:

  • Open the Control Panel
  • Click on System and Security
  • Find the Administrative Tools section and click on Create and Format Hard Disk Partitions

Figure02

Figure 2: In this screen shot of the Disk Management console, Disk 2 is actually a VHD mapped as drive X.

To map a drive, open the Action menu shown in Figure 2 and choose Attach VHD. You will be able to browse across your system for your VHD file. When you select the file and click OK, the drive will be mapped automatically. You can right click on the drive to assign it a particular drive letter if you do not like the default letter selected by the system.

In Figure 2, you can see both the main VHD drive, which I have assigned the letter X, and a second smaller partition assigned the letter G. Windows creates this latter partition automatically when it is installed. It is used by Windows both in the normal boot process, and in the native boot from VHD process described in this post.

Add a Mapped VHD to Your Boot Menu

Once you have attached a VHD, here is how to insert the drive into the boot menu. Open up an elevated command prompt with Administrative privileges and type the following, where X is the letter for your mapped drive:

 bcdboot x:\windows

NOTE: Recall that you can open an elevated command window by choosing All Programs | Accessories, then right clicking on the Command Prompt icon and select Run as Administrator.

I should add that you can also use bcdedit to add an item to the boot menu. However, I find that the task is much easier to perform using bcdboot, so I’ve used that tool in this post.

After performing the steps outlined above, reboot your system so you can view your handiwork. You should now have the option to boot into you main operating system, or into your VHD. By default, both options will be labeled Windows 7, and the first, and default option will be the one which allows you to boot into your VHD.

Cleaning up Your System

You may wish to give a unique name to the label for your VHD, and you might also want to boot by default into your main operating system rather than the VHD. To set the default item in the boot menu to your currently running OS open an elevated command prompt and type the following:

 bcdedit /default {current}

Here is a typical session:

 C:\Windows\system32>bcdedit /default {current} 
The operation completed successfully.

The label {current} is the ID of a particular item in the boot menu. If you want to work with an item other than the current OS, you need to find the GUID that represents that item. You can do this by typing bcdedit at the command prompt with no parameters. Many lines of information will appear, but the ID for any particular item in the menu is easy to identify. For instance, here is the section that describes the boot menu item mapped to my drive X:

 Windows Boot Loader
-------------------
identifier              {cd825a48-864b-11de-b4d2-c6ca8bc0c584}
device                  partition=X:
path                    \windows\system32\winload.exe
description             Windows 7
locale                  en-us
inherit                 {bootloadersettings}
osdevice                partition=X:
systemroot              \windows
resumeobject            {cd825a47-864b-11de-b4d2-c6ca8bc0c584}
nx                      OptIn
detecthal               Yes

The first item in this excerpt from the output of bcdedit, called identifier, is the ID for this particular menu item. Notice also that the description field is set to Windows 7. Use the identifier to set the default of OS, or type the following to modify the description field:

 C:\>bcdedit /set {cd825a48-864b-11de-b4d2-c6ca8bc0c584} description "Sadhu-B" 
The operation completed successfully.

If you run bcdedit again, you will see this output:

 Windows Boot Loader
-------------------
identifier              {cd825a48-864b-11de-b4d2-c6ca8bc0c584}
device                  partition=X:
path                    \windows\system32\winload.exe
description             Sadhu-B
locale                  en-us
inherit                 {bootloadersettings}
osdevice                partition=X:
systemroot              \windows
resumeobject            {cd825a47-864b-11de-b4d2-c6ca8bc0c584}
nx                      OptIn
detecthal               Yes

Notice that the description field has been changed to Sadhu-B. This name will appear in your boot menu, as shown in Figure 1.

Summary

In this post you have learned how to boot from a VHD. This involves three simple steps:

  1. Create a Windows 7 Virtual PC
  2. Use the Disk Managment tool (diskmgmt.msc) to map the VHD to a drive on a Windows 7 machine
  3. Use BcdBoot to add the drive to the boot menu: bcdboot x:\windows

The text of this post also covered some simple techniques for cleaning up your boot menu by setting the description and default menu item. On my system, I can still boot back into my main OS and run the VHD as a Virtual PC, even after I have added it to my boot menu and booted into it one or more times.

Needless to say, I’m interested in native booting VHDs because it allows me to easily dog food different versions of Visual Studio. If you have a similar need for hosting multiple versions of an OS that have good performance characteristics, then you might find this technology valuable. Certainly I’ve found it useful, and fun, and I’ve enjoyed writing a little something about it. I’m aware that this subject relates only tangentially to my normal focus on posting about C# and Visual Studio, but I think many developers will be interested in reaping the obvious benefits of this technology.

In this post, I focused on a simple, popular technologies that make it easy for your to start booting from a VHD. You can also use Hyper V with this technology. There are a number of tools available for automating the production of VHDs, including the ImageX utility mentioned below and WIM2VHD. If you are interested in learning more, pursue some of the links shown below.

Additional References

kick it on DotNetKicks.com