На прошлой неделе появилась необходимость развернуть полигон одной из разрабатываемых систем на нашем 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(); }