7

Я пытаюсь клонировать образ виртуального диска довольно ручным способом. Обзор моей методологии до сих пор выглядит следующим образом:

  1. Создайте виртуальную машину в VirtualBox с жестким диском на 120 ГБ (размер гипервизора и жесткого диска не имеет значения, в основном они включены для полноты и согласованности с остальной частью моего вопроса, например с размерами разделов)
  2. Установите Ubuntu 12.04.3 на виртуальной машине
  3. Закрыть виртуальную машину
  4. Подключить виртуальный жесткий диск, связанный с виртуальной машиной
  5. Извлечение файлов операционной системы и данных для хранения в каталоге
  6. Сохранить метаданные виртуального жесткого диска
  7. Создайте свежий виртуальный диск и восстановите разделы и загрузочную информацию из (6)
  8. Восстановите данные из (5) в правильный раздел

Эта проблема

Моя дублированная виртуальная машина не загружается. Grub, кажется, копирует, и, кажется, подтверждает мой корневой раздел (с установленной на нем Ubuntu). Я могу один раз пройти мимо Grub и получить фиолетовый экран, как будто Ubuntu вот-вот загрузится. Тогда это останавливается. После этого я могу загрузиться в Grub, выбрать свою ОС, затем я получаю мигающий курсор командной строки. Нет возможности ввода. Я подозреваю, что в процессе клонирования чего-то не хватает (подробнее см. Ниже). Примечание: я использую grub2, а не legacy.

Почему вы это делаете?

Как часть договорного требования, мне нужно хранить виртуальный диск в системе контроля версий. Наличие огромного двоичного двоичного объекта (виртуального диска) в управлении версиями является проблемой, в основном для clone (git)/checkout (svn), но также и для diff-файлов. Я рассмотрел возможность сжатия в несколько файлов, но мне нужно иметь возможность манипулировать ОС / данными, извлеченными в (5) выше. Обратите внимание, что моему хранилищу VCS по-прежнему нужна вся информация, необходимая для создания полной виртуальной машины.

подробность

Подробные инструкции по воспроизведению того, что я описал:

  1. Создайте виртуальную машину и загрузите Ubuntu Live CD
  2. Выберите "Попробуйте Ubuntu"
  3. Откройте терминал
  4. Создайте раздел msdos: sudo parted /dev /sda mklabel msdos
  5. Создайте файл подкачки объемом 2 ГБ: sudo parted /dev /sda mkpart, основной linux-swap 2048s 4198399s
  6. Используйте остаток диска для корневого раздела: sudo parted /dev /sda mkpart primary ext4 4198400s 100%
  7. Перезагрузите машину, выберите "Установить Ubuntu"
  8. Выберите расширенный вариант разделения
  9. Дважды щелкните раздел подкачки, выберите его для использования подкачки
  10. Дважды щелкните корневой раздел, выберите форматирование и используйте его для корневой точки монтирования (/).

Теперь выполните клонирование диска следующим образом:

# 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

Что еще ты пробовал?

  1. grub-install --root-directory =/ путь / к / клону / устройству / загрузке / / dev / clone_device. Это установило Grub на правильное устройство, но с подробностями устройства моего хоста. ВМ не будет загружаться.
  2. Сделайте chroot на диске-клоне, затем установите grub. Возникла проблема, потому что я должен иметь возможность использовать 64-битные хосты для клонирования 32-битных гостей. Это похоже на обнадеживающий путь для расследования, но я застрял в том, как этого добиться.
  3. Смонтируйте виртуальный диск, переместите все файлы из раздела данных с помощью mv , обнулите разделы данных и своп (dd if=/dev/zero of=/dev/nbd0p2) и сожмите виртуальный диск (используя VBoxManage modifyhd clone.vdi --compress). Диск начал расширяться в моей файловой системе хоста, так как он заполнял его пустым пространством (ха!). Я остановил dd когда понял, что это происходит, и сжал образ диска. Это было все еще более 3 ГБ. (Я не пробовал использовать gzip / bzip, попробую сегодня вечером. Я также попытаюсь позволить запуску dd wipe до конца, но я бы предпочел менее трудоемкое решение, даже если это работает).
  4. e2image. Смотрите мой другой вопрос: метаданные файловой системы восстановления e2image. Я не решил это. Обратите внимание, что шаги, которые я предоставляю в разделе « Подробности », включая создание раздела, форматирование и копирование загрузочного сектора, но перед тем, как копировать корневой раздел, создайте файл изображения очень похожего размера с тем, что был создан e2image.
  5. Загрузка в другую виртуальную машину, чтобы войти в нее, чтобы запустить grub-install. На самом деле я этого не делал, но я включил это здесь на случай, если кто-то предложит это. Для моих пользователей мне нужна рекомбинация виртуальной машины, чтобы ее можно было записать в сценарии; что исключает вовлеченный процесс установки.
  6. Установите extlinux вместо Grub. Несмотря на неудачу, это упражнение показывает, что (я думаю!) загрузчик успешно загружает RAM-диск из моего раздела, но застревает на этом этапе.

Если вы зашли так далеко, уже спасибо! Будем весьма благодарны за любые предложения относительно путей расследования, даже если они не будут подробно описаны. Заранее спасибо.

4 ответа4

4

У меня есть альтернативное предложение, которое исключает необходимость извлечения и воссоздания содержимого вашего виртуального диска.

Если вы используете git, вы можете напрямую работать с подключенным виртуальным диском и иметь свой каталог .git где-то еще. Единственное, что вам, вероятно, нужно, чтобы ваш .gitignore (если есть) находился в корневом каталоге корневого раздела на вашем виртуальном диске.

РЕДАКТИРОВАТЬ:
Для клонирования вы можете использовать обычный механизм VirtualBox после начальной установки. Всякий раз, когда вам нужно восстановить определенную версию, создайте другой клон из оригинала, затем смонтируйте его и выполните git checkout.
Пока версия grub не отличается, это все, что вам нужно сделать. Если версия grub отличается, вам нужно загрузить виртуальную машину с вашего 12.04.3.iso и выполнить установку grub.

Таким образом, альтернативный рабочий процесс (добавлен новый шаг 4, изменен шаг 5):

  1. Создайте виртуальную машину в VirtualBox с жестким диском на 120 ГБ
  2. Установите Ubuntu 12.04.3 на виртуальной машине
  3. Закрыть виртуальную машину
  4. Клонировать виртуальную машину, отложить оригинал в сторону
  5. Смонтируйте виртуальный жесткий диск оригинального или первого клона (например, в /media /virtual)
  6. CD / медиа / виртуальный
  7. git --git-dir = / где-то / еще /virtual.git --work-tree =. в этом
  8. git --git-dir = / где-то / еще /virtual.git --work-tree =. добавлять .
  9. git --git-dir = / где-то / еще /virtual.git --work-tree =. commit -m "Начальный импорт"
  10. ... любые другие задачи git ...

Если вы не хотите всегда добавлять --git-dir =/where /else /virtual.git --work-tree =. есть вопрос о Stackoverflow, который объясняет, как от него избавиться:могу ли я хранить папку .git вне файлов, которые я хочу отслеживать?

Не совсем то, что вы просили, но описание вашей проблемы создает у меня впечатление, что вы больше заинтересованы в выполнении своей работы, чем в точном способе ее выполнения.

3

Похоже, у вас не было особого представления о точке монтирования Ubuntu? Рассматривали ли вы разделить виртуальную машину на несколько разделов?

по ссылке ниже:

http://www.easy-ubuntu-linux.com/ubuntu-installation-606-12.html

базовая установка составляет всего 4G, +1G для SWAP, +2G для /tmp, тогда вы можете создать отдельный раздел для /usr, /var, /home, /opt

просто сделайте 1G для каждого из них в начале, вы можете динамически увеличивать его с виртуальной коробкой, когда это необходимо

ссылка:

http://www.ubuntugeek.com/linux-or-ubuntu-directory-structure.html

После этого вы можете определить свою область SVC, только пользовательские файлы или журналы или ОС? для которого вы можете иметь гораздо меньше боли в версии.

в большинстве случаев вы можете просто сделать /, /usr и /opt доступными только для чтения и неизменяемыми после установки, и, таким образом, уменьшить общую головную боль версии.

но стоит напомнить, что, поскольку в вашем контракте указано, что вам нужно хранить виртуальный диск, я думаю, что сохранение извлеченных данных с виртуального диска не соответствует вашему контракту. Но хранение нескольких виртуальных дисков совпадает. Вот почему я предлагаю вам создать точку монтирования, а затем сделать часть из них доступной только для чтения (так что есть только 1 версия из них).

просто еще одно примечание, не забудьте проверить, можете ли вы отключить дату доступа к файлу точки монтирования? (некоторые очень высокие настройки безопасности не позволяют отключить это, компьютерная криминалистика)

Поскольку дата доступа фактически записывается на диск, если дата доступа включена. Таким образом, виртуальный диск / точка монтирования, которая является доступом во второй день, фактически отличается от виртуального диска / точки монтирования в первый день, даже если ничего не написано.

ссылка (нет времени доступа):

https://askubuntu.com/questions/59179/how-do-i-make-noatime-mounts-default

3

Может быть, вы уже пробовали это, может быть, вы этого не сделали. Но пытались ли вы переустановить Grub2 с Live CD в «дублированной виртуальной машине»?«Все, что я прочитал, звучало так, будто вы устанавливали Grub2 с хост-машины.

  • Как только вы дойдете до точки, где у вас есть дублированная виртуальная машина, которая не загружается
  • Смонтируйте Live CD, такой как Ubuntu Установка диска на виртуальную машину
  • Загрузите виртуальную машину и нажмите F12 для загрузки с Live CD
  • Переустановите grub из командной строки (внутри ВМ)

Если вы хотите автоматизировать процесс, вы можете использовать VBoxManage для монтирования пользовательского Live CD с Ubuntu, который запускает скрипт для переустановки Grub2 при запуске.

VBoxManage storageattach "io" --storagectl "IDE Controller" \
--port 1 --device 0 --type dvddrive --medium debian-6.0.2.1-i386-CD-1.iso

Пример источника

Надеемся, что не слишком устаревший, на help.ubuntu.com есть руководство по настройке Live CD и вопрос / ответ Stack Exchange на askubuntu.com, включающий добавление загрузочного скрипта на настроенный Live CD

0

Еще одна мысль, я на самом деле посмотрю в /etc/fstab . Как там определены ваши разделы? Если они определены их UUID , то, возможно, есть вероятность, что эта информация не будет реплицирована в процессе клонирования. Вы можете захотеть сделать их определяемыми именами устройств, например, /dev/sda0 .

Еще один момент, почему бы не запустить git изнутри самой виртуальной машины? Я могу думать о наличии каталога на хосте с вашим хранилищем. Затем виртуальная машина может смонтировать этот каталог и запустить git на самой виртуальной машине.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .