Я пытаюсь клонировать образ виртуального диска довольно ручным способом. Обзор моей методологии до сих пор выглядит следующим образом:
- Создайте виртуальную машину в VirtualBox с жестким диском на 120 ГБ (размер гипервизора и жесткого диска не имеет значения, в основном они включены для полноты и согласованности с остальной частью моего вопроса, например с размерами разделов)
- Установите Ubuntu 12.04.3 на виртуальной машине
- Закрыть виртуальную машину
- Подключить виртуальный жесткий диск, связанный с виртуальной машиной
- Извлечение файлов операционной системы и данных для хранения в каталоге
- Сохранить метаданные виртуального жесткого диска
- Создайте свежий виртуальный диск и восстановите разделы и загрузочную информацию из (6)
- Восстановите данные из (5) в правильный раздел
Эта проблема
Моя дублированная виртуальная машина не загружается. Grub, кажется, копирует, и, кажется, подтверждает мой корневой раздел (с установленной на нем Ubuntu). Я могу один раз пройти мимо Grub и получить фиолетовый экран, как будто Ubuntu вот-вот загрузится. Тогда это останавливается. После этого я могу загрузиться в Grub, выбрать свою ОС, затем я получаю мигающий курсор командной строки. Нет возможности ввода. Я подозреваю, что в процессе клонирования чего-то не хватает (подробнее см. Ниже). Примечание: я использую grub2, а не legacy.
Почему вы это делаете?
Как часть договорного требования, мне нужно хранить виртуальный диск в системе контроля версий. Наличие огромного двоичного двоичного объекта (виртуального диска) в управлении версиями является проблемой, в основном для clone (git)/checkout (svn), но также и для diff-файлов. Я рассмотрел возможность сжатия в несколько файлов, но мне нужно иметь возможность манипулировать ОС / данными, извлеченными в (5) выше. Обратите внимание, что моему хранилищу VCS по-прежнему нужна вся информация, необходимая для создания полной виртуальной машины.
подробность
Подробные инструкции по воспроизведению того, что я описал:
- Создайте виртуальную машину и загрузите Ubuntu Live CD
- Выберите "Попробуйте Ubuntu"
- Откройте терминал
- Создайте раздел msdos: sudo parted /dev /sda mklabel msdos
- Создайте файл подкачки объемом 2 ГБ: sudo parted /dev /sda mkpart, основной linux-swap 2048s 4198399s
- Используйте остаток диска для корневого раздела: sudo parted /dev /sda mkpart primary ext4 4198400s 100%
- Перезагрузите машину, выберите "Установить Ubuntu"
- Выберите расширенный вариант разделения
- Дважды щелкните раздел подкачки, выберите его для использования подкачки
- Дважды щелкните корневой раздел, выберите форматирование и используйте его для корневой точки монтирования (/).
Теперь выполните клонирование диска следующим образом:
# Set up some parameters
ORIG_DEV="/dev/nbd0"
ORIG_MNT=$(mktemp -d)
ORIG_IMG="orig.vdi"
CLONE_DEV="/dev/nbd1"
CLONE_MNT=$(mktemp -d)
CLONE_IMG="clone.vdi"
qemu-img info $ORIG_IMG # save the "virtual size" output (in bytes) in the
# VIRT_SIZE variable in the next command
VIRT_SIZE="128849018880"
# Create the clone disk
qemu-img create -f vdi $CLONE_IMG $VIRT_SIZE
# Use qemu to make both disks accessible
modprobe nbd
qemu-nbd -c $ORIG_DEV $ORIG_IMG
qemu-nbd -c $CLONE_DEV $CLONE_IMG
# Set up the clone disk partition table and partitions
parted $CLONE_DEV mklabel msdos
parted $CLONE_DEV mkpart primary linux-swap 2048s 4198399s
parted $CLONE_DEV mkpart primary ext4 4198400s 100%
# Format the clone disk partitions and clone the UUIDs
mkswap $CLONE_DEVp1 -U $(blkid $ORIG_DEVp1 -s UUID -o value)
mkfs.ext4 $CLONE_DEVp2 -U $(blkid $ORIG_DEVp2 -s UUID -o value)
# Mount both disks and copy root from the original to the clone
mount $CLONE_DEVp2 $CLONE_MNT
mount $ORIG_DEVp2 $ORIG_MNT
find $ORIG_MNT -maxdepth 1 -mindepth 1 | xargs -I{} cp -ar {} $CLONE_MNT
umount $ORIG_MNT
umount $CLONE_MNT
# Copy the boot sector and partition table from the original
dd if=$ORIG_DEV of=$CLONE_DEV bs=$((2048*512)) count=1
# Disconnect the disks
qemu-nbd -d $CLONE_DEV
qemu-nbd -d $ORIG_DEV
Что еще ты пробовал?
- grub-install --root-directory =/ путь / к / клону / устройству / загрузке / / dev / clone_device. Это установило Grub на правильное устройство, но с подробностями устройства моего хоста. ВМ не будет загружаться.
- Сделайте chroot на диске-клоне, затем установите grub. Возникла проблема, потому что я должен иметь возможность использовать 64-битные хосты для клонирования 32-битных гостей. Это похоже на обнадеживающий путь для расследования, но я застрял в том, как этого добиться.
- Смонтируйте виртуальный диск, переместите все файлы из раздела данных с помощью
mv
, обнулите разделы данных и своп (dd if=/dev/zero of=/dev/nbd0p2
) и сожмите виртуальный диск (используяVBoxManage modifyhd clone.vdi --compress
). Диск начал расширяться в моей файловой системе хоста, так как он заполнял его пустым пространством (ха!). Я остановилdd
когда понял, что это происходит, и сжал образ диска. Это было все еще более 3 ГБ. (Я не пробовал использовать gzip / bzip, попробую сегодня вечером. Я также попытаюсь позволить запуску dd wipe до конца, но я бы предпочел менее трудоемкое решение, даже если это работает). - e2image. Смотрите мой другой вопрос: метаданные файловой системы восстановления e2image. Я не решил это. Обратите внимание, что шаги, которые я предоставляю в разделе « Подробности », включая создание раздела, форматирование и копирование загрузочного сектора, но перед тем, как копировать корневой раздел, создайте файл изображения очень похожего размера с тем, что был создан e2image.
- Загрузка в другую виртуальную машину, чтобы войти в нее, чтобы запустить grub-install. На самом деле я этого не делал, но я включил это здесь на случай, если кто-то предложит это. Для моих пользователей мне нужна рекомбинация виртуальной машины, чтобы ее можно было записать в сценарии; что исключает вовлеченный процесс установки.
- Установите extlinux вместо Grub. Несмотря на неудачу, это упражнение показывает, что (я думаю!) загрузчик успешно загружает RAM-диск из моего раздела, но застревает на этом этапе.
Если вы зашли так далеко, уже спасибо! Будем весьма благодарны за любые предложения относительно путей расследования, даже если они не будут подробно описаны. Заранее спасибо.