Перетворіть зображення розділу в зображення диска з таблицею розділів


20

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

Проблема полягає в тому, що зображення "диска" насправді є лише зображенням одного розділу і, отже, не містить MBR або таблиці розділів. Це робить його дуже важким для завантаження VM.

Чи є простий спосіб, задавши зображення розділу, створити правильний образ диска, включаючи таблицю розділів?

Відповіді:


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
    

Хіба це не зробить створений розділ на зображенні "не відповідним" довжині зображеного розділу? І чи є спосіб вирішити це? І чи зможе менеджер файлової системи "достатньо розумний" сказати, що він не використовує весь розмір розділу та розширити себе, щоб відповідати?
вбивця

@killermist Оновлена ​​відповідь.
mgorven

Це хороша відповідь. Чи знаєте ви якийсь спосіб уникнути копіювання всієї справи в процесі?
Міка Фішер

@MikaFischer На жаль, ні, тому що таблиця розділів повинна існувати перед розділом, і я не знаю жодного механізму для додавання даних до файлу.
mgorven

Я вважаю, що відповідь Харуна краща, тому що це легко зробити і можна писати сценарії.
philcolbourn

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 виглядає так, що ви попередньо створили таблицю розділів на передній частині зображення розділу, не вимагаючи тривалої операції копіювання.

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


2
Я думаю, що "63" у другому рядку має бути 0, якщо partition-image.bin є зображенням розділу. Я щойно зробив щось подібне, і мені потрібно було встановити це зміщення у файлі зображення розділу на нуль. philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn


Геніальність. Мені просто довелося це зробити, щоб використовувати розділ Windows для VM на хості Linux, і це єдине, що працювало, використовуючи кроки від @philcolbourn: superuser.com/a/804396/93066
bmaupin

Що має бути в решті файлу vmdk?
gozzilli

1
@gozzilli Решта файлу - це безліч деталей, таких як номери версій файлів, тип адаптера диска, удеї та геометрія диска. Я не знаю, як написати ці шматочки. Я рекомендую просто скористатися інструментом для створення vmdk, що вказує на образ диска, а потім змінити лише рядки, що описують, звідки отримати додатковий заголовок розділу.
Харун

3

Цікава проблема. Ось що я б робив:

  1. Створіть VM з диска, відповідного розміру, та завантажте його з компакт-диска для відновлення.
  2. Отримайте доступ до наявного образу диска якось (nfs, cifs тощо).
  3. Створіть потрібні розділи на локальному диску VM.
  4. Використовуйте dd для запису зображення розділу в розділ на диску vm.

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

Удачі!


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

Складання зображення

Я особисто вважаю за краще додати перший MB (2048 секторів, оскільки gdisk за замовчуванням до цього числа, оскільки він вирівняний на 1 МБ) до його початку для початку MBR, а 34 сектору до кінця (або 2048 для повного MB) для кінця 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 пропустити = 2048 bs = 512 of = full.img
Anwar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.