Возникла задача мигрировать несколько виртуальных серверов (дроплетов) с DigitalOcean на один физический сервер под управлением Proxmox и изменить тип виртуализации на OpenVZ.
Таким образом будет экономятся часть ресурсов, поскольку у нас будет одно ядро на все контейнеры, так же процесс миграции проще. На дроплетах установлены CentOS 6 либо 7 версий. Описанные далее шаги целиком опираются на официальную вику OpenVZ с некоторыми дополнениями.

  • Создаем в Proxmox новый контейнер. В качестве шаблона берем minimal версии CentOS – отдельно для 6 и 7 версий. Взять их можно отсюда.
  • Создаем файл с исключениями того, что там не надо копировать с дроплета. В нашем случае он получился таким:

[bash]
cat /root/exclude.txt
/tmp
/boot
/lib/modules
/etc/blkid
/etc/mtab
/etc/lvm
/etc/fstab
/etc/udev
/etc/inittab
/etc/rc.digitalocean
/etc/sysconfig/network
/etc/sysconfig/network-scripts
/etc/sysctl.conf
/etc/sysctl.d
/etc/rc.sysinit
/usr/lib/sysctl.d
[/bash]

  • Останавливаем все лишние сервисы на дроплете. По хорошему оставить запущенным только sshd.
  • На сервере Proxmox запускаем rsync:

 

[bash]
rsync -avz -H -X –one-file-system –numeric-ids –exclude-from=/root/exclude.txt \
-e ssh root@a.b.c.d:/ /var/lib/vz/private/$CID
[/bash]

Примечание: a.b.c.d – IP-адрес дроплета, $CID – номер OpenVZ-контейнера, опция -H нужна чтобы копировать хардлинки как хардлинки, -X сохраняет расширенные атрибуты.
Примечание: если на дроплете, помимо корневой файловой системы есть дополнительные файловые системы, для них надо запускать отдельно rsync, например, в случае /home:

[bash]
rsync -avz -H -X –one-file-system –numeric-ids –exclude-from=/root/exclude.txt \
-e ssh root@a.b.c.d:/home/ /var/lib/vz/private/$CID/home/
[/bash]

Запускаем контейнер и заходим в него:

[bash]
vzctl enter $CID
[/bash]

Отключаем лишние сервисы:

  • Для CentOS 7 у меня получился следующий список:

[bash]
systemctl mask irqbalance
systemctl mask auditd
systemctl mask digitalocean-rc-local
systemctl mask NetworkManager
systemctl mask cloud-config
systemctl mask cloud-final
systemctl mask cloud-init-local
systemctl mask cloud-init
systemctl mask kdump
systemctl mask iprdump
systemctl mask iprinit
systemctl mask iprupdate
systemctl mask tuned
systemctl mask avahi-daemon
systemctl mask microcode
systemctl mask plymouth-start
systemctl mask firewalld
[/bash]

  • Для CentOS 6:

[bash]
chkconfig auditd off
chkconfig lvm2-monitor off
chkconfig ntpdate off
chkconfig blk-availability off
chkconfig iscsi off
chkconfig iscsid off
chkconfig mdmonitor off
chkconfig netfs off
chkconfig iptables off
chkconfig ip6tables off
chkconfig modules_dep off
chkconfig udev-post off
[/bash]

Перегружаемся.

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

Вот на что следует обратить внимание:

  • У некоторых сервисов может быть жесткая привязка к старому IP-адресу. Если таковая привязка имеется – то убрать ее либо заменить на новый IP-адрес. В большинстве случаев достаточно просмотреть директорию /etc:

[bash]
egrep -R a.b.c.d /etc/
[/bash]

  • В CentOS-7 контейнере после переноса не заработал ping даже из под root. Все это оказалось из-за механизма linux capabilities. Чтобы найти все файлы, на которые “навешаны” capabilities, необходимо выполнить:

[bash]
getcap -r / 2>/dev/null
[/bash]

и потом для каждого из них командой setcap удалить capabilities.

  • Если у нас был настроен демон firewalld, то в контейнере он работать не будет из-за привязке к ebtables – в таком случае все его правила надо перенести в хост-систему.
  • Если у нас в дроплете настраиваются дополнительные сетевые интерфейсы, например, PPP, то их надо будет дополнительно настроить.