Как разбить том на разделы в обычном файле без цикла?

Как разбить том на разделы в обычном файле без цикла?

Я пытаюсь поиграться с разработкой ОС и начал с загрузчика, где фаза 0 загружает фазу 1 из файла (указанного inode) на разделе ext4 (указанном первым LBA). Конечно, мне нужно что-то, с чего можно загрузиться, поэтому я взял QEMU. Что теперь?

До сих пор все работало хорошо:

truncate -s64M /tmp/SomeVolume
/sbin/mke2fs -t ext4 -F /tmp/SomeVolume
yasm phase0.asm
dd if=phase0 of=/tmp/SomeVolume conv=notrunc

Я создаю том размером около 64 МБ, форматирую его как ext4 и перезаписываю первые 1024 октета phase0 (который всегда имеет размер 1024 байта). Это работает отлично.

Но теперь я хочу сделать правильно разделенный файл, чтобы протестировать его для более реалистичных сценариев. Я знаю, что могу использовать /sbin/cfdiskсвой файл тома, но mke2fsу него нет параметра, который позволяет мне выбрать диапазон в файле.

Теперь я знаю,решения с использованием цикла, но к сожалению, у меня это не работает (кажется, я не могу изменить max_partв Debian jessie). Кажется, естьдругой модуль называетсяnbd, но у меня не установлены сервер и клиент для этого модуля. И становится немного смешно, что мне нужны привилегии root для чего-то, что можно было бы сделать в пользовательском пространстве.

Как я могу это сделать как пользователь? Или мне просто создать том с разделами MBR/GPT вокруг созданного мной файла в формате ext4?

решение1

Долгий путь вокруг. Но ради забавы:

1.Создайте временное изображение:

    $ truncate -s64MiB tmp.img

2.Создайте два раздела, используя fdisk:

Довольно подробно, но нормально.

$ fdisk tmp.img

Первый раздел:

: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>

Второй раздел:

: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)

Распечатайте то, что мы собираемся написать:

: x
: p
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 00  32  33    0  57  52    5       2048      81920 83
 2 00  57  53    5  40  32    8      83968      47104 83

Напишите и выйдите:

:w (Dont! forget ;-) )

У нас есть два раздела по 40 и 23 МБ:

81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB

3.Создайте две файловые системы:

truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img

4.Соединяем все вместе:

Извлечь первые 2048*512байты из временного изображения:

dd if=tmp.img of=disk.img bs=512 count=2048

Объедините их:

cat ext4.img ext3.img >> disk.img

Отлично.

решение2

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

  1. используйте циклы или устройство отображения в линейном режиме для каждого раздела. Вам не нужно иметь эти настройки параллельно для форматирования;

  2. частьx/kpartxчтобы сообщить ядру, какие разделы оно должно учитывать в цикле/устройстве сопоставления устройств или даже в обычном файле:

    kpartx -av /path/to/file
    

    или

    losetup /dev/loopX /path/to/file
    kpartx -av /dev/loopX
    

    Устройства являются устройствами сопоставления устройств (т.е. связаны с ними /dev/mapperпо умолчанию).

  3. с использованиемpartprobe

    losetup /dev/loopX /path/to/file
    partprobe /dev/loopX
    

    что даст указание ядру проверить разбиение на разделы, тем самым создав /dev/loopXpY.

  4. загрузить образ Live CD/USB (может быть установщиком) в ВМ и выполнить разбиение изнутри. Это имеет очевидное преимущество, поскольку позволяет разбить виртуальный диск даже для образов ВМ, хранящихся в специальных форматах (например, qcow2 от QEMU).

решение3

http://blog.lifebloodnetworks.com/?p=934

Кажется, есть какая-то информация по этому поводу. Похоже, что вы можете смонтировать raw-диск как устройство loopback:

Смонтируйте образ необработанного диска как петлевое устройство:losetup /dev/loop0 [path to image]

Запустите kpartx и:kpartx -va /dev/loop0

Это добавит ваши разделы в /dev/mapper/loop0pX, где каждый X — это отдельный раздел.

Теперь вы можете смонтировать каждый раздел:mount /dev/mapper/loop0pX /media/partition

Если вы хотите быть уверены, что ничего не запишется в резервную копию, просто смонтируйте ее как доступную только для чтения:mount -o ro /dev/mapper/loop0pX /media/partition

После того, как вы закончите, вам нужно будет сделать уборку.

Размонтирование: umount /media/partition Удалить устройства сопоставления: kpartx -d /dev/loop0 Удалить устройство обратной связи:losetup -d /dev/loop0

Все эти команды могут потребоваться для запуска от имени пользователя root. Если loop0 сообщает, что он занят, просто выберите другое устройство loop (/dev/loop1 и т. д.).

-edit: Я вижу, что вы хотите сделать это без прав root, поэтому вышеизложенное может оказаться для вас бесполезным.

решение4

Вам не нужно возиться с max_part. Используйте partedдля создания разделов на устройстве loop или partprobeдля их активации, если они уже существуют. Возможно, вам придется обновиться до версии parted в testing/unstable.

Связанный контент