Конвертировать образ раздела в образ диска с таблицей разделов

20

У меня есть образ существующего раздела, созданного с помощью dd if=/dev/sdXN of=image.bin. Теперь я хочу использовать этот образ в качестве основы для виртуальной машины. Я знаю, как преобразовать изображение в формат, который может использовать VirtualBox.

Проблема в том, что образ «диска» на самом деле представляет собой просто образ одного раздела и, следовательно, не содержит MBR или таблицы разделов. Это очень затрудняет загрузку виртуальной машины.

Существует ли простой способ с учетом образа раздела создать правильный образ диска, включая таблицу разделов?

Мика Фишер
источник

Ответы:

13

Вы можете сделать это на хост-машине. Большинство инструментов, таких как, fdiskбудут работать с файлами и kpartxдают вам доступ к разделам в файле.

  1. Создайте новое пустое редкое изображение размером 100 ГБ (сделайте его немного больше, чем размер изображения раздела)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Разделите файл изображения с fdisk

    fdisk myvm.img
    
  3. Сделать разделы в файле образа доступными для отдельных устройств

    sudo kpartx -a myvm.img
    
  4. Скопируйте образ раздела в раздел

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Расширить файловую систему, чтобы заполнить весь раздел

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Закройте разделы

    sudo kpartx -d myvm.img
    
  7. Демонтировать петлевое устройство

    sudo losetup -D
    
mgorven
источник
Не приведет ли это к тому, что созданный раздел на изображении не будет соответствовать длине раздела с изображением? И есть ли способ решить это? И сможет ли «достаточно умный» менеджер файловой системы сказать, что он не использует весь размер раздела, и развернуться сам, чтобы соответствовать?
убийца
@killermist Обновленный ответ.
mgorven
Это хороший ответ. Знаете ли вы какой-нибудь способ избежать копирования всего этого в процессе?
Мика Фишер
@MikaFischer К сожалению, нет, потому что таблица разделов должна существовать до раздела, и я не знаю какого-либо механизма для добавления данных в файл.
mgorven
Я думаю, что ответ Харуна лучше, потому что это легко сделать и можно написать по сценарию.
Филколборн
9

Я уверен, что первоначальная проблема была решена давно, но для тех, кто с подобной проблемой:

Один из способов избежать копирования всего изображения - создать изображение в формате .vmdk, которое ссылается на отдельные файлы экстентов для таблицы разделов и для содержимого раздела.

У меня есть этот фрагмент в файле .vmdk из теста, который я провел некоторое время назад:

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

Это означает, что 63 сектора, начиная со смещения 0, считываются из необработанного файла "parttable.bin", но сектор 63 и выше поступает из необработанного дампа раздела "partition-image.bin". (Конечно, замените 63 фактическим смещением на первый раздел, обычно 2048 в эти дни).

Конечным результатом является то, что изнутри VBox выглядит так, будто вы добавили таблицу разделов в начало образа раздела без необходимости выполнять длительную операцию копирования.

Разбейте диск внутри виртуальной машины, и, если вы правильно настроили смещения, вы должны увидеть содержимое образа вашего раздела во вновь созданном разделе.

Харун
источник
2
Я думаю, что '63' во второй строке должно быть 0, если partition-image.bin является образом раздела. Я только что сделал что-то подобное, и мне нужно было установить это смещение в файле образа раздела на ноль. philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn
Genius. Мне просто нужно было сделать это, чтобы использовать раздел Windows для виртуальной машины на хосте Linux, и это единственное, что сработало, используя шаги из @philcolbourn: superuser.com/a/804396/93066
bmaupin
Что должно быть в остальной части файла vmdk?
gozzilli
1
@gozzilli Остальная часть файла представляет собой набор деталей, таких как номера версий файла, тип адаптера диска, uuids и геометрия диска. Я не знаю, как написать эти биты. Я бы порекомендовал просто использовать инструмент для создания vmdk, указывающего на образ диска, а затем изменять только строки, описывающие, откуда получить дополнительный заголовок раздела.
Харун
3

Интересная проблема. Вот что я бы сделал:

  1. Создайте виртуальную машину с диском подходящего размера, затем загрузите ее с компакт-диска восстановления.
  2. Получите доступ к существующему образу диска каким-либо образом (nfs, cifs и т. Д.).
  3. Создайте необходимые разделы на локальном диске виртуальной машины.
  4. Используйте dd, чтобы записать образ раздела в раздел на диске vm.

После этого вам нужно обновить загрузчик. Предполагая, что вы используете GRUB, смонтируйте только что созданный раздел, затем выполните chroot в нем и запустите его update-grub(будьте осторожны, возможно, вам придется настроить его файлы конфигурации, прежде чем он будет работать правильно).

Удачи!

bahamat
источник
2

Вы можете изменить размер файловой системы с помощью GParted.

Создайте тестовое изображение:

dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs

Я не использую resize2fs, потому что он изменяет размер файла, а не оставляет свободное место.

sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0

Бесплатно 1 МБ в начале.

sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0

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

fdisk extfs

Установите для первого сектора значение 2048 (2048 секторов * 512 В / сектор = 1 МБ), последний сектор по умолчанию (т. Е. Конец изображения).

обманчивая надежда
источник
1

Я лично предпочитаю добавлять, используя dd.

Я предполагаю, что 512-байтовые сектора здесь. Там может быть случай для 2048-байтовых секторов, так что просто поменяйте местами числа и сделайте математику.

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

dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img

MBR

Составление изображения

Я лично предпочитаю добавить первый MB (2048 секторов) в его начало:

dd if=testfs.img skip=2048 bs=512 of=full.img

Наконец, запустив fdisk, чтобы создать таблицу разделов (или скопировать ее самостоятельно), я создал 1 раздел, используя значения по умолчанию.

Проверка

Чтобы проверить, создайте разделы цикла и автоопределите:

sudo losetup -fP full.img

И запустить fileна результирующем многораздельном кольцевом устройстве:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

Составление изображения

Лично я предпочитаю добавить первый МБ (2048 секторов, поскольку gdisk по умолчанию будет указывать это число, так как он выровнен на 1 МБ) к его началу для начала MBR и 34 сектора к его концу (или 2048 для полного МБ) для конца GPT (конечный сектор может отличаться). Пропуск конечного GPT может привести к потере данных:

dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

Наконец, запустив gdisk, чтобы создать таблицу разделов (или скопировать ее самостоятельно), я создал 1 раздел, используя значения по умолчанию.

Проверка

Чтобы проверить, создайте разделы цикла и автоопределите:

sudo losetup -fP full.img

И запустить fileна результирующем многораздельном кольцевом устройстве:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files) Этот метод гарантирует отсутствие угадывания, изменения размера или выравнивания вручную.

Дэн Дарт
источник
Как вы находите конечный сектор изображения в gpt
Anwar
Когда я запускаю это, sudo file -s /dev/loop11p1я получил /dev/loop11p1: data. Который ранее был файловой системой ext4. И в результате full.img меньше. Я думаю, что у вас есть обратное решение.
Анвар
Я думаю, что вы имеете seek=2048в виду в этой команде dd if = testfs.img skip = 2048 bs = 512 of = full.img
Anwar