Миграция ОС в OpenVZ контейнер

В данной заметке я хочу рассказать как просто перенести Linux систему с физического сервера или полной виртуализации (KVM,XEN,VMware) в контейнер OpenVZ. По данной теме достаточно материалов, но я расскажу о самом простом способе. Для начала немного теоретических выкладок. Какие основные плюсы можно получить от контейнерной виртуализации: Минимальные накладные расходы на виртуализацию Прозрачность файловой системы контейнера с хост машины Высокая скорость загрузки контейнера Простота живой миграции

Но также есть и минусы: Контейнер виртуализации использует ядро хост системы В стандартные ядра популярных Linux дистрибутивов OpenVZ-патчи не входят

Мне понадобилось преобразовать виртуальную машину VMware с CentOS5. Конкретно меня заинтересовал проект VirtualPBX, нужная связка для его работы настраивается достаточно непросто, но автор проекта выкладывает VMware образ для быстрого развертывания, образ базируется на CentOS 5. Итак, для начала скачиваем и запускаем образ VirtualPBX с помощью VMware player, работает все отлично, но для постоянной работы мне не удобно использовать VMware образ. В моем распоряжении находится несколько серверов Proxmox VE 2.1 с KVM,OpenVZ виртуализацией и web-based управлением. Поэтому, недолго думая, приступаем к переносу VirtualPBX из VMware образа в контейнер OpenVZ. Для переноса ОС воспользуемся tar методом, в идеале лучше использовать для этого rsync. На хосте с Proxmox скачаем шаблон для CentOS 5 и создадим СT контейнер с использованием данного шаблона, задав нужные вам параметры! Запускаем созданный контейнер и проверяем его работу (подключением через ssh или к консоли контейнера через web интерфейс Proxmox), далее остановим его и перейдем на машину, которую нужно перенести. Данные действия можно выполнить и из консоли Proxmox без использования web интерфейса. На физической (VMware образе в моем случае) машине создаем файл с исключением каталогов и файлов для tar архивирования:

#nano non_tar
.bash_history 
lost+found 
/dev/* 
/mnt/* 
/tmp/* 
/proc/* 
/sys/* 
/usr/src/* 
/etc/shadow 
/etc/inittab 
/etc/mtab 
/etc/rc.sysinit 
/etc/fstab 
/etc/sysconfig/network 
/etc/modprobe.d/blacklist 
/etc/resolv.conf
/etc/sysconfig/network-scripts/*

Далее архивируем корень операционной системы, исключая директории и файлы из созданного ранее списка:

tar --numeric-owner -czvf /tmp/virtualPBX_6309.tar.gz -X /root/non_tar /

Копируем полученный архив через ssh на хост машину виртуализации (Внимание: копируется именно на хост машину, а не в контейнер):

scp virtualPBX_6309.tar.gz root@IP_OpenVZ_Host:/tmp

Подключаемся на хост машину по ssh и переходим в каталог, где находится наша развернутая из шаблона CentOS 5 /var/lib/vz/private/100, где 100 — уникальный идентификатор OpenVZ виртуалки, соответственно у Вас, скорее всего, будет другой.

cd /var/lib/vz/private/100

И разворачиваем наш архив поверх шаблона (убедитесь, что вы находитесь в директории недавно развернутого шаблона, чтобы не перезаписать корневой раздел хост машины или другого OpenVZ контейнера):

tar xvpfz /tmp/virtualPBX_6309.tar.gz

В принципе, на этом этапе можно запустить наш контейнер и насладиться работой OC под OpenVZ c вашими настройками. Заметки на полях: Для интереса попробовал развернуть на шаблон CentOS 6, но виртуалка работала не совсем корректно, особо разбираться не стал, так как обычно предпочитаю использовать debian-based дистрибутивы.

Приведенный способ очень прост, а если использовать для копирования rsync, то можно перенести ОС почти в реальном времени с минимальным простоем. Хотелось бы еще сказать пару слов об обновлении VirtualPBX. Так как в образе содержатся не последние сборки проекта, сделаем маленький скрипт для обновления:

touch /usr/bin/virtualpbx 
chmod +x /usr/bin/virtualpbx 
nano /usr/bin/virtualpbx

Добавим следующий код:

#!/bin/sh 
read -p 'Введите номер-версию для обновления (например: 6446):' REPLY 
wget http://virtual-pbx.googlecode.com/files/VirtualPBX-$REPLY.tgz && echo "Загрузка успешно" || echo 
"Загрузка не удалась, возможно, введен неправильный номер сборки или поменялся метод  нумерации проекта" 
 if [ -f VirtualPBX-$REPLY.tgz ]; then
    tar -xzf VirtualPBX-$REPLY.tgz 
    rm -f VirtualPBX-$REPLY.tgz 
    cd VirtualPBX-$REPLY 
     rpm -Fvh *.rpm
if [ $? -eq 0 ]; then 
    echo "Обновление успешно!!!" 
else
    echo "Обновление завершилось неудачно!!!" 
exit 1 
  fi 
exit 0
   else
    echo "Обновление завершилось неудачно!!!"</li>
   fi
exit 1

Теперь для обновления достаточно дать команду

virtualpbx

и ввести нужный номер ревизии для установки. Уже после написания черновика для статьи, узнал что автор предусмотрел проверку обновлений. Внутри есть скрипт /opt/VirtualPBX/contrib/utils/check_updates.pl, раз в сутки он проверяет наличие обновлений и если находит апдейт, то в админском интерфейсе появляется красная надпись в верху.

Описанным выше методом можно перенести и другие дистрибутивы Linux, изменяя список файлов и каталогов специфичных для ОС (в моем примере файл non_tar), примеры настроек для переноса можно посмотреть на Wiki. Удачных вам экспериментов!

Материалы использовавшиеся для подготовки статьи: tdev.me/2011/02/create-trixbox-2-8-template-for-openvz/ wiki.openvz.org/Creating_a_CentOS_5.0_Template (http://wiki.openvz.org/Creating_a_CentOS_5.0_Template)