Потребовалось сделать перенос виртуальной машины c OS CentOS 6 (OpenVZ CT) на ноду с KVM. Ранее переносили виртуалку с Ubuntu 16 — сложности возникли, но справились довольно быстро. А вот с CentOS 6 появились проблемы…
Все знают — хорошее быстро заканчивается. В том числе и поддержка ОС CentOS 6 истекла в ноябре 2020. Соответственно, репозитории mirror.centos.org переехали на vault.centos.org. Для нас эта информация очень важна, так как нам нужно будет установить ядро для виртуалки.
По сути переезд с одного типа виртуализации на KVM или выделенный сервер, по сути, сводится всего к нескольким пунктам:
- перенос файлов виртуальной машины
- установка ядра гостевой системы
- установка загрузчика
- исправление fstab
- изменение настроек сети
Первый пункт плана проблем не вызывает: создается новая машина на ноде с KVM, на ноде с OpenVZ выключаем виртуалку, затем монтируем ее и переносим файлы:
# На источнике - ноде с OpenVZ
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 kernel.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 kernel.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. При необходимости поможем с переездом на наши серверы от других провайдеров.