May 23, 2008

Migrating from VirtualBox to VMware

As part of the Gnash buildbot farm, I run several virtual machines as build slaves. I started with VirtualBox because it is free software and I prefer to support free software, but it's still a bit too fragile and it still lacks x86_64 guest support.

When I discovered that VMware Server is now available for free--well, free as in beer, anyway--I happily installed it and set up some new VMs on it. Best of all, it supports x86_64 guests! Of course, now I have the problem of migrating those VirtualBox guest VMs over to VMware.

VMware uses its own VMDK format for storing virtual disk images, while VirtualBox uses its own VDI format. The first step is getting a copy of vditool, VirtualBox's command line program for manipulating VDI files.

The host OS I used to run VirtualBox is Ubuntu's 8.04 Hardy Heron on AMD64. The VirtualBox 1.6.0 .deb package didn't include vditool, for some reason. Fortunately, the VirtualBox package in Debian's "lenny" release includes it, so lets just grab it from there.

$ wget http://http.us.debian.org/debian/pool/main/v/virtualbox-ose/virtualbox-ose_1.5.6-dfsg-6_amd64.deb
$ dpkg -x virtualbox-ose_1.5.6-dfsg-6_amd64.deb vbox-1.5.6
$ sudo cp vbox-1.5.6/usr/lib/virtualbox/vditool /usr/lib/virtualbox/vditool
$ sudo ln -sf /usr/lib/virtualbox/vditool /usr/bin/vditool

There, now we have vditool installed. Next, we use it to export our old VirtualBox VDI back to raw disk data. However, if you used VirtualBox's "Snapshots" with differencing VDI's, you need to discard all snapshots before the one you want to write out as the raw disk: only the "base" data gets written out, not the "Current State".

$ cd ~/.VirtualBox/VDI
$ vditool copydd win2000-i386-32gb.vdi win2000-i386-32gb.dd
vditool    Copyright (c) 2004-2008 innotek GmbH.

Copying VDI image file="win2000-i386-32gb.vdi" to DD file="win2000-i386-32gb.dd"...
The operation completed successfully!

Be careful, this could consume a lot of disk space, if you were using compacted VDI's instead of fixed size as the raw image will be the full size of the disk image, which in my case was 32 GB even though the VDI only took ~6.5 GB on disk.

Once we have the raw data, we can create the VMDK metadata for our DD image. We compute the size of the raw data in sectors by dividing its size in bytes by 512:

$ stat --printf="%s 512/p" win2000-i386-32gb.dd | dc
67108864

We also need to compute the CHS geometry of the virtual disk. I used the assumption of 255 heads and 63 sectors:

$ stat --printf="%s 512/255/63/p" win2000-i386-32gb.dd | dc
4177

Once we have that information, we go ahead and create the VMDK metadata. Change the elements highlighted in blue as appropriate for your system:

$ cat >win2000-i386-32gb-flat.vmdk <<-__EOF__
# Disk DescriptorFile
version=1
CID=4dd210c6
parentCID=ffffffff
createType="monolithicFlat"

# Extent description
RW 67108864 FLAT "win2000-i386-32gb.dd" 0

# The Disk Data Base
#DDB

ddb.virtualHWVersion = "4"
ddb.geometry.cylinders = "4177"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.adapterType = "buslogic"
__EOF__

There, we now have a VMDK suitable for use in VMware! But, it takes up all 32 GB of space on the disk while only ~6.5 GB is actually in use. Lets use vmware-vdiskmanager to create another VMDK that is growable, instead:

$ vmware-vdiskmanager -r win2000-i386-32gb-flat.vmdk -t 0 win2000-i386-32gb.vmdk
Using log file /tmp/vmware-dossy/vdiskmanager.log
Creating a monolithic growable disk 'win2000-i386-32gb.vmdk'
  Convert: 100% done.
Virtual disk conversion successful.

And there you have it: a growable converted VMDK from VDI:

$ ls -lh win2000-i386-32gb*
-rw------- 1 dossy dossy  32G 2008-05-23 11:26 win2000-i386-32gb.dd
-rw------- 1 dossy dossy  327 2008-05-23 13:40 win2000-i386-32gb-flat.vmdk
-rw------- 1 dossy dossy 6.5G 2008-05-23 14:25 win2000-i386-32gb.vdi
-rw------- 1 dossy dossy 6.3G 2008-05-23 14:20 win2000-i386-32gb.vmdk

From here, I created a new virtual machine under VMware Server, specifying "Custom" and using an existing virtual disk--the one I just created.

Of course, I couldn't just boot this VM up because the virtualized hardware from VirtualBox differs from the virtualized hardware in VMware, and the particular VM in question is a Microsoft Windows 2000 guest. To fix the Windows install, I performed a "repair installation" of Windows 2000. I guess this is necessary when you change all the hardware out from underneath a Windows machine. After completing the repair installation, the VM booted up! I went ahead and installed VMware Tools, rebooted, and now everything works as expected.

I don't know how many folks out there want to migrate away from VirtualBox to VMware, but I couldn't find very much useful information on doing it so hopefully this will help people out who want to do it.

Tags: , ,

Posted by dossy at 11:31 PM | 629 | Link | Comments (3) | Trackbacks (0) | Bloglines | Feedster | Technorati | BlogPulse
Lane Bryant Save 25% 468X60


Comments
1
Gravatar Icon

I wanted to do that with an hex editor (on windows).
Is the cat >win2000... command inserting data to the beginning of the file?
Line feed characters limit the lines, but right after __EOF__ is the raw data in the resulting file. Did I get it right?

Posted by: R.Batista on July 15, 2008 at 12:30 PM | Permalink
2
Gravatar Icon

R. Batista:

Yes, it's just creating a plain text file named "win2000-i386-32gb-flat.vmdk" whose contents should be the lines between "<<-__EOF__" and "__EOF__".

Posted by: Dossy on July 15, 2008 at 01:29 PM | Permalink
3
Gravatar Icon

Thanks for the instructions. I misunderstood at first because I thought "win2000-i386-32gb-flat.vmdk" would end at 32 GB size, when actually is 327 in your example.

It's working now, I had just cut off the virtualbox header, renamed the raw file and created the metadata file.

Posted by: R. Batista on July 18, 2008 at 10:14 PM | Permalink
Post a comment

Who are you?

(what is this?)
(what is this?)
(what is this?)
(what is this?)


(required)
(required, not displayed)


Allowed markup: a href title, abbr title, acronym title, b, blockquote cite type, br, code, dd, dl, dt, em, i, li, ol, p, pre, strike, strong, tt, ul.

Please type in the letters shown in the image below:
Graphical CAPTCHA.

A preview of your comment:

Posted by: