Возникла задача мигрировать несколько виртуальных серверов (дроплетов) с 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, то их надо будет дополнительно настроить.