На прошлой неделе появилась необходимость развернуть полигон одной из разрабатываемых систем на нашем VMware ESX. Полигон было сделан на VirtualBox и я думал, что конвертировать его в VMware не составит труда, благо есть VMware Converter. Однако, как оказалось, VMware Converter не поддерживает конвертацию виртуальных машин из формата VirtualBox. Погуглив нашел-таки способ и записал его в виде WHS-скрипта. Данный скрипт на входе не принимает никаких параметров и просто ищет в текущей папке все файлы с расширением .vdi, вытаскивает из них “сырой” образ диска и сохраняет в файл с расширением .dd. Далее создается текстовый файл .vmdk с описанием параметров жесткого диска для VMware: в нем указывается, собственно, путь к “сырому” образу диска и его параметры – количество цилиндров, головок и секторов. Эти параметры вычисляются исходя из размеров диска.

Для запуска скрипта вам потребуется: WSH и утилита из VirtualBox – vditool.exe (ей также нужны две библиотеки: VBoxDDU.dll и VBoxTR.dll).

Запускаете скрипт, откидываетесь на спинку кресла и… ждете пока все кончится :)

Далее запускаете, например, ваш любимый VMware Server, создается новую виртуальную машину, а в качестве диска указываете созданный .vmdk файл. Вот собственно и все. Сам скрипт представлен ниже.

var shell = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

var folder = fso.GetFolder("./");
var files = new Enumerator(folder.files);

for (; !files.atEnd(); files.moveNext())
{
 var file = files.item();
 var name = file.name;
 var ext = name.indexOf(".vdi");

if (ext == -1)
  continue;

var baseName = name.substring(0, ext);

shell.Run("vditool.exe copydd " + name + " " + baseName + ".dd", 0, true);

file = fso.GetFile(baseName + ".dd");

var sectors = file.Size / 512;
 var cyllinders = Math.round(sectors / 255 / 63);

var vmdk = "# Disk DescriptorFile\n" +
  "version=1\n" +
  "CID=4dd210c6\n" +
  "parentCID=ffffffff\n" +
  "createType=\"monolithicFlat\"\n" +
  "\n" +
  "# Extent description\n" +
  "RW " + sectors + " FLAT \"" + baseName + ".dd\" 0\n" +
  "\n" +
  "# The Disk Data Base\n" +
  "#DDB\n" +
  "\n" +
  "ddb.virtualHWVersion = \"4\"\n" +
  "ddb.geometry.cylinders = \"" + cyllinders + "\"\n" +
  "ddb.geometry.heads = \"255\"\n" +
  "ddb.geometry.sectors = \"63\"\n" +
  "ddb.adapterType = \"lsilogic\"\n";

var vmdkFileName = name.substring(0, ext) + ".vmdk";
 var vmdkFile = fso.CreateTextFile(vmdkFileName);
 vmdkFile.Write(vmdk);
 vmdkFile.Close();
}