Возникла у нас следующая задача:
- Есть подготовленный и настроенный в VMware образ виртуальной машины, в нашем конкретном случае FreeBSD 8.1
- Есть виртуальная платформа XCP 1.6 в которой уже крутятся наши виртуальные машинки
Необходимо поселить новую VM на наш сервер, при этом с минимальным количеством телодвижений. Статья представляет собой собранною воедино информацию из нескольких источников. Кроме того я постарался причесать команды, чтобы вам, да и мне самому, просто применять их копи-пастом в будущем.
Первое, что нам нужно сделать, это получить сырой образ виртуальной машины
Мы получили из внешнего источника системные требования PIII 1000Mhz, 512RAM, 20Gb IDE и следующие файлы:
FreeBSD.nvram 8684
FreeBSD.vmdk 7131758592
FreeBSD.vmsd 0
FreeBSD.vmx 2234
FreeBSD.vmxf 262
Нужный нам файл — это образ диска FreeBSD.vmdk, который необходимо конвертировать в «сырой» формат. Для этого мы используем утилиту qemu-img из пакета app-emulation/qemu. Естественно устанавливать его на сервер нет необходимости, образ можно конвертировать на любой linux-машине. Предварительно убеждаемся, что формат образа vmdk. Если формат raw, то конвертировать ничего не нужно и просто переходим к следующему шагу.
$ qemu-img info FreeBSD.vmdk
image: FreeBSD.vmdk
file format: vmdk
virtual size: 20G (21474836480 bytes)
disk size: 6.6G
Далее собственно конвертация, после которой получаем бинарный образ жесткого диска размером 20 гигабайт:
$ qemu-img convert FreeBSD.vmdk -O raw FreeBSD.raw
FreeBSD.raw 21474836480
Способ доставки данного образа на сервер визуализации может быть любым удобным вам, в нашем случае я просто скопировал его на внешнее хранилище доступное из dom0.
Необходимо так же создать подходящую VM, руководствуясь системными требованиями. Описывать тут особо нечего, мы используем для управления нашими виртуалками свободный XenCenter.
Восстановление диска виртуальной машины из бинарного образа
Заходим в шел сервера визуализации и находим UUID витальной машины:
$ xe vm-list
...
uuid ( RO) : c681c725-xxxx-xxxx-xxxx-5d7cd920bdbf
name-label ( RW): FreeBSD
power-state ( RO): halted
...
$ export VMUUID=c681c725-xxxx-xxxx-xxxx-5d7cd920bdbf
устанавливаем загрузчик:
$ xe vm-param-set uuid=$VMUUID PV-bootloader=pygrub
жесткий диск делаем загрузочным, а виртуальный CD-привод не загрузочным:
$ xe vbd-param-set uuid=$(xe vbd-list vm-uuid=$VMUUID userdevice=0 --minimal) bootable=true
$ xe vbd-param-set uuid=$(xe vbd-list vm-uuid=$VMUUID type=CD --minimal) bootable=false
находим идентификатор VDI-диска свежесозданной виртуальной машины:
$ xe vm-disk-list uuid=$VMUUID
Disk 0 VBD:
uuid ( RO) : 50adb0d9-xxxx-xxxx-xxxx-f8f64e5c4f19
vm-name-label ( RO): FreeBSD
userdevice ( RW): 0
Disk 0 VDI:
uuid ( RO) : af85b950-xxxx-xxxx-xxxx-b5203ba45aae
name-label ( RW): FreeBSD
sr-name-label ( RO): Local storage
virtual-size ( RO): 21474836480
$ export VDIID=af85b950-xxxx-xxxx-xxxx-b5203ba45aae
переходим в окружение, в котором доступен жесткий диск виртуальной машины:
$ /opt/xensource/debug/with-vdi $VDIID /bin/bash
теперь устройство /dev/$DEVICE — это жесткий диск виртуальной машины. Осталось накатить на него образ, который мы получили в самом начале:
$ /opt/xensource/libexec/sparse_dd -src /var/run/sr-mount/.../FreeBSD.raw -dest /dev/$DEVICE \
-size 21474836480 -prezeroed
$ exit
Вот собственно и все, можно стартовать виртуальную машину.
UPD:
В некоторых случаях при копировании образа жесткого диска может возникать следующая ошибка:
Device /var/run/sr-mount/.../<образ.img> has an unknown driver
Возникает это потому, что разные системы виртуализации возможно по-разному понимают что такое гигабайт. Приведу пример. Я переносил виртуальную машину linux с двумя дисками 6Гб и 2Гб с Hyper-V на XCP. Все в точности аналогично описанному в данной статье. После конвертации я получил следующие бинарные файлы жестких дисков:
-rwxrwx--- 1 1000 1000 6442426368 Sep 10 16:51 sda.raw
-rwxrwx--- 1 1000 1000 2147484160 Sep 10 17:00 sdb.raw
А диски свежесозданной VM выглядят так:
# xe vm-disk-list uuid=$VMUUID
Disk 0 VBD:
uuid ( RO) : 6e81420a-xxxx-xxxx-xxxx-98b4fc8a5fd4
vm-name-label ( RO): linux
userdevice ( RW): 1
Disk 0 VDI:
uuid ( RO) : 3af76842-xxxx-xxxx-xxxx-b78dca108b22
name-label ( RW): linux-sdb
sr-name-label ( RO): Local storage
virtual-size ( RO): 2147483648
Disk 1 VBD:
uuid ( RO) : 28784fa2-xxxx-xxxx-xxxx-6100d97ccc29
vm-name-label ( RO): linux
userdevice ( RW): 0
Disk 1 VDI:
uuid ( RO) : f858579c-xxxx-xxxx-xxxx-5fc0493269fa
name-label ( RW): linux-sda
sr-name-label ( RO): Local storage
virtual-size ( RO): 6442450944
Как можно убедиться, бинарный файл sda.raw чуть меньше чем 6ГБ, а sdb.raw — чуть больше 2Гб. Почему так происходит, можно только гадать. Я просто взял при копировании меньшую из двух величин. Не знаю, на сколько такое решение корректно и/или универсально, в моем случае VM корректно стартовала и никаких проблем не наблюдается.