Я пытаюсь поиграться с разработкой ОС и начал с загрузчика, где фаза 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
Я не совсем уверен, что правильно понял ваш вопрос. Если вы пытаетесь разбить образ виртуальной машины на разделы, у вас есть несколько вариантов:
используйте циклы или устройство отображения в линейном режиме для каждого раздела. Вам не нужно иметь эти настройки параллельно для форматирования;
частьx/kpartxчтобы сообщить ядру, какие разделы оно должно учитывать в цикле/устройстве сопоставления устройств или даже в обычном файле:
kpartx -av /path/to/file
или
losetup /dev/loopX /path/to/file kpartx -av /dev/loopX
Устройства являются устройствами сопоставления устройств (т.е. связаны с ними
/dev/mapper
по умолчанию).с использованием
partprobe
losetup /dev/loopX /path/to/file partprobe /dev/loopX
что даст указание ядру проверить разбиение на разделы, тем самым создав
/dev/loopXpY
.загрузить образ 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.