Конвертация Proxmox в VDI образ для VirtualBox

Итак, есть реальный проект на Centos 6.6, который работает как виртуальная машина quemu внутри Proxmox. Его нужно преобразовать в VDI образ, чтобы запустить внутри VirtualBox и использовать Vagrant. Самая большая сложность - огромный размер образа - 267 Гб. Все образы хранятся как LVM.

Все, что я делал, описано ниже.

Подготовка машины

Скопировал site.dev.local средствами Proxmox и немного донастроил (смена IP, убрал монтирование подкачки и сетевых шар). Убедился, что эта новая «машинка» работает.

Затем удалил кучу файлов - логи, rar/zip архивы, и так далее. Удалил лишние базы данных. Пересоздал базу данных с целью уменьшения размера файла ibdata1, подробности тут

А так уменьшал базу данных путем удаление старых записей:

DELETE FROM b_sale_basket WHERE ID < 12000000;
DELETE FROM b_sale_basket_props WHERE BASKET_ID < 12000000;
DELETE FROM b_sale_order WHERE ID < 800000;
DELETE FROM b_sale_order_change WHERE ORDER_ID < 800000;
DELETE FROM b_sale_order_props_value WHERE ORDER_ID < 800000;

Теперь данных на диске стало кардинально меньше: 200G => 21G.

Все действия я записывал через

script -a /var/tmp/shrink

Поэтому понять, что именно я делал, можно через less /var/tmp/shrink в полученном образе vagrant-shrink.

Уменьшение размера файловой системы

Данных стало меньше, но есть еще две связанные проблемы - остались прежними размер файловой системы и размер диска (267 Гб). Так как дальше я скачивал образы разделов, из которых создал новый диск, шринкать диск не нужно.

Сначала я попробовал воспользоваться средствами машинки. Люди пишут, что у parted есть resizepart, но опция появилась в версии 3.1. У нас же версия 2.1 для CentOS 6.6, которая больше не поддерживается. Поэтому обновиться не получится. Можно пересобрать, но это муторно. Также придется решать проблему размонтирования корневой файловой системы. Я пошел другим путем.

Я вошел на машину Proxmox и скачал Live CD с новой CentOS 7.8:

cd /var/lib/vz/template/iso/
wget http://mirror.truenetwork.ru/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-LiveGNOME-2003.iso

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

Дальше через parted можно сделать ресайз. Вот картинка до:

и после:

Конвертация Proxmox в VDI

Наконец, надо превратить образ диска в виртуалбоксовский - для использования в вагранте.

Загрузившись с Live CD, через parted я экспортировал разделы в img-файл: нажал на шестеренки, затем Create Partition Image.

Бут-партицию я также сжал с 512 до 256 Мб. Получилось два файла, которые я записал на отдельный диск, и затем скачал на свою систему:

  • boot.img - загрузочный раздел
  • base.img - система

Дальнейшие действия я проводил в своей ОС Ubuntu.

Я отвел 40 Гб под будущий образ:

fallocate -l 40G dest.img

Через fdisk разметил разделы:

fdisk dest.img
n
p
1
2048
513807 (тут я немного накинул на всякий случай)
 
n
p
2
514048 (по-умолчанию)
83886079 (по-умолчанию)
 
p
Устр-во    Загрузочный  Start Конец Секторы   Size Id Тип
dest.img1  *             2048   513807   511760 249,9M 83 Linux
dest.img2              514048 83886079 83372032  39,8G 83 Linux
w

Подмонтировал:

losetup -f --show dest.img
# получилось /dev/loop6
kpartx -a /dev/loop6

потом скопировал разделы:

dd if=boot.img of=/dev/mapper/loop6p1 conv=notrunc
dd if=base.img of=/dev/mapper/loop6p2 conv=notrunc

После этого нужно восстановить grub.

Восстановление grub на своей ОС (не удачно)

Сначала я попробовал это сделать на своей ОС, но конечный вариант, который сработал, я сделал внутри VBox, загрузившись с Live CD (описано в другом пункте, чуть ниже).

Подмонтировал (если уже смонтировано, то не надо):

losetup --partscan dest.img
# получилось /dev/loop6
kpartx -a /dev/loop6

Затем

sudo su
cd /mnt
mkdir ./boot
mount /dev/loop6 ./boot
grub-install --recheck --boot-directory=./boot /dev/loop6
# Установка для платформы i386-pc.
# Установка завершена. Ошибок нет.
 
resize2fs /dev/mapper/loop6p1
# The filesystem on /dev/mapper/loop6p1 is now 63970 (4k) blocks long.
 
kpartx -r /dev/loop6
# loop6p1 : 0 511760 /dev/loop6 2048
# loop6p2 : 0 83372032 /dev/loop6 514048
 
losetup --detach /dev/loop6

После загрузки с такого образа (VDI), система проваливается в загрузчик grub: grub >. Я думаю, такое происходило из-за отсутствия файла grub.conf, который я удалил в процессе эксперимента или потому что диск sda3 после переразбиения стал sda2.

Восстановление grub c Live CD

У меня был образ диска (VBoxManage convertdd dest.img dest.vdi), но система с него не грузилась. Тогда я загрузился с LiveCD внутри VBox и с этим диском произвел такие манипуляции:

mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot
mount --bind /dev /mnt/dev; mount --bind /sys /mnt/sys; mount --bind /proc /mnt/proc
chroot /mnt /bin/bash

Затем grub-install --recheck /dev/sda; resize2fs /dev/sda1. Установщик вывел предупреждение, что нет /dev/sda3 (там раньше была система, теперь это /dev/sda2). При перезагрузке выводится экран grub:

(Добро пожаловать в Граб версии 0.97 ... нажмите Tab для списка команд)
grub >

Нажимая cd / + Tab я понял, что там каталог /grub и файлы /initramfs-..., vmlinuz-2.6... - то есть /boot, а корневой файловой системы нет.

Тогда я еще раз загрузился с LiveCD и отредактировал файл /etc/mtab, в котором заменил монтирование корня /dev/sda3 на /dev/sda2, затем снова grub-install --recheck /dev/sda; resize2fs /dev/sda1, и эта команда больше не выводила предупреждение.

Система по-прежнему не загружалась. Наконец, я понял в чем дело, и создал конфигурационный файл /boot/grub/grub.conf, поместив в него прежнее содержимое, которое ранее удалил в экспериментах (удалял полностью /grub).

Ура! Система загрузилась внутри виртуалбокса:

Тупиковый путь конвертации lzo в VDI

Ссылки

Печать/экспорт