Создание раздела
Чтобы создать таблицу разделов, вы можете использовать обычные инструменты непосредственно в файле, а не на устройстве. Большинство стандартных инструментов должны поддерживать это использование, например, fdisk и parted . parted отлично подходит для интеграции в скрипт, так как он может принимать команды в качестве аргумента.
parted -s testing.img mklabel gpt
parted -s -a none testing.img mkpart ESP fat32 0 4M
parted -s -a none testing.img mkpart linux ext4 4M 10M
Создание файловой системы
У меня нет чистого решения для монтирования или создания файловой системы в виртуальном разделе. Правильнее всего было бы иметь драйвер fuse (Файловая система в Userspace) для таблиц разделов. Но я не нашел ни одного в данный момент.
Однако mke2fs может использовать опцию -E offset=1234 для построения файловой системы ext2 , ext3 или ext4 с произвольным смещением в файле. Вы можете дать ему смещение вашего раздела. Однако не забудьте также указать ему размер файловой системы, поскольку поведение по умолчанию выглядит некорректно, и по умолчанию записывайте файловую систему с размером виртуального диска, расширяя файл при необходимости.
mke2fs -E offset=4000256 testing.img 6316k
К сожалению, не у всех mkfs есть такая опция. mkfs.vfat нет. Таким образом, другое решение может состоять в том, чтобы создать отдельный файл размером с раздел, использовать на нем mkfs а затем использовать dd для копирования содержимого на полный виртуальный диск.
dd if=testing.img of=testing.fat32.img bs=512 skip=34 count=7779
mkfs -t vfat testing.fat32.img
dd if=testing.fat32.img of=testing.img bs=512 seek=34 count=7779 conv=notrunc
Не самое чистое и быстрое решение, но оно работает, оно довольно универсально и не требует привилегий root. Опция преобразования sparse также может быть использована, чтобы немного ускорить процесс, не записывая длинные последовательности нулей.
Монтирование файловых систем
Вы можете смонтировать файловую систему в разделе с помощью fuse если он поддерживает вашу файловую систему. Существует стандартная поддержка файловых систем ext под именем fuse-ext2 и одна для FAT под названием fusefat . К сожалению, в данный момент они не принимают offset . Так что я думаю, что вы обязаны либо использовать mount либо использовать тот же трюк с dd что и раньше.
Стандартный метод с partx или kpartx (или опцией -o offset для mount) требует привилегий root. Решение dd медленное, сложное и с ошибкой.