четверг, 5 марта 2015 г.

Боевая миграция CentOS с KVM (DigitalOcean) в OpenVZ-контейнер

Возникла задача мигрировать несколько виртуалок (дроплетов) с 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
    
    Примечание: a.b.c.d - IP-адрес дроплета, $CID - номер OpenVZ-контейнера, опция -H нужна чтобы копировать хардлинки как хардлинки, -X сохраняет расширенные атрибуты.
    Примечание: если на дроплете, помимо корневой файловой системы есть дополнительные файловые системы, для них надо запускать отдельно 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
      
  • Перегружаемся.

В зависимости от конфигурации, предложенных выше действий может оказаться недостаточно для полной работоспособности контейнера. Вот на что следует обратить внимание:
  • У некоторых сервисов может быть жесткая привязка ко старому IP-адресу. Если таковая привязка имеется - то убрать ее либо заменить на новый IP-адрес. В большинстве случаев достаточно просмотреть директорию /etc:
    egrep -R a.b.c.d /etc/
    
  • В CentOS-7 контейнере после переноса на заработал ping даже из под root. Все это оказалось из-за механизма linux capabilities. Чтобы найти все файлы, на которые "навешаны" capabilities, необходимо выполнить:
    getcap -r / 2>/dev/null
    
    и потом для каждого из них командой setcap удалить capabilities.

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

  • Если у нас в дроплете настраиваются дополнительные сетевые интерфейсы, например, PPP, то их надо будет дополнительно настроить.

Комментариев нет:

Отправить комментарий