Перенос виртуальной машины в KVM

Материал из support.qbpro.ru

По мотивам последних событий с моей работы решил написать этот пост, ибо ничего похожего в рунете к сожалению не обнаружил, а очень жаль, ибо перетаскивать виртуалки с VirtualBox и VMWare в благородный KVM все таки приходится. Один из популярных способов сводиться в сливу образа диска в KVM, а затем загрузка с установочного диска и востановление системы (а фактически новая установка поверх старых настроек). Лично меня подобная схема не устроила, потому что образ присланной виртуалки не содержал установочного диска с которого его можно было бы восстановить, а искать похожий образ муторно. Итак.

Мы имеем следующий набор. Виртуалка на VirtualBox или VMWare, гостевая система Windows (с linux такой свистопляски нет), и сервер с KVM на котором и будем размещать нашу виртуалку. В моем случае это сервер KVM который работает в связке с LVM, но я постараюсь затронуть и вариант когда KVM работает с файловыми образами диска.

Приступаем.

1. Готовим систему к переносу.

Не секрет, что и VirtualBox и VMWare для нормальной работы ставят в систему свои собственные дрова и утилиты. Так вот первое что нужно сделать - это избавиться от них. Удаляем и VirtualBox Guest Tools и VMWare tools...

Следующим шагом - необходимо будет отвязать нашу Windows от железа на котором она была установлена. К счастью для этого есть официальный мануал. Мотаем его в самый низ, и создаем файлик Mergeide.reg содержащий код из мануала.

После того как файлик был создан и сохранен, запускаем его и вносим изменения в реестр. Теперь осталось проверить что все необходимые файлы для запуска в KVM есть, для этого идем в C:\Windows\system32\drivers\ и ищем там файлы:

   atapi.sys
   intelide.sys
   pciide.sys
   pciidex.sys

Если какого либо из этих файликов нет - то заходим внутрь архива C:\Windows\Driver Cache\i386\Driver.cab и копируем недостающие файлики оттуда.

На этом мы закончили приготовления системы, и можем ее без проблем выключить.

2. Готовим образ диска

Тут есть варианты. Все зависит от того какая у вас система виртуализации щас, и где KVM будет хранить свои образы дисков.

Так или иначе, вся схема создания образа делиться на две части, первая - это подготовка SGF (Single Growable File), и вторая - это перенос SGF в KVM.

VMWare

Нам необходимо сконвертировать vmdk файл нашей виртуалки в формат SGF. Этот формат фактически сырой RAW нашего диска, и имеет расширение VMDK. Для VMWare он делается так

"C:\Program Files\VMware\VMware Server\vmware-vdiskmanager" -r windows.vmdk -t 0 windows-sgf.vmdk

Если в этом месте возникают какие либо грабли, то попробуйте параметр "-t 0" заменить на "-t 2". Хотя в большинстве случаев все должно пройти без проблем.

VirtualBox

Для того что бы сделать образ SGF в VBox'e необходимо в меню Файл -> Менеджер виртуальных дисков, выбрать диск интересующей нас виртуалки и нажать "Копировать". В качестве источника оставляйте выбранный диск, Тип виртуального диска выбираем VMDK, Дополнительные атрибуты - Фиксированный виртуальный диск.

После того как копирование завершиться вы увидете два образа, с одинаковым именем, но второй будет иметь после имени "-flat", например "windows.vmdk" и "windows-flat.vmdk". Как раз второй образ с flat и будет нашим SGF диском.

3. Проверяем образ

Для того что бы избежать ошибок можно проверить полученный образ. Для этого в linux есть команда file. Вывод нормального образа должен иметь примерно следующий вид

# file windows-sgf.vmdk windows-sgf.vmdk: x86 boot sector; partition 1: ID=0x83, active, starthead 1, startsector 63, 208782 sectors;
partition 2: ID=0x8e,starthead 0, startsector 208845, 16563015 sectors, code offset 0x48

Если вывод говорит о том что это файл образа VMWare - значит мы не получили нужного нам формата образа.

4. Устанавливаем образ в KVM

Тут все зависит от настроек KVM. Используете ли вы файлы, либо используете LVM. Оба варианта приведены ниже

LVM

Тут особой писать нечего. dd он и в Африке dd.

# dd if=/path/to/windows-sgf.vmdk of=/dev/volgroup/partname

После этого можно кормить KVM этот раздел LVM

KVM File (qcom2)

В качестве файлового стораджа я люблю использовать формат qcom2, хотя это больше вопрос религии. Тем не менее сконвертировать этот образ можно следующей командой

qemu-img convert -f vmdk windows-sgf.vmdk -O qcow2 windows.qcow2

Я думаю что объяснять не нужно что меняя параметр "-О" можно выбрать другой формат хранения. После чего данный диск можно кормить KVM.

Стоит так же отметить, что qemu-img позволяет конвертировать не только SGF но и простые vmdk, хотя с менее предсказуемым результатом. Поэтому лучше конвертировать. Если при конвертации выпадает ошибка, попробуйте не использовать ключ "-f vmdk", и дайте утилите самостоятельно определить формат образа. Говорят что помогает.

5. Первый запуск.

Я не буду расписывать как настраивать KVM, вы уже большие и сами знаете как это сделать, отмечу только тот факт, что Windows ни под каким соусом не поддерживает virtio, поэтому даже не пытайтесь.

После первого запуска система должна определить все новое железо, и установить на все драйвера. Тут будте внимательны. У меня был случай когда Windows не смогла найти драйвера на ACPI процессора, и мне пришлось его отключить в диспетчере устройств, что бы система не падала в BSOD. После установки всех устройств, систему лучше перезагрузить.

6. P2V

С виртуалками разобрались, но как быть с реальными машинами? Честно говоря не пробовал, но есть мнение что данный способ годиться и для реальных машин.

Подготовка машины происходит тем же способом, после выключения можно загрузиться с какого либо Linux LiveCD, и запустить команду на копирование всего физического диска (именно всегодиска , а не раздела) в заранее созданный LVM, или файл.

# dd if=/dev/sda | ssh user@kvm-host "dd of=/path/to/file.vmdk"

И конечно же вы догадались, что вместо file.vmdk, образ можно заливать сразу же в LVM. Не забудьте проверить md5 суммы у исходного и конечного образов.

Удачи в экспериментах.