Содержание
Конвертация 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
).
Ура! Система загрузилась внутри виртуалбокса: