Возникла задача мигрировать несколько виртуалок (дроплетов) с DigitalOcean на один сервер под управлением Proxmox и изменить тип виртуализации на OpenVZ. Так будут экономятся часть ресурсов, поскольку у нас будет одно ядро на все контейнеры, да и переносить так проще. На дроплетах установлены CentOS 6 либо 7 версий. Описанные мною шаги целиком опираются на официальную вику OpenVZ с некоторыми дополнениями.
В зависимости от конфигурации, предложенных выше действий может оказаться недостаточно для полной работоспособности контейнера. Вот на что следует обратить внимание:
- Создаем в Proxmox новый контейнер. В качестве шаблона берем minimal версии CentOS - отдельно для 6 и 7 версий. Взять их можно отсюда.
-
Создаем файл с исключениями того, что там не надо копировать с дроплета. В моем случае он получился таким:
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
- Останавливаем все лишние сервисы на дроплете. По хорошему оставить запущенным только sshd.
-
На сервере Proxmox запускаем rsync:
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
Примечание: если на дроплете, помимо корневой файловой системы есть дополнительные файловые системы, для них надо запускать отдельно rsync, например, в случае /home:
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/
-
Запускаем контейнер и заходим в него:
vzctl enter $CID
-
Отключаем лишние сервисы:
-
Для CentOS 7 у меня получился следующий список:
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
-
Для CentOS 6:
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
-
Для CentOS 7 у меня получился следующий список:
- Перегружаемся.
В зависимости от конфигурации, предложенных выше действий может оказаться недостаточно для полной работоспособности контейнера. Вот на что следует обратить внимание:
-
У некоторых сервисов может быть жесткая привязка ко старому IP-адресу. Если таковая привязка имеется - то убрать ее либо заменить на новый IP-адрес. В большинстве случаев достаточно просмотреть директорию /etc:
egrep -R a.b.c.d /etc/
-
В CentOS-7 контейнере после переноса на заработал ping даже из под root. Все это оказалось из-за механизма linux capabilities. Чтобы найти все файлы, на которые "навешаны" capabilities, необходимо выполнить:
getcap -r / 2>/dev/null
- Если у нас был настроен демон firewalld, то в контейнере он работать не будет из-за привязке к ebtables - в таком случае все его правила надо перенести в хост-систему.
- Если у нас в дроплете настраиваются дополнительные сетевые интерфейсы, например, PPP, то их надо будет дополнительно настроить.