Переезд виртуалки c CentOS 6 из OpenVZ в KVM

Потребовалось сделать перенос виртуальной машины c OS CentOS 6 ( CT) на ноду с KVM. Ранее переносили виртуалку с 16 — сложности возникли, но справились довольно быстро. А вот с появились проблемы…

Все знают — хорошее быстро заканчивается. В том числе и поддержка ОС CentOS 6 истекла в ноябре 2020. Соответственно, репозитории mirror.centos.org переехали на vault.centos.org. Для нас эта информация очень важна, так как нам нужно будет установить ядро для виртуалки.

По сути переезд с одного типа виртуализации на KVM или выделенный сервер, по сути, сводится всего к нескольким пунктам:

  • перенос файлов виртуальной машины
  • установка ядра гостевой системы
  • установка загрузчика
  • исправление fstab
  • изменение настроек сети

Первый пункт плана проблем не вызывает: создается новая машина на ноде с KVM, на ноде с выключаем виртуалку, затем монтируем ее и переносим файлы:

# На источнике - ноде с 
prlctl stop CT1
prlctl mount CT1
# Смотрим, что получилось:
mount | grep vz
/dev/md2 on /vz type ext4 (rw,noatime,lazytime,data=ordered)
/dev/ploop13775p1 on /vz/root/89e81c92-2ca6-4321-9869-6aa1c2fc895d type ext4 (rw,relatime,data=ordered,balloon_ino=12)

Видим путь и ID исходной машины —

ID: 89e81c92-2ca6-4321-9869-6aa1c2fc895d
SOURCE PATH: /vz/root/89e81c92-2ca6-4321-9869-6aa1c2fc895d

Забегая вперед скажу: на созданной в KVM машине грузимся в LiveCD CentOS 6 или другой ОС со старым ядром. Иначе нельзя будет сделать chroot в перенесенную ОС CentOS 6. Будет появляться сообщение:

 segmentation fault  chroot /mnt /bin/bash

В LiveCD создаем раздел, форматируем и монтируем диск:

fdisk /dev/sda
mkfs.ext3 /dev/sda1
mount /dev/sda1 /mnt

Копируем файлы на новую машину одной командой:

rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} IP_OpenVZ:/vz/root/89e81c92-2ca6-4321-9869-6aa1c2fc895d/ /mnt

Первый пункт завершен успешно. Но самое веселое еще впереди. Пункт 2: для установки ядра в гостевую ОС нам потребуется сделать chroot и накатить ядро. Но здесь нас ждет неудача — репозитории не хотят скачиваться — их не существует уже. И curl к тому же валится сс сообщением:

PYCURL ERROR 77 - "Problem with the SSL CA cert (path? access rights?)

Поэтому, если у вас, как и у меня LiveCD CentOS 6, можно накатить ядро так:

# Меняем репозитории base и epel на vault в LiveCD
curl https://www.getpagespeed.com/files/centos6-eol.repo --output /etc/yum.repos.d/CentOS-Base.repo
curl https://www.getpagespeed.com/files/centos6-epel-eol.repo --output /etc/yum.repos.d/epel.repo

# Устанавливаем ядро и заголовки
yum install .x86_64  -c /etc/yum.repos.d/CentOS-Base.repo --installroot=/mnt
yum install kernel-headers.x86_64  -c /etc/yum.repos.d/CentOS-Base.repo --installroot=/mnt

Другой способ установки гостевого ядра, который тоже работает. Можно сделать chroot после монтирования /proc /sys и /dev:

mount /dev/sda1 /mnt
mount --bind /proc /mnt/proc
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
chroot /mnt 
# В таком случае все работает прямо на гостевой ОСи без проблем:
yum install .x86_64
yum install kernel-headers.x86_64
yum install dracut

Не забываем про генерацию initramfs:

# У меня в  гостевой ОС установилось ядро 2.6.32-754.35.1
# Поэтому ставим именно его:
dracut -f /boot/initramfs-2.6.32-754.35.1.el6.x86_64.img 2.6.32-754.35.1.el6.x86_64

Переходим к пункту 3. Здесь было много всего сделано, в частности — безуспешные попытки завести grub 0.какой то версии. Поэтому было принято решение его удалить и собрать из сырцов grub 2. Для этого в гостевой ОСи устанавливаем компилятор, удаляем grub и злодействуем:

# Установка компилятора
yum -y install gcc bison flex make
# Качаем исходники отсюда:
# http://ftp.gnu.org/gnu/grub/
wget http://ftp.gnu.org/gnu/grub/grub-2.04.tar.gz
tar xf grub-2.04.tar.gz
cd grub-2.04
# Компилируем и ставим:
./configure
make
make install
# Создаем конфиг grub2 для CentOS
/usr/local/sbin/grub-mkconfig -o /boot/grub/grub.cfg
/usr/local/sbin/grub-install /dev/sda
# Жестоко удаляем  grub
yum -y remove grub

У нас еще пара пунктов:

# Исправляем fstab: vim /etc/fstab

/dev/sda1 /  ext3 errors=remount-ro 0       1

# Исправляем конфиг сети - у нас виртуалки получают IP по dhcp
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
NAME="System eth0"

На этом, по сути — все. Можно все отмонтировать в новой виртуалке и попробовать загрузиться. По идее, если все сделано без ошибок, должно взлететь и работать.. Но это не точно..

И в заключении: действительно отличная новость! Беспрецедентный тариф на виртуалки — от 90 рублей предлагает компания vps-server.ru. При необходимости поможем с переездом на наши серверы от других провайдеров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *