OpenVZ: Миграция основной системы в гостевую

Данная статья написана как приложение к статье OpenVZ.

Зачастую бывает так: имелся некий сервер на который добавляли добавляли добавляли функциональности, а потом хочется преобразовать этот сервер в несколько VZ-нод. Можно пойти по пути миграции его на VZ ядро с последующей постепенной миграцией сервисов в новые VZ ноды. Однако в некоторых случаях может быть необходимо установить новую хостовую систему а текущую хостовую сделать одной из гостевых (например мы имеем какое-то нестандартное, установленное не из пакетов, ПО в /usr/local или /opt или другие причины). Хостовую систему можно спокойно разместить в VZ-ноде, проделав некоторые преобразования над ней. Будем считать что у нас имеется свободный раздел на несколько гигабайт (как показывает практика одного-двух вполне достаточно) для установки новой хостовой OS.

Допустим сейчас хостовая система у нас стоит в разделе /dev/sda1, свободный раздел у нас /dev/sda2.

Форматируем и монтируем этот раздел:

# mkfs.ext3 /dev/sda2
# mkdir /debian
# mount /dev/sda2 /debian

Устанавливаем Debian в этот раздел, попутно делая копию получившегося /dev (понадобится позднее):

# debootstap lenny /debian
# cd /debian
# tar -czvf ~/dev.tgz dev

прописываем в fstab новой системы директории для монтирования:

/dev/sda2 / ext3 defaults 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc  defaults 0 0

доустанавливаем ядро в гостя:

# chroot /debian /bin/bash
# echo do_initrd = yes >> /etc/kernel-img.conf
# apt-get install linux-image-2.6-openvz

прописываем новое ядро в grub

title VZ
        root (hd0,0)
        kernel /vmlinuz-2.6.26-2-openvz-amd64 root=/dev/sda2
        initrd /initrd.img-2.6.26-2-openvz-amd64

назначаем пароль root:

# chroot /debian
# passwd root

и можем перегрузиться в новый хост.

Если все эти действия мы делали удаленно, то необходимо будет перед перезагрузкой выполнить следующие действия:

# grub
> savedefault --default=3 --once

Более подробно о такой установке смотри в FAQ.

После того как новая хостовая система у нас готова и работает, можно перейти к вопросу создания VZ-ноды для нее.

Монтируем старую OS в каталог (например) /srv/old-server, прописав в fstab:

/dev/sda1 /srv/old-server ext3 defaults 0 0

и выдав команды

mkdir /srv/old-server
mount /srv/old-server

Создаем конфиг-файл для новой ноды, аналогично тому, как было описано выше.

Теперь в зависимости от того какая у нас была хостовая система прописываем директиву

OSTEMPLATE="centos"
или
OSTEMPLATE="debian"

и можем попробовать запустить систему не забыв прописать в том же конфиге где она находится:

VE_PRIVATE="/srv/old-server"

И при первом запуске у нас скорее всего возникнут проблему (проблемы с лимитами ресурсов тут не рассматриваем, они рассмотрены выше). Проблемы возникнут скорее всего следующего характера:

Первую проблему легко решить взяв директорию /dev из дерева, созданного debootstrap (помните мы сохранили архив этого каталога?), либо вручную создав нужный набор устройств: ptmx, ttyp, ptyp, null, urandom, и каталог pty.

Вторая проблема решается редактированием fstab в будущем госте:

devpts /dev/pts  devpts  defaults  0 0
sysfs  /sys      sysfs   defaults 0 0
proc   /proc     proc    defaults 0 0

Третья проблема решается для Debian простым удалением пакета udev в госте:

# chroot /srv/old-server
# apt-get remove udev

В случае Centos/RedHat нужно открыть на редактирование файл /etc/rc.sysinit и закоментировать строку /sbin/start_udev, для других систем смотри описание работы в них.

Последняя проблема решается созданием симлинка /etc/mtab -> /proc/mounts

Все. Кроме лимитов ресурсов больше нет ограничений на запуск старой хостовой системы в качестве гостевой.

Так же как и в случае выше, в гостевой системе не нужны процессы getty, отредактировав inittab их можно отключить вышеописанным способом (это можно уже сделать изнутри новой гостевой системы).

Не забудьте так же удалить из новой гостевой системы ставшие ненужными сервисы/демоны, которые завязаны на "железо", как-то smartd, управление часами итп (внимательно изучите логи в гостевой системе и вы увидите что у вас "лишнее").