Опыт переноса виртуальной машины с чужого хостинга XEN на свой KVM

в 6:03, , рубрики: Debian, kvm, linux, xen, виртуализация, хостинг, метки: , , ,

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

Сайт крутился в облаке известного провайдера на виртаульной машине с гипервизором XEN. Я надеялся, что поддержка пойдёт навстречу и выдаст образ виртуальной машины, но чуда не случилось: отказ был холоден и учтив, наверное, как обычно. В результате родилась примерная схема переноса: сделать образ диска, передать его на свой сервер, создать у себя виртуалку, указав полученный образ в качестве источника.

Опытные специалисты уже догадываются, с чем мне пришлось столкнуться в процессе выполнения плана. Для остальных привожу детали и способы решения возникших сложностей.

1. Подключение к своему серверу

Поскольку делать образ диска на сам этот диск достаточно хлопотно, нужно было подключить файловую систему, отличную от используемой. Первое, что пришло в голову — смонтировать домашнюю папку своего сервера в файловую систему на виртуалке с помощью sshfs. Команды привожу для дистрибутива Debian:

# apt-get install sshfs
# mkdir /mnt/vasya
# sshfs vasya@pupkin.ru:/home/vasya /mnt/vasya
Password: Чебурашка-2014

2. Перевод ФС в read-only

Для того, чтобы файловая система не потеряла целостность, нужно было перевести её в режим защиты от записи (read-only). Для этого в линуксе предусмотрена возможность перемонтирования ФС: mount -o ro,remount /. Команда закономерно не сработала, ядро блокировало выполнение команды с ошибкой mount: / is busy. После некоторого гугления нашлась причина: многие файлы были открыты демонами. На сервере мне пришлось остановить ntp, apache2, mysql, rsyslogd (возможно, я что-то пропустил, но список запущенных процессов можно посмотреть командой htop или top).

# invoke-rc.d ntp stop
# invoke-rc.d apache2 stop
# invoke-rc.d mysql stop
# invoke-rc.d rsyslogd stop
# mount -o ro,remount /
# touch /test
touch: cannot touch `/test': Read-only file system

3. Создание и передача образа

Для создания образа я воспользовался программой dd. Также я воспользовался конвейером данных и направил их через программу сжатия gzip в файл, расположенный в папке, которая смонтирована на удалённый сервер.

# dd if=/dev/xvda bs=64K | gzip -c > /mnt/vasya/xvda.raw.gz

Через полтора часа я имел у себя на сервере файл /home/vasya/xvda.raw.gz с нужным мне образом. Коэффициент сжатия оказался неплохим: 8.5/12.

4. Подключение образа к новой виртуальной машине

На локальном железе я использую Proxmox VE 3.1. Я создал виртуальную машину со следующей конфигурацией:

balloon: 256
bootdisk: virtio0
cores: 2
ide2: nfs-da:iso/debian-7.2.0-amd64-netinst.iso,media=cdrom,size=222M
memory: 768
name: pupkin
net0: virtio=26:95:81:17:D9:14,bridge=vmbr0
ostype: l26
sockets: 1
virtio0: nfs-da:143/vm-143-disk-1.raw,format=raw

Файл образа виртауальной машины я, конечно, разархивировал и положил в нужное место с нужными правами доступа (/mnt/nfs — это раздел, сконфигурированный как хранилище Proxmox VE, 143 — идентификатор новой виртуалки):

# zcat /home/vasya/xvda.raw.gz > /mnt/nfs/images/143/vm-143-disk-1.raw
# chown nobody:nogroup /mnt/nfs/images/143/vm-143-disk-1.raw

По своей неопытности я предвкушал победу, но не тут-то было: загрузчик Grub выпадал в свою консоль. Более того, попытки загрузиться вручную были обречены на провал: в полученном образе отсутствовал инициализатор окружения initrd, а ядро было узкоспециализированным и не содержало драйверов для virtio устройств (сеть и жёсткий диск). Опытные специалисты могут меня дополнить и объяснить, как сконфигурирована загрузка Linux в среде XEN, мне до этого не было дела, у меня уже зарождался новый план: нужно положить на образ ядро linux, его драйверы и initrd от работающей виртуальной машины с похожей операционкой.

5. Исправление загрузчика

У меня была рабочая виртуалка, к которой я добавил новый диск, а затем удалил его образ с файловой системы и заменил его симлинком на сломанный образ. Предварительно я, конечно, выключил виртуалку 143, чтобы образ случайно не открыли 2 процесса одновременно.

# rm /mnt/nfs/images/200/vm-200-disk-2.raw
# ln -s /mnt/nfs/images/143/vm-143-disk-1.raw /mnt/nfs/images/200/vm-200-disk-2.raw

Я загрузил виртуалку 200, смонтировал ФС сломанного образа и скопировал туда ядро linux, рабочий загрузчик и драйверы устройств.

# mkdir /mnt/vdb1
# mount /dev/vdb1 /mnt/vdb1
# cp /boot/vmlinuz-3.2.0-4-amd64 /mnt/vdb1/boot/vmlinuz-3.2.0-4-amd64 
# cp /boot/initrd.img-3.2.0-4-amd64 /mnt/vdb1/boot/initrd.img-3.2.0-4-amd64
# cp /boot/System.map-3.2.0-4-amd64 /mnt/vdb1/boot/System.map-3.2.0-4-amd64
# cp -r /lib/modules/3.2.0-4-amd64 /mnt/vdb1/lib/modules

Я выключил 200, включил 143 и ввёл команды ручной загрузки Grub:

grub> root (hd0,msdos1)
grub> linux /boot/vmlinuz-3.2.0-4-amd64 root=/dev/vda1
grub> initrd /boot/initrd.img-3.2.0-4-amd64
grub> boot

Система загрузилась и даже успешно стартовала mysql и apache2. Мне, конечно, пришлось поправить /etc/network/interfaces, чтобы система вышла в локальную сеть и смогла общаться с маршрутизатором и сетью Интернет.

На полноценно работающей машине дальше уже не возникало проблем: я запустил установку grub и установил ядро linux из репозитория, чтобы выпрямить загрузчик окончательно и следовать debian-way:

# grub-install /dev/vda
# apt-get update
# apt-get install linux-image-2.6.32-5-486
# reboot

Вывод

В результате всех манипуляций я получил виртуальную машину, почти идентичную исходной, но работающую в среде Proxmox VE с гипервизором KVM и не требующую специального загрузчика. Образ планируется передать клиенту для запуска в кластере VMware ESX.

Автор: ujifgc

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js