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


Зачастую бывает так: имелся некий сервер на который добавляли добавляли добавляли функциональности, а потом хочется преобразовать этот сервер в несколько 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

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

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

  • установить ssh-сервер
  • настроить сетевую карту на выбранный IP/способ подключения к сети (параметры можно поглядеть в текущей хостовой системе)
  • grub настроить на однократную загрузку в новое ядро (число 3 в последующем примере — номер (начиная от 0) записи в menu.lst grub-а):

 

# grub > savedefault --default=3 --once
  • Разрешить по ssh заходить root’ом (либо создать еще и пользователя для новой хостовой OS

Более подробно о такой установке смотри в 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: большинство OS нынче использует механизмы навроде udev для создания устройств в этой директории
  • в гостевой системе не нужно старое содержимое /etc/fstab, поскольку оно ссылается на реальные девайсы, которые при переходе от хоста к гостю стали не нужны
  • в гостевой системе не нужно запускать udev
  • в гостевой системе не будет правильно отображаться перечень смонтированных директорий (в частности директория /)

Первую проблему легко решить взяв директорию /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, управление часами итп (внимательно изучите логи в гостевой системе и вы увидите что у вас «лишнее»).