Usermode-fs-tools: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 17 промежуточных версий этого же участника)
Строка 16: Строка 16:
== Поддерживаемые целевые архитектуры и возможности ==
== Поддерживаемые целевые архитектуры и возможности ==


Упаковка и распаковка образов дисков extfs и vfat реализована на SHELL-скриптах с использованием '''coreutils''', '''util-linux''', '''e2fsprogs''', '''mtools''' и '''dosfstools''', таким образом поддерживается на всех архитектурах, используемых в ОС Альт. Установка загрузчика GRUB в режиме обычного пользователя возможна на всех архитектурах, для которых в ОС Альт собирается GRUB, и даже чуть больше (добавлена поддержка 32-бит ARM). Загрузочные образы дисков можно также создавать для '''e2k''', '''e2kv4''' и '''ppc64le'''.
Упаковка и распаковка образов дисков extfs и vfat реализована на SHELL-скриптах с использованием '''coreutils''', '''util-linux''', '''e2fsprogs''', '''mtools''' и '''dosfstools''', таким образом поддерживается на всех архитектурах, используемых в ОС Альт. Установка загрузчика GRUB в режиме обычного пользователя возможна на всех архитектурах, для которых в ОС Альт собирается GRUB, и даже чуть больше (добавлена поддержка 32-бит ARM). Загрузочные образы дисков можно также создавать для '''e2k''', '''e2kv4''', '''e2kv5''' и '''ppc64le'''.


На 64-бит платформах Intel возможна установка подписанного загрузчика для поддержки SecureBoot в режиме загрузки UEFI. В версии для p9 и Сизифа (но не на p8 и ниже) SecureBoot может поддерживаться также на 32-бит платформах Intel (i386-efi). Допускается разметка образов дисков с использованием схем разметки DOS/MBR и GUID/GPT. Для работы с образами дисков и разделов, помимо '''grub-efi''', '''grub-pc''' и сопутствующих пакетов, также используются утилиты '''dd''', '''fdisk''' и '''sfdisk'''.
На 64-бит платформах Intel возможна установка подписанного загрузчика для поддержки SecureBoot в режиме загрузки UEFI. В версии для p9 и Сизифа (но не на p8 и ниже) SecureBoot может поддерживаться также на 32-бит платформах Intel (i386-efi). Допускается разметка образов дисков с использованием схем разметки DOS/MBR и GUID/GPT. Для работы с образами дисков и разделов, помимо '''grub-efi''', '''grub-pc''' и сопутствующих пакетов, также используются утилиты '''dd''', '''fdisk''' и '''sfdisk'''.
Строка 24: Строка 24:
В современных версиях '''mke2fs''' появилась опция -d <каталог>, позволяющая заполнить образ форматируемой файловой системы из указанного каталога. Для ранних версий и для распаковки используется утилита '''debugfs''', работающая через '''libe2fs''' со структурами на диске без обращения к ядру ОС. '''dir2extfs''' во многом повторяет семантику mke2fs, поддерживает большую часть передаваемых ей опций, а также реализует механизм максимального уменьшения образа ('''resize2fs''') и резервирования заданного пространства. '''dir2vfat''' реализует схожее поведение по аналогии, при этом являясь надстройкой над '''mkfs.fat''', во многом повторяя её семантику.
В современных версиях '''mke2fs''' появилась опция -d <каталог>, позволяющая заполнить образ форматируемой файловой системы из указанного каталога. Для ранних версий и для распаковки используется утилита '''debugfs''', работающая через '''libe2fs''' со структурами на диске без обращения к ядру ОС. '''dir2extfs''' во многом повторяет семантику mke2fs, поддерживает большую часть передаваемых ей опций, а также реализует механизм максимального уменьшения образа ('''resize2fs''') и резервирования заданного пространства. '''dir2vfat''' реализует схожее поведение по аналогии, при этом являясь надстройкой над '''mkfs.fat''', во многом повторяя её семантику.


Установка загрузчика GRUB в режиме UEFI тривиальна, поскольку это просто копирование файлов в нужные каталоги. Для поддержки '''Power PReP''' раздела (SLOF-загрузка) '''grub-ieee1275''' умеет создавать соответствующий '''powerpc.elf''' и другие необходимые файлы. На '''e2k''' и '''e2kv4''' GRUB не ставится, там достаточно создать отдельный раздел /boot (ext2) и поместить в него '''boot.conf''' с нужным содержимым. GRUB stage0 (boot.img) на Intel/PC помещается в первый сектор образа диска, GRUB stage1.5 (core.img) -- в следующие сектора при DOS/MBR-разметке или в раздел '''BIOS Boot''' при GUID/GPT-разметке. При этом адреса нужных секторов корректируются прямо в образе диска.
Установка загрузчика GRUB в режиме UEFI тривиальна, поскольку это просто копирование файлов в нужные каталоги. Для поддержки '''Power PReP''' раздела (SLOF-загрузка) '''grub-ieee1275''' умеет создавать соответствующий '''powerpc.elf''' и другие необходимые файлы. На '''e2k'''/'''e2kv4'''/'''e2kv5''' GRUB не ставится, там достаточно создать отдельный раздел /boot (ext2) и поместить в него '''boot.conf''' с нужным содержимым. GRUB stage0 (boot.img) на Intel/PC помещается в первый сектор образа диска, GRUB stage1.5 (core.img) -- в следующие сектора при DOS/MBR-разметке или в раздел '''BIOS Boot''' при GUID/GPT-разметке. При этом адреса нужных секторов корректируются прямо в образе диска.


Обычный вызов '''grub-install''' под пользователем root выполняет множество действий, вызывает несколько программ и требует прямой доступ к дискам и разделам. Настоящий набор скриптов тоже разделяет установку загрузчика на две логические части. Сначала скриптом '''grub2dirs''' и вызываемым им '''grub-mkimage''' создаются все необходимые файлы в отдельных подкаталогах. Затем, когда отдельные образы разделов полностью подготовлены и сконвертированы в соответствующие *.img файлы, они объединяются в единый образ диска скриптом '''parts2img'''. На данном этапе выполняется заключительная часть встраивания различных стадий загрузчика, в том числе, с использованием ранее созданных файлов.
Обычный вызов '''grub-install''' под пользователем root выполняет множество действий, вызывает несколько программ и требует прямой доступ к дискам и разделам. Настоящий набор скриптов тоже разделяет установку загрузчика на две логические части. Сначала скриптом '''grub2dirs''' и вызываемым им '''grub-mkimage''' создаются все необходимые файлы в отдельных подкаталогах. Затем, когда отдельные образы разделов полностью подготовлены и сконвертированы в соответствующие *.img файлы, они объединяются в единый образ диска скриптом '''parts2img'''. На данном этапе выполняется заключительная часть встраивания различных стадий загрузчика, в том числе, с использованием ранее созданных файлов.
Строка 40: Строка 40:
1) Создать временный/рабочий каталог и перейти в него. Все файлы из него потом можно будет удалить. Места в нём должно быть достаточно для создания, по меньшей мере, двух образов.
1) Создать временный/рабочий каталог и перейти в него. Все файлы из него потом можно будет удалить. Места в нём должно быть достаточно для создания, по меньшей мере, двух образов.


<pre>$ cd /path/to/workdir/</pre>
<pre>$ cd ~/path/to/workdir/</pre>


2) Сгенерировать UUID будущего корневого (системного) раздела флэшки и сохранить его куда-нибудь.
2) Сгенерировать UUID будущего корневого (системного) раздела флэшки и сохранить его куда-нибудь.
Строка 68: Строка 68:


4) Вытащить из ISO-образа ALT Rescue ядро, initrd, squashfs стадии rescue и расположить их в определённых местах будущей корневой системы.
4) Вытащить из ISO-образа ALT Rescue ядро, initrd, squashfs стадии rescue и расположить их в определённых местах будущей корневой системы.
Обратите внимание, что в зависимости от сборки ядро с initrd могут называться по-разному и находиться в разных местах. Обычно их следует искать в '''/boot''', в '''/EFI/BOOT''' или в '''/syslinux/alt0''', названия могут иметь суффикс в виде версии, initrd обычно называется либо '''initrd.img''', либо '''full.cz''' (на старых дисках). Для нашего примера существенное значение имеет имя, под которым мы это сохраняем при копировании.


<pre>
<pre>
$ cp -Lf /media/ALT-Rescue/rescue sys-part/
$ cp -Lf /media/ALT-Rescue/rescue sys-part/
$ cp -Lf /media/ALT-Rescue/EFI/BOOT/vmlinuz sys-part/boot/
$ cp -Lf /media/ALT-Rescue/boot/vmlinuz sys-part/boot/vmlinuz
$ cp -Lf /media/ALT-Rescue/EFI/BOOT/full.cz sys-part/boot/
$ cp -Lf /media/ALT-Rescue/boot/initrd.img sys-part/boot/full.cz
</pre>
</pre>


Строка 100: Строка 102:
menuentry 'Rescue Deploy (dangerous for you data!)' --class gnu-linux --class gnu --class os --unrestricted {
menuentry 'Rescue Deploy (dangerous for you data!)' --class gnu-linux --class gnu --class os --unrestricted {
search --no-floppy --fs-uuid --set=root $uuid
search --no-floppy --fs-uuid --set=root $uuid
echo 'Loading Linux kernel...'
echo 'Loading Linux kernel...'
linux /boot/vmlinuz initrd=/boot/full.cz lowmem fastboot live automatic=method:disk,uuid:$uuid ramdisksize=$ramsize stagename=rescue splash=0 showopts autorun=method:disk  
linux /boot/vmlinuz initrd=/boot/full.cz fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:$uuid ramdisk_size=$ramsize stagename=rescue splash=0 showopts quiet autorun=method:disk  
echo 'Loading initial RAM-disk...'
echo 'Loading initial RAM-disk...'
initrd /boot/full.cz
initrd /boot/full.cz
}
}
EOF
EOF
Строка 167: Строка 169:
</pre>
</pre>


В результате мы получим образ загрузочной флэшки, на первой консоли которой будет стартовать наш скрипт. Загрузка в данном случае поддерживается в режиме UEFI с включенным SecureBoot, без SecureBoot, на 64-bit и 32-bit UEFI-firmware, а также в режиме Legacy BIOS (i386-pc). Спрашивается: зачем это надо, если исходная ALT Rescue и так всё это умеет "из коробки"? Ответ прост: мы добавили автоматику, можем добавить нужные нам файлы в образ, убрать "лишнее", а ещё мы заменили загрузчики '''isolinux''' и '''refind+elilo+grub32''' на GRUB, "оторвав графику", а могли бы "оторвать" не нужные варианты загрузки, например, сделав образ только для Legacy/BIOS-загрузки или только для UEFI-загрузки без поддержки SecureBoot. Начиная с версии '''1.1-alt1''' всё перечисленное можно выполнить одной командой -- см. описание '''iso2stick'''.
В результате мы получим образ загрузочной флэшки, на первой консоли которой будет стартовать наш скрипт. Загрузка в данном случае поддерживается в режиме UEFI с включенным SecureBoot, без SecureBoot, на 64-bit и 32-bit UEFI-firmware, а также в режиме Legacy BIOS (i386-pc). Спрашивается: зачем это надо, если исходная ALT Rescue и так всё это умеет "из коробки"? Ответ прост: мы добавили автоматику, можем добавить нужные нам файлы в образ, убрать "лишнее", а ещё мы заменили загрузчики '''isolinux''' и '''refind+elilo+grub32''' на GRUB, "оторвав графику", а могли бы "оторвать" не нужные варианты загрузки, например, сделав образ только для Legacy/BIOS-загрузки или только для UEFI-загрузки без поддержки SecureBoot. Начиная с версии '''1.1-alt1''' всё перечисленное можно выполнить одной командой -- см. описание [[#iso2stick]].


=== Возвращаем всё обратно ===
=== Возвращаем всё обратно ===
Строка 174: Строка 176:


<pre>
<pre>
$ cd /path/to/workdir/
$ cd ~/path/to/workdir/
$ rm -f *
$ rm -f *
$ ls -l /tmp/MBR.img
$ ls -l /tmp/MBR.img
Строка 312: Строка 314:
</pre>
</pre>


=== Эльбрус e2k/e2kv4 ===
=== Эльбрус e2k/e2kv4/e2kv5 ===


На e2k/e2kv4 GRUB не ставится, соответственно, скрипт '''grub2dirs''' не используется. Нужно подготовить раздел ext2, который будет монтироваться как /boot, сложить туда ядро, initrd и файл '''boot.conf''' примерно такого содержания:
На e2k/e2kv4/ekv5 GRUB не ставится, соответственно, скрипт '''grub2dirs''' не используется. Нужно подготовить раздел ext2, который будет монтироваться как /boot, сложить туда ядро, initrd и файл '''boot.conf''' примерно такого содержания:


<pre>
<pre>
$ cd /path/to/workdir/
$ cd ~/path/to/workdir/
$ mkdir -p e2k-part/alt0
$ mkdir -p e2k-part/alt0
$ cp -Lf .../vmlinuz e2k-part/alt0/vmlinux.0
$ cp -Lf .../vmlinuz e2k-part/alt0/vmlinux.0
Строка 328: Строка 330:
     partition=0
     partition=0
     image=/alt0/vmlinux.0
     image=/alt0/vmlinux.0
     cmdline=console=ttyS0,115200 console=tty0 hardreset fastboot live automatic=method:disk,uuid:$uuid stagename=rescue
     cmdline=console=ttyS0,115200 console=tty0 hardreset fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:$uuid stagename=rescue
     initrd=/alt0/full.cz
     initrd=/alt0/full.cz


Строка 334: Строка 336:
     partition=0
     partition=0
     image=/alt0/vmlinux.0
     image=/alt0/vmlinux.0
     cmdline=console=ttyS0,115200 console=tty0 hardreset fastboot live lowmem automatic=method:disk,uuid:$uuid stagename=rescue autorun=method:disk
     cmdline=console=ttyS0,115200 console=tty0 hardreset fastboot live lowmem root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:$uuid stagename=rescue autorun=method:disk
     initrd=/alt0/full.cz
     initrd=/alt0/full.cz
EOF
EOF
Строка 357: Строка 359:
<pre>
<pre>
$ grub2dirs -h
$ grub2dirs -h
Usage: grub2dirs [<options>...] [--] [<partsdir>]
Usage: grub2dirs.sh [<options>...] [--] [<partsdir>]


Options:
Options:
Строка 372: Строка 374:
   -m, --module=<NAME>    Pre-load specified grub module.
   -m, --module=<NAME>    Pre-load specified grub module.
                         This option can set many times.
                         This option can set many times.
  -n, --no-rootfs        Do not use 'sys-part' sub-directory.
   -q, --quiet            Suppress additional diagnostic.
   -q, --quiet            Suppress additional diagnostic.
  -U, --uuid=<UUID>      UUID of the ROOT filesystem.
   -S, --swap-part        Add SWAP partition before ROOT.
   -S, --swap-part        Add SWAP partition before ROOT.
   -s, --secure-boot      Use ALT shim's for UEFI Secure Boot.
   -s, --secure-boot      Use ALT shim's for UEFI Secure Boot.
   -t, --target=<ARCH>    Use specified target architecture: i586,
   -t, --target=<ARCH>    Use specified target architecture: i586,
                         x86_64, aarch64, armh, ppc64le or e2k/v4.
                         x86_64, aarch64, armh, ppc64le or e2k/v4/v5.
   -u, --uefi-only        Make UEFI-only boottable system on x86.
   -u, --uefi-only        Make UEFI-only boottable system on x86.
  -U, --uuid=<UUID>      UUID of the ROOT filesystem.
   -v, --version          Show this program version and exit.
   -v, --version          Show this program version and exit.
   -h, --help            Show this help message and exit.
   -h, --help            Show this help message and exit.
Строка 385: Строка 388:
</pre>
</pre>


Идеологически запуск данного скрипта эквивалентен той части '''grub-install''', которая отвечает за подготовку и размещение файлов в определённых каталогах. Поскольку для финального загрузочного диска важна разметка, этот скрипт всегда используется в паре с '''parts2img''' с учётом соответствующих опций. Так, если '''grub2dirs''' вызывался с опцией '''--guid-gpt''', parts2img тоже должен вызываться с этой же опцией. Если '''grub2dirs''' вызывался с опцией '''--swap-part''', parts2img должен вызываться с опцией '''--swap=<SIZE>''' либо в файле '''SWP.img''' следует предварительно подготовить образ SWAP-раздела.
Идеологически запуск данного скрипта эквивалентен той части '''grub-install''', которая отвечает за подготовку и размещение файлов в определённых каталогах. Поскольку для финального загрузочного диска важна разметка, этот скрипт всегда используется в паре с '''parts2img''' с учётом соответствующих опций. Так, если '''grub2dirs''' вызывался с опцией '''--guid-gpt''', parts2img должен вызываться с этой же опцией. То же относится и к опции '''--no-rootfs'''. Если '''grub2dirs''' вызывался с опцией '''--swap-part''', parts2img должен вызываться с опцией '''--swap=<SIZE>''' либо в файле '''SWP.img''' следует предварительно подготовить образ SWAP-раздела.


Обратите внимание: начиная с версии '''1.1-alt1''' параметр '-r' ('''--root''') устарел. Вместо него следует использовать '-U' ('''--uuid'''). Начиная с этой версии также появилась возможность указывать альтернативный корень "для других архитектур", что позволяет заранее распаковать необходимые RPM'ки с установочного носителя во временный каталог и указать к нему путь через '-f' ('''--foreign''').
Обратите внимание: начиная с версии '''1.1-alt1''' параметр '-r' ('''--root''') устарел. Вместо него следует использовать '-U' ('''--uuid'''). Начиная с этой версии также появилась возможность указывать альтернативный корень "для других архитектур", что позволяет заранее распаковать необходимые RPM'ки с установочного носителя во временный каталог и указать к нему путь через '-f' ('''--foreign'''). Начиная с версии '''1.3-alt1''' появился параметр '-n' ('''--no-rootfs'''), используемый совместно с режимом загрузки UEFI на x86_64 и aarch64. Он позволяет разместить все файлы на единственном разделе ESP, отказавшись от создания системного раздела extfs.


=== dir2extfs ===
=== dir2extfs ===
Строка 393: Строка 396:
<pre>
<pre>
$ dir2extfs -h
$ dir2extfs -h
Usage: dir2extfs [<options>...] [--] [<srcdir>] <image> [<size>]
Usage: dir2extfs.sh [<options>...] [--] [<srcdir>] <image> [<size>]


mke2fs pass through options (not used in append mode):
mke2fs pass through options (not used in append mode):
Строка 421: Строка 424:
                         mke2fs options can't be used in append mode.
                         mke2fs options can't be used in append mode.
   -d  <filename>        Specify devices table for populate /dev nodes.
   -d  <filename>        Specify devices table for populate /dev nodes.
  -e, --exclude <path>  Specify path to exclude from image.
   -M, --mindev          Populate minimalistic /dev nodes.
   -M, --mindev          Populate minimalistic /dev nodes.
   -n, --no-clean        Keep temporary files on exit.
   -n, --no-clean        Keep temporary files on exit.
Строка 434: Строка 438:
</pre>
</pre>


Без опции '''--append''' вызов данного скрипта схож с созданием файловой системы через '''mkfs.ext2''', при этом большинство опций поддерживается и передаётся прямо в '''mke2fs'''. Опция '''--append''' позволяет добавить файлы к уже существующему образу extfs. Чтобы файлы в образ попадали сразу с нужными владельцами и правами, запуск должен производиться в хэшере под пользователем '''rooter''', а версия mke2fs должна быть не менее '''1.44''' (p9 и Сизиф).
Без опции '''--append''' вызов данного скрипта схож с созданием файловой системы через '''mkfs.ext2''', при этом большинство опций поддерживается и передаётся прямо в '''mke2fs'''. Опция '''--append''' позволяет добавить файлы к уже существующему образу extfs. Чтобы файлы в образ попадали сразу с нужными владельцами и правами, запуск должен производиться в хэшере под пользователем '''rooter''', а версия mke2fs должна быть не менее '''1.44''' (p9, p10 и Сизиф).


Опции '''-d <filename>''' и '''--mindev''' позволяют добавить в образ каталог '''/dev''' с соответствующим содержимым, что может быть полезно для реальной корневой Linux-системы, но не только. Те же опции обеспечивают создание всевозможных PIPE/FIFO-файлов, симлинков, задание альтернативных прав доступа к файлам, задание владельцев, отличных от root. Подробнее см. скрипт '''dev2extfs'''.
Опции '''-d <filename>''' и '''--mindev''' позволяют добавить в образ каталог '''/dev''' с соответствующим содержимым, что может быть полезно для реальной корневой Linux-системы, но не только. Те же опции обеспечивают создание всевозможных PIPE/FIFO-файлов, симлинков, задание альтернативных прав доступа к файлам, задание владельцев, отличных от root. Подробнее см. скрипт '''dev2extfs'''.
Строка 441: Строка 445:


Можно создавать образы указанного в MiB размера -- главное, чтобы хватило места для размещения в нём всех файлов. Также можно указывать в MiB резервируемое свободное место для обычного пользователя. Если не указывать ничего из перечисленного, свободное место в образе будет стремиться к нулю, так задумано.
Можно создавать образы указанного в MiB размера -- главное, чтобы хватило места для размещения в нём всех файлов. Также можно указывать в MiB резервируемое свободное место для обычного пользователя. Если не указывать ничего из перечисленного, свободное место в образе будет стремиться к нулю, так задумано.
Обратите внимание: начиная с версии '''1.3-alt1''' добавлена опция -e ('''--exclude'''), позволяющая указать путь, который не следует включать в образ. Чтобы исключить несколько путей опция может указываться многократно.


=== dir2vfat ===
=== dir2vfat ===
Строка 521: Строка 527:
<pre>
<pre>
$ parts2img -h
$ parts2img -h
Usage: parts2img [<options>...] [--] [<partsdir>] [<image>]
Usage: parts2img.sh [<options>...] [--] [<partsdir>] [<image>]


Options:
Options:
   -g, --guid-gpt        Use GPT disk label instead MBR.
   -g, --guid-gpt        Use GPT disk label instead MBR.
   -n, --no-clean        Keep temporary files on exit.
   -n, --no-clean        Keep temporary files on exit.
      --no-rootfs        Do not use 'sys-part' sub-directory.
   -q, --quiet            Suppress additional diagnostic.
   -q, --quiet            Suppress additional diagnostic.
   -s, --swap=<size>      Specify SWAP partition size, in MiB.
   -s, --swap=<size>      Specify SWAP partition size, in MiB.
Строка 534: Строка 541:
</pre>
</pre>


Ищет файлы образов разделов и другие в каталоге partsdir (либо текущем, если partsdir не указан), и на их основе создаёт окончательный образ загрузочного диска. Если не указан целевой образ, будет создан файл '''probe.img''' в том же каталоге, что исходные файлы. Образы разделов всегда выравниваются по границе 1MiB. Финальная разметка диска создаётся автоматически и зависит от опций '''--guid-gpt''', '''--swap=<SIZE>''' и наличия в partsdir файлов с определёнными именами:
Ищет файлы образов разделов и другие в каталоге partsdir (либо текущем, если partsdir не указан), и на их основе создаёт окончательный образ загрузочного диска. Если не указан целевой образ, будет создан файл '''probe.img''' в том же каталоге, что исходные файлы. Образы разделов всегда выравниваются по границе 1MiB. Финальная разметка диска создаётся автоматически и зависит от опций '''--guid-gpt''', '''--swap=<SIZE>''', '''--no-rootfs''' (начиная с версии '''1.3-alt1''') и наличия в partsdir файлов с определёнными именами:


* '''EFI.img''' -- VFAT образ раздела EFI System Partition.
* '''EFI.img''' -- VFAT образ раздела EFI System Partition.
Строка 542: Строка 549:
* '''powerpc-ieee1275-powerpc.elf''' -- предположительно, содержимое загрузочного раздела '''Power PReP''', размером 1-7 MiB.
* '''powerpc-ieee1275-powerpc.elf''' -- предположительно, содержимое загрузочного раздела '''Power PReP''', размером 1-7 MiB.
* '''SWP.img''' -- заранее подготовленный с особыми параметрами раздел SWAP для полноценной корневой системы.
* '''SWP.img''' -- заранее подготовленный с особыми параметрами раздел SWAP для полноценной корневой системы.
* '''SYS.img''' -- корневой (системный) раздел Linux, единственный обязательный во всех случаях.
* '''SYS.img''' -- корневой (системный) раздел Linux, единственный обязательный во всех случаях, если не указана опция '''--no-rootfs'''.
* '''HOME.img''' -- дополнительный раздел '''/home''' с данными пользователя для полноценной корневой системы.
* '''HOME.img''' -- дополнительный раздел '''/home''' с данными пользователя для полноценной корневой системы.


Строка 571: Строка 578:


Options:
Options:
  -B, --keep-boot        Use existings /boot directory.
   -b, --bios-only        Make BIOS-only boottable system on x86.
   -b, --bios-only        Make BIOS-only boottable system on x86.
   -D, --datadir=<PATH>  Add specified files to the boot disk.
   -D, --datadir=<PATH>  Add specified files to the boot disk.
Строка 578: Строка 586:
   -e, --excludes=<FILE>  Set list for exclude files from ISO-9660.
   -e, --excludes=<FILE>  Set list for exclude files from ISO-9660.
   -f, --files=<FILE>    Set list for include files from ISO-9660.
   -f, --files=<FILE>    Set list for include files from ISO-9660.
  -G, --keep-grub        Use existings /boot/grub/grub.cfg config.
   -g, --guid-gpt        Use GUID/GPT disk label instead BIOS/MBR.
   -g, --guid-gpt        Use GUID/GPT disk label instead BIOS/MBR.
   -m, --mode=<MODE>      One of the followed repack modes: rescue,
   -m, --mode=<MODE>      One of the followed repack modes: rescue,
Строка 594: Строка 603:
   -T, --timeout=<SECS>  Specify boot menu timeout, in seconds.
   -T, --timeout=<SECS>  Specify boot menu timeout, in seconds.
   -t, --target=<ARCH>    Use specified target architecture: i586,
   -t, --target=<ARCH>    Use specified target architecture: i586,
                         x86_64, aarch64, armh, ppc64le or e2k/v4.
                         x86_64, aarch64, armh, ppc64le or e2k/v4/v5.
   -U, --uuid=<UUID>      Specify UUID of the ROOT filesystem.
   -U, --uuid=<UUID>      Specify UUID of the ROOT filesystem.
   -u, --uefi-only        Make UEFI-only boottable system on x86.
   -u, --uefi-only        Make UEFI-only boottable system on x86.
Строка 603: Строка 612:
</pre>
</pre>


Достаточно мощный конвертер, у которого много разных возможностей. Подробно описан на отдельной странице.
Достаточно мощный конвертер, у которого много разных возможностей. Подробно описан [[Usermode-fs-tools/iso2stick|на отдельной странице]].


=== extfsinfo ===
=== extfsinfo ===
Строка 668: Строка 677:
== Под занавес ==
== Под занавес ==


Настоящий набор скриптов (4118 строк) впервые опубликован в репозитории Сизиф '''15.10.2020''' под свободной лицензией '''GPL v3+'''. Первоначальный автор программы: '''Леонид Кривошеин''' -- спасибо подвигшим на это '''mike@''' и '''antohami@'''. Присоединение к разработке приветствуется!
Настоящий набор скриптов (более 4 тыс. строк) впервые опубликован в репозитории Сизиф '''15.10.2020''' под свободной лицензией '''GPL v3+'''. Первоначальный автор программы: '''Леонид Кривошеин''' -- спасибо подвигшим на это '''mike@''' и '''antohami@'''. Присоединение к разработке приветствуется!





Текущая версия от 15:24, 30 января 2022

Пакет usermode-fs-tools предоставляет утилиты для работы с файловыми системами в режиме обычного пользователя, т.е. не требуется получения прав root чтобы создавать загрузочные образы дисков и распаковывать их содержимое. Данный набор утилит позволяет работать с образами файловых систем ext2/3/4 и vfat, как с обычными архивами, форматировать, подбирать нужный размер, дополнять их файлами, заполнять /dev, назначать любые права и владельцев, устанавливать системный загрузчик.

Краткий обзор инструментов

  • grub2dirs: выполняет grub-install в несколько каталогов в режиме обычного пользователя.
  • dir2extfs: упаковывает содержимое каталога в образ файловой системы extfs.
  • dir2vfat: упаковывает содержимое каталога в образ файловой системы vfat.
  • dev2extfs: заполняет /dev узлами устройств в существующем образе extfs.
  • parts2img: объединяет образы разделов в единый образ диска.
  • img2parts: разделяет образ диска на образы отдельных разделов.
  • iso2stick: перепаковывает официальные образы ALT ISO-9660 в образы USB-дисков.
  • extfsinfo: выводит информацию об образе файловой системы extfs.
  • extfs2dir: распаковывает содержимое файловой системы extfs в каталог.
  • vfat2dir: распаковывает содержимое файловой системы vfat в каталог.

Поддерживаемые целевые архитектуры и возможности

Упаковка и распаковка образов дисков extfs и vfat реализована на SHELL-скриптах с использованием coreutils, util-linux, e2fsprogs, mtools и dosfstools, таким образом поддерживается на всех архитектурах, используемых в ОС Альт. Установка загрузчика GRUB в режиме обычного пользователя возможна на всех архитектурах, для которых в ОС Альт собирается GRUB, и даже чуть больше (добавлена поддержка 32-бит ARM). Загрузочные образы дисков можно также создавать для e2k, e2kv4, e2kv5 и ppc64le.

На 64-бит платформах Intel возможна установка подписанного загрузчика для поддержки SecureBoot в режиме загрузки UEFI. В версии для p9 и Сизифа (но не на p8 и ниже) SecureBoot может поддерживаться также на 32-бит платформах Intel (i386-efi). Допускается разметка образов дисков с использованием схем разметки DOS/MBR и GUID/GPT. Для работы с образами дисков и разделов, помимо grub-efi, grub-pc и сопутствующих пакетов, также используются утилиты dd, fdisk и sfdisk.

Средства и особенности реализации

В современных версиях mke2fs появилась опция -d <каталог>, позволяющая заполнить образ форматируемой файловой системы из указанного каталога. Для ранних версий и для распаковки используется утилита debugfs, работающая через libe2fs со структурами на диске без обращения к ядру ОС. dir2extfs во многом повторяет семантику mke2fs, поддерживает большую часть передаваемых ей опций, а также реализует механизм максимального уменьшения образа (resize2fs) и резервирования заданного пространства. dir2vfat реализует схожее поведение по аналогии, при этом являясь надстройкой над mkfs.fat, во многом повторяя её семантику.

Установка загрузчика GRUB в режиме UEFI тривиальна, поскольку это просто копирование файлов в нужные каталоги. Для поддержки Power PReP раздела (SLOF-загрузка) grub-ieee1275 умеет создавать соответствующий powerpc.elf и другие необходимые файлы. На e2k/e2kv4/e2kv5 GRUB не ставится, там достаточно создать отдельный раздел /boot (ext2) и поместить в него boot.conf с нужным содержимым. GRUB stage0 (boot.img) на Intel/PC помещается в первый сектор образа диска, GRUB stage1.5 (core.img) -- в следующие сектора при DOS/MBR-разметке или в раздел BIOS Boot при GUID/GPT-разметке. При этом адреса нужных секторов корректируются прямо в образе диска.

Обычный вызов grub-install под пользователем root выполняет множество действий, вызывает несколько программ и требует прямой доступ к дискам и разделам. Настоящий набор скриптов тоже разделяет установку загрузчика на две логические части. Сначала скриптом grub2dirs и вызываемым им grub-mkimage создаются все необходимые файлы в отдельных подкаталогах. Затем, когда отдельные образы разделов полностью подготовлены и сконвертированы в соответствующие *.img файлы, они объединяются в единый образ диска скриптом parts2img. На данном этапе выполняется заключительная часть встраивания различных стадий загрузчика, в том числе, с использованием ранее созданных файлов.

Установка grub-efi в режиме обычного пользователя схожа с запуском grub-install --removable ..., а установка grub-pc в режиме обычного пользователя аналогична запуску grub-install --no-rs-codes ..., т.е. код Рида-Соломона в core.img не встраивается, хотя по умолчанию grub-bios-setup это делает.

Практика использования

Нет способа лучше понять инструмент, чем на конкретном примере его использования. В состав каждой утилиты входит встроенная помощь, её можно получить, запустив скрипт с опцией --help. Здесь и далее я буду использовать длинные названия опций для лучшего понимания.

Сначала вездесущий Intel

Возьмём за основу свежий ISO-образ ALT Rescue и создадим из него руками деплойный USB-stick. Для этого нам потребуется:

1) Создать временный/рабочий каталог и перейти в него. Все файлы из него потом можно будет удалить. Места в нём должно быть достаточно для создания, по меньшей мере, двух образов.

$ cd ~/path/to/workdir/

2) Сгенерировать UUID будущего корневого (системного) раздела флэшки и сохранить его куда-нибудь.

$ read uuid < /proc/sys/kernel/random/uuid
$ echo $uuid
56d838b1-ace9-45fc-ad10-50c89fd75356

3) Подготовить файлы GRUB для загрузки в режимах UEFI и Legacy BIOS:

$ grub2dirs --quiet --dual-boot --secure-boot --uuid=$uuid
$ ls -1
efi-part
sys-part
i386-efi-core.efi
i386-pc-boot.img
i386-pc-core.img
x86_64-efi-core.efi

В результате в текущем каталоге будут созданы подкаталоги: efi-part с файлами будущего образа EFI, sys-part с файлами будущего образа корневого раздела и ещё несколько файлов, которые потребуются на заключительной стадии встраивания загрузчика в финальный образ диска. С указанными параметрами (по умолчанию) мы готовимся к созданию образа диска с разметкой DOS/MBR. Если же требуется разметка GUID/GPT, следует добавить опцию --guid-gpt.

Опция --secure-boot предписывает по возможности использовать для UEFI-загрузки подписанный ALT Shim'ом GRUB, что аналогично запуску grub-install --uefi-secure-boot ... или без параметров. Опция --dual-boot предписывает на 64-бит архитектурах добавлять UEFI-загрузчик и для 32-бит платформ, т.е. мы будем ставить цели x86_64-efi и i386-efi одновременно. Для 32-бит цели ALT Shim также используется, при его наличии.

4) Вытащить из ISO-образа ALT Rescue ядро, initrd, squashfs стадии rescue и расположить их в определённых местах будущей корневой системы.

Обратите внимание, что в зависимости от сборки ядро с initrd могут называться по-разному и находиться в разных местах. Обычно их следует искать в /boot, в /EFI/BOOT или в /syslinux/alt0, названия могут иметь суффикс в виде версии, initrd обычно называется либо initrd.img, либо full.cz (на старых дисках). Для нашего примера существенное значение имеет имя, под которым мы это сохраняем при копировании.

$ cp -Lf /media/ALT-Rescue/rescue sys-part/
$ cp -Lf /media/ALT-Rescue/boot/vmlinuz sys-part/boot/vmlinuz
$ cp -Lf /media/ALT-Rescue/boot/initrd.img sys-part/boot/full.cz

5) Подсчитать размер RAM-диска для размещения стадии rescue и запомнить его где-то.

$ ramsize=$((4 * $(du -lsB4k sys-part/rescue |cut -f1) + 1))
$ echo $ramsize
471949

6) Создать простую конфигурацию загрузчика, вставив в него полученные ранее значения $uuid и $ramsize.

$ cat > sys-part/boot/grub/grub.cfg <<EOF
insmod part_msdos
insmod part_gpt
insmod ext2
insmod gzio

if keystatus --shift; then
  set timeout=-1
else
  set timeout=60
fi

menuentry 'Rescue Deploy (dangerous for you data!)' --class gnu-linux --class gnu --class os --unrestricted {
	search --no-floppy --fs-uuid --set=root $uuid
	echo 'Loading Linux kernel...'
	linux /boot/vmlinuz initrd=/boot/full.cz fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:$uuid ramdisk_size=$ramsize stagename=rescue splash=0 showopts quiet autorun=method:disk 
	echo 'Loading initial RAM-disk...'
	initrd /boot/full.cz
}
EOF

7) Создать скрипт автоматического запуска, он будет стартовать при загрузке на первой консоли.

$ cat > sys-part/autorun <<EOF
#!/bin/sh -efu

echo; echo
echo "ALT Deploy TEST-PROGRAM started..."
echo; echo
exec /bin/bash -i

EOF
$ chmod +x sys-part/autorun

Ничто не мешает добавить сюда же и другие файлы, по необходимости.

8) Создать образ корневого (системного) раздела будущей флэшки: SYS.img.

$ dir2extfs --quiet -L alt-autorun -U $uuid sys-part SYS.img
$ rm -rf sys-part

9) Создать образ EFI-раздела будущей флэшки: EFI.img.

$ dir2vfat --quiet --pad-space -n STICK-ESP efi-part EFI.img
$ rm -rf efi-part

10) Объединить все ранее созданные файлы и образы разделов в единый образ загрузочного диска.

$ parts2img --quiet /tmp/MBR.img

Оставшиеся файлы в текущем каталоге можно удалить, а полученный образ /tmp/MBR.img записать на флэшку командой dd. Опция --guid-gpt, если задавалась на шаге 3, должна задаваться и на этом.

Закрепление пройденного

Теперь ещё раз всё вместе, исключая ручное создание и копирование файлов, сначала для DOS/MBR-разметки:

grub2dirs -qds -U $uuid
dir2extfs -q -L alt-autorun -U $uuid sys-part SYS.img
dir2vfat -q -P -n STICK-ESP efi-part EFI.img
rm -rf efi-part sys-part
parts2img -q /tmp/MBR.img

И то же самое для разметки GUID/GPT:

grub2dirs -qgds -U $uuid
dir2extfs -q -L alt-autorun -U $uuid sys-part SYS.img
dir2vfat -q -P -n STICK-ESP efi-part EFI.img
rm -rf efi-part sys-part
parts2img -qg /tmp/GPT.img

В результате мы получим образ загрузочной флэшки, на первой консоли которой будет стартовать наш скрипт. Загрузка в данном случае поддерживается в режиме UEFI с включенным SecureBoot, без SecureBoot, на 64-bit и 32-bit UEFI-firmware, а также в режиме Legacy BIOS (i386-pc). Спрашивается: зачем это надо, если исходная ALT Rescue и так всё это умеет "из коробки"? Ответ прост: мы добавили автоматику, можем добавить нужные нам файлы в образ, убрать "лишнее", а ещё мы заменили загрузчики isolinux и refind+elilo+grub32 на GRUB, "оторвав графику", а могли бы "оторвать" не нужные варианты загрузки, например, сделав образ только для Legacy/BIOS-загрузки или только для UEFI-загрузки без поддержки SecureBoot. Начиная с версии 1.1-alt1 всё перечисленное можно выполнить одной командой -- см. описание #iso2stick.

Возвращаем всё обратно

Начинаем с "чистого листа". Всё, что нам потребуется -- ранее созданный образ.

$ cd ~/path/to/workdir/
$ rm -f *
$ ls -l /tmp/MBR.img
-rw-r--r-- 1 klark klark 575668224 окт 15 15:32 /tmp/MBR.img

Посмотрим на полученный образ диска:

$ img2parts --list /tmp/MBR.img
part1	3M	EFI
part2	545M	EXTFS

Видим два раздела -- 3M EFI и 545M extfs. Посмотрим внимательней:

$ img2parts --info /tmp/MBR.img
Disk /tmp/MBR.img: 549 MiB, 575668224 bytes, 1124352 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x13d1090d

Name: part1-fat.img
Start: 2048
End: 8191
Sectors: 6144
Cylinders: 1
Size: 3M
Id: ef
Type: EFI (FAT-12/16/32)
Start-C/H/S: 0/32/33
End-C/H/S: 0/130/2

Name: part2-ext.img
Boot: *
Start: 8192
End: 1124351
Sectors: 1116160
Cylinders: 70
Size: 545M
Id: 83
Type: Linux
Start-C/H/S: 0/130/3
End-C/H/S: 69/251/54
Attrs: 80

Теперь распакуем всё доступное содержимое:

$ img2parts /tmp/MBR.img
Extracting 'part1-fat.img'...
Extracting 'part2-ext.img'...
$ ls -1
part1-fat.img
part2-ext.img

Посмотрим ещё внимательней на раздел extfs:

$ extfsinfo part2-ext.img
fstype:	ext2
label:	alt-autorun
uuid:	56d838b1-ace9-45fc-ad10-50c89fd75356
imgsz:	545 MiB
blksz:	4096 bytes
alloc:	544 MiB
free:	0 MiB
rsrvd:	0 MiB
usage:	100 %

Распакуем раздел vfat:

$ mkdir efi-part
$ vfat2dir -s efi-part part1-fat.img
Copying ::/
Copying ::/EFI
Copying ::/EFI/enroll
Copying ::/EFI/enroll/altlinux.cer
Copying ::/EFI/BOOT
Copying ::/EFI/BOOT/BOOTX64.EFI
Copying ::/EFI/BOOT/grubx64.efi
Copying ::/EFI/BOOT/BOOTIA32.EFI
Copying ::/EFI/BOOT/grub.cfg
Copying ::/.pad
$ rm -f part1-fat.img

Распакуем раздел extfs:

$ mkdir sys-part
$ extfs2dir -q part2-ext.img sys-part
$ rm -f part2-ext.img

Работа с образами дисков GUID/GPT полностью аналогична:

$ img2parts --list /tmp/GPT.img
part1	3M	EFI
part2	1M	SKIP
part3	546M	EXTFS

$ img2parts --info /tmp/GPT.img
Disk /tmp/GPT.img: 551 MiB, 577765376 bytes, 1128448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 56D7DD51-4C6E-4782-BE5D-97178338A097

Name: part1-fat.img
Start: 2048
End: 8191
Sectors: 6144
Size: 3M
Type: EFI System
Type-UUID: C12A7328-F81F-11D2-BA4B-00A0C93EC93B
UUID: 96F1D5BE-5836-4479-A00F-E848CE314BE9

Name: part3-ext.img
Start: 10240
End: 1128414
Sectors: 1118175
Size: 546M
Type: Linux filesystem
Type-UUID: 0FC63DAF-8483-4772-8E79-3D69D8477DE4
UUID: 9C623A02-C913-4D5F-8A26-0FB43B7A35E4
Attrs: LegacyBIOSBootable

Эльбрус e2k/e2kv4/e2kv5

На e2k/e2kv4/ekv5 GRUB не ставится, соответственно, скрипт grub2dirs не используется. Нужно подготовить раздел ext2, который будет монтироваться как /boot, сложить туда ядро, initrd и файл boot.conf примерно такого содержания:

$ cd ~/path/to/workdir/
$ mkdir -p e2k-part/alt0
$ cp -Lf .../vmlinuz e2k-part/alt0/vmlinux.0
$ cp -Lf .../full.cz e2k-part/alt0/full.cz
$ cat > e2k-part/boot.conf <<EOF
default=rescue
timeout=60

label=rescue
    partition=0
    image=/alt0/vmlinux.0
    cmdline=console=ttyS0,115200 console=tty0 hardreset fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:$uuid stagename=rescue
    initrd=/alt0/full.cz

label=deploy
    partition=0
    image=/alt0/vmlinux.0
    cmdline=console=ttyS0,115200 console=tty0 hardreset fastboot live lowmem root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:$uuid stagename=rescue autorun=method:disk
    initrd=/alt0/full.cz
EOF
$ dir2extfs --quiet -L E2K-BOOT e2k-part E2K.img
$ rm -rf e2k-part

Обратите внимание: полученный образ должен называться E2K.img, на это имя ориентируется скрипт parts2img. Предупреждение: на практике ещё не проверялось, требуется помощь и железо.

aarch64 и armh

Для ARM64 есть поддержка загрузки UEFI без SecureBoot (цель arm64-efi). В апстримном grub-efi также поддерживается цель arm-efi, но в Альте grub-efi собран пока без неё. Так что ставить можно с --dual-boot на aarch64, равно как и ставить просто на armh только после пересборки grub-efi с включением этой поддержки. Ставить на aarch64 при наличии grub-efi без --dual-boot безусловно можно и сейчас. Предупреждение: на практике ещё не проверялось, требуется помощь и железо.

Power SLOF: ppc64le

Для данной архитектуры создаётся отдельный загрузочный раздел Power PReP определённого типа, в него помещается powerpc.elf, на системный диск также помещаются определённые файлы. Перечисленное выполняется парой скриптов grub2dirs и parts2img автоматически. Предупреждение: на практике ещё не проверялось, требуется помощь и железо.

Формальное описание

grub2dirs

$ grub2dirs -h
Usage: grub2dirs.sh [<options>...] [--] [<partsdir>]

Options:
  -b, --bios-only        Make BIOS-only boottable system on x86.
  -d, --dual-boot        Add both 32-bit and 64-bit UEFI firmware
                         boot loaders for 64-bit target system,
                         such as x86_64 or aarch64.
  -f, --foreign=<PATH>   Use alternate root path for search
                         required source files.
  -g, --guid-gpt         Use GUID/GPT disk label instead BIOS/MBR.
  -l, --libdir=<PATH>    Use images and modules under specified
                         grub directory <PATH> (default is
                         "/usr/lib64/grub").
  -m, --module=<NAME>    Pre-load specified grub module.
                         This option can set many times.
  -n, --no-rootfs        Do not use 'sys-part' sub-directory.
  -q, --quiet            Suppress additional diagnostic.
  -S, --swap-part        Add SWAP partition before ROOT.
  -s, --secure-boot      Use ALT shim's for UEFI Secure Boot.
  -t, --target=<ARCH>    Use specified target architecture: i586,
                         x86_64, aarch64, armh, ppc64le or e2k/v4/v5.
  -u, --uefi-only        Make UEFI-only boottable system on x86.
  -U, --uuid=<UUID>      UUID of the ROOT filesystem.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

Идеологически запуск данного скрипта эквивалентен той части grub-install, которая отвечает за подготовку и размещение файлов в определённых каталогах. Поскольку для финального загрузочного диска важна разметка, этот скрипт всегда используется в паре с parts2img с учётом соответствующих опций. Так, если grub2dirs вызывался с опцией --guid-gpt, parts2img должен вызываться с этой же опцией. То же относится и к опции --no-rootfs. Если grub2dirs вызывался с опцией --swap-part, parts2img должен вызываться с опцией --swap=<SIZE> либо в файле SWP.img следует предварительно подготовить образ SWAP-раздела.

Обратите внимание: начиная с версии 1.1-alt1 параметр '-r' (--root) устарел. Вместо него следует использовать '-U' (--uuid). Начиная с этой версии также появилась возможность указывать альтернативный корень "для других архитектур", что позволяет заранее распаковать необходимые RPM'ки с установочного носителя во временный каталог и указать к нему путь через '-f' (--foreign). Начиная с версии 1.3-alt1 появился параметр '-n' (--no-rootfs), используемый совместно с режимом загрузки UEFI на x86_64 и aarch64. Он позволяет разместить все файлы на единственном разделе ESP, отказавшись от создания системного раздела extfs.

dir2extfs

$ dir2extfs -h
Usage: dir2extfs.sh [<options>...] [--] [<srcdir>] <image> [<size>]

mke2fs pass through options (not used in append mode):
  -C  <number>           Specify the size of cluster, in bytes.
  -f  <number>           Specify the size of fragment, in bytes.
  -G  <number>           Specify the number of block groups.
  -g  <number>           Specify the number of blocks in a block group.
  -I  <number>           Specify the size of each inode, in bytes.
  -i  <number>           Specify the bytes/inode ratio.
  -L  <label>            Specify the filesystem volume label.
  -m  <number>           Specify the percentage of the filesystem
                         blocks, reserved for the super-user.
                         The default percentage is 5%.
  -N  <number>           Overrides the default calculation
                         of the number of inodes that should
                         be reserved for the filesystem.
  -o  <creator-os>       Overrides the default value of the
                         "creator operating system" field.
  -T  <usage-type...>    Specify one or more usage types, using a
                         comma separated list and /etc/mke2fs.conf.
  -U  <UUID>             Specify the filesystem volume UUID.

See man 8 mke2fs for more details.

Common options:
  -a, --append           Add files to an existing extfs image file,
                         mke2fs options can't be used in append mode.
  -d  <filename>         Specify devices table for populate /dev nodes.
  -e, --exclude <path>   Specify path to exclude from image.
  -M, --mindev           Populate minimalistic /dev nodes.
  -n, --no-clean         Keep temporary files on exit.
  -q, --quiet            Suppress additional diagnostic.
  -r  <number>           Reserve specified free space, in MiB.
  -t  <fstype>           Specify the filesystem type (ext2, ext3,
                         ext4 or ext4new - last is alias for ext4
                         with some additional features).
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

Без опции --append вызов данного скрипта схож с созданием файловой системы через mkfs.ext2, при этом большинство опций поддерживается и передаётся прямо в mke2fs. Опция --append позволяет добавить файлы к уже существующему образу extfs. Чтобы файлы в образ попадали сразу с нужными владельцами и правами, запуск должен производиться в хэшере под пользователем rooter, а версия mke2fs должна быть не менее 1.44 (p9, p10 и Сизиф).

Опции -d <filename> и --mindev позволяют добавить в образ каталог /dev с соответствующим содержимым, что может быть полезно для реальной корневой Linux-системы, но не только. Те же опции обеспечивают создание всевозможных PIPE/FIFO-файлов, симлинков, задание альтернативных прав доступа к файлам, задание владельцев, отличных от root. Подробнее см. скрипт dev2extfs.

Поддерживается создание файловых систем ext2, ext3, ext4 и ext4new. Последняя требует отдельного пояснения. mke2fs до версии 1.43 создавала ext4 с одними возможностями, но начиная с версии 1.43, дефолты e2fsprogs поменялись таким образом, что файловая система ext4 по умолчанию создаётся с дополнительными фичами: 64bit и metadata_csum, поддержка которых появилась в новых ядрах. Для создания дистрибутивных образов такая неоднозначность неудобна и чтобы её избежать, было добавлено определение файловой системы ext4new для тех случаев, когда явно требуется создание ext4 с двумя указанными фичами. Разумеется, создать ext4new на p8 не получится.

Можно создавать образы указанного в MiB размера -- главное, чтобы хватило места для размещения в нём всех файлов. Также можно указывать в MiB резервируемое свободное место для обычного пользователя. Если не указывать ничего из перечисленного, свободное место в образе будет стремиться к нулю, так задумано.

Обратите внимание: начиная с версии 1.3-alt1 добавлена опция -e (--exclude), позволяющая указать путь, который не следует включать в образ. Чтобы исключить несколько путей опция может указываться многократно.

dir2vfat

$ dir2vfat -h
Usage: dir2vfat [<options>...] [--] [<srcdir>] <image> [<size>]

mkfs.fat pass through options (not used in append mode):
  -A                     Use Atari variation of the MS-DOS filesystem.
  -b  <backup-sector>    Location of the backup boot sector for FAT32.
  -D  <drive-number>     Specify the BIOS drive number.
  -F  <FAT-size>         Select the FAT type used (12, 16 or 32 bit).
  -f  <number-of-FATs>   Specify the number of file allocation tables.
  -H  <hidden-sectors>   Select the number of hidden sectors in the volume.
  -i  <volume-id>        Sets the volume ID of the newly created filesystem.
  -M  <FAT-media-type>   Media type to be stored in the FAT boot sector.
  -m  <message-file>     Sets the message the user receives on attempts
                         to boot this filesystem without having properly
                         installed an operating system.
  -n  <volume-name>      Sets the volume name (label) of the filesystem.
  -R  <reserved-sects>   Select the number of reserved sectors.
  -r  <root-entries>     Select the number of entries available in the
                         root directory.
  -S  <log-sect-size>    Specify the number of bytes per logical sector.
  -s  <sects-per-clust>  Specify the number of disk sectors per cluster.
  --invariant            Use constants for normally randomly generated or
                         time based data such as volume ID and creation time.

See man 8 mkfs.fat for more details.

Common options:
  -a, --append           Add files to an existing VFAT image file,
                         mkfs.fat options can't be used in append mode.
  -p  <reserved-space>   Reserve specified free space, in MiB.
  -P, --pad-space        Fill all free space by zero's.
  -q, --quiet            Suppress additional diagnostic.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

dev2extfs

$ dev2extfs -h
Usage: dev2extfs [<options>...] [--] [<device-table>] <image>

Options:
  -m, --minimal          Populate minimalistic /dev.
  -n, --no-clean         Keep temporary files at exit.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Device table format and examples:
  <node>       <type> <major> <minor> <mode> <uid> <gid>
  /dev             d       -       -      -     -   -
  /dev/mem         c       1       1    640     0   0
  /dev/tty         c       5       0    666     0   5
  /dev/nvme0n1     b     259       1    660     0   6
  /dev/initctl     p       -       -      -     -   -
  /dev/stderr      l       -       -      -     -   /proc/self/fd/2
  /etc/shadow      f       -       -    600     0   0
  /usr/bin/passwd  f       -       -   2711     0   26

Node types:
  d  Directory,                 default mode: 0755
  f  Regular file,              default mode: 0644
  b  Block special device,      default mode: 0600
  c  Character special device,  default mode: 0600
  p  FIFO (named PIPE),         default mode: 0600
  l  Symbolic link,             mode no changed

Please, report bugs to https://bugzilla.altlinux.org/

parts2img

$ parts2img -h
Usage: parts2img.sh [<options>...] [--] [<partsdir>] [<image>]

Options:
  -g, --guid-gpt         Use GPT disk label instead MBR.
  -n, --no-clean         Keep temporary files on exit.
      --no-rootfs        Do not use 'sys-part' sub-directory.
  -q, --quiet            Suppress additional diagnostic.
  -s, --swap=<size>      Specify SWAP partition size, in MiB.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

Ищет файлы образов разделов и другие в каталоге partsdir (либо текущем, если partsdir не указан), и на их основе создаёт окончательный образ загрузочного диска. Если не указан целевой образ, будет создан файл probe.img в том же каталоге, что исходные файлы. Образы разделов всегда выравниваются по границе 1MiB. Финальная разметка диска создаётся автоматически и зависит от опций --guid-gpt, --swap=<SIZE>, --no-rootfs (начиная с версии 1.3-alt1) и наличия в partsdir файлов с определёнными именами:

  • EFI.img -- VFAT образ раздела EFI System Partition.
  • i386-pc-boot.img -- содержимое GRUB stage0, встраиваемое в первый сектор образа диска.
  • i386-pc-core.img -- содержимое GRUB stage1.5, встраиваемое в раздел BIOS Boot (BIOS Grub Partition) либо сразу за MBR.
  • E2K.img -- загрузочный раздел E2K /boot, описанный выше.
  • powerpc-ieee1275-powerpc.elf -- предположительно, содержимое загрузочного раздела Power PReP, размером 1-7 MiB.
  • SWP.img -- заранее подготовленный с особыми параметрами раздел SWAP для полноценной корневой системы.
  • SYS.img -- корневой (системный) раздел Linux, единственный обязательный во всех случаях, если не указана опция --no-rootfs.
  • HOME.img -- дополнительный раздел /home с данными пользователя для полноценной корневой системы.

Сразу после создания финального образа диска, исходные файлы удаляются. Можно указать --no-clean для изменения этого поведения.

img2parts

$ img2parts -h
Usage: img2parts [<options>] [--] <image> [<part-no>...]

Options:
  -c, --check            Check only for valid disk image.
  -i, --info             Show partition(s) information.
  -l, --list             List all partitions and exit.
  -o, --output=<path>    Specify directory for save files.
  -v, --version          Show this program version only.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

iso2stick

$ iso2stick -h
Usage: iso2stick [<options>...] [--] <iso9660> <image> [<size>]

Options:
  -B, --keep-boot        Use existings /boot directory.
  -b, --bios-only        Make BIOS-only boottable system on x86.
  -D, --datadir=<PATH>   Add specified files to the boot disk.
  -d, --dual-boot        Add both 32-bit and 64-bit UEFI firmware
                         boot loaders for 64-bit target system,
                         such as x86_64 or aarch64.
  -e, --excludes=<FILE>  Set list for exclude files from ISO-9660.
  -f, --files=<FILE>     Set list for include files from ISO-9660.
  -G, --keep-grub        Use existings /boot/grub/grub.cfg config.
  -g, --guid-gpt         Use GUID/GPT disk label instead BIOS/MBR.
  -m, --mode=<MODE>      One of the followed repack modes: rescue,
                         deploy, install, live, install+rescue,
                         install+live or install+live+rescue.
  -L, --lang=<LIST>      List of the languages, for example:
                         '"ru_RU=Russian" "en_US=English"'.
  -l, --initlang=<CODE>  Initial/default language code
                         ('ru_RU' used by default).
  -n, --no-clean         Keep temporary files on exit.
  -P, --pad-space        Fill free space on EFI-part by zero's.
  -q, --quiet            Suppress additional diagnostic.
  -r, --reserved=<SIZE>  Reserved space on the boot disk, in MiB.
  -S, --swap=<SIZE>      Specify SWAP partition size, in MiB.
  -s, --secure-boot      Use ALT shim's for UEFI Secure Boot.
  -T, --timeout=<SECS>   Specify boot menu timeout, in seconds.
  -t, --target=<ARCH>    Use specified target architecture: i586,
                         x86_64, aarch64, armh, ppc64le or e2k/v4/v5.
  -U, --uuid=<UUID>      Specify UUID of the ROOT filesystem.
  -u, --uefi-only        Make UEFI-only boottable system on x86.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

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

extfsinfo

$ extfsinfo -h
Usage: extfsinfo [<option>] [--] {<image>|<device>}

Options:
  -a, --allocated        Show allocated space only, in MiB.
  -b, --blksize          Show block size only, in bytes.
  -c, --check            Check only for extfs filesystem.
  -f, --free             Show free space only, in MiB.
  -i, --info             Show all information about image.
  -L, --label            Show filesystem volume label only.
  -r, --reserved         Show reserved space only, in MiB.
  -s, --size             Show image size only, in MiB.
  -t, --type             Show filesystem type only.
  -U, --uuid             Show filesystem UUID only.
  -u, --usage            Show percent of usage only.
  -v, --version          Show this program version only.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

Позволяет вывести оптом всю информацию о файловой системе extfs либо только одно указанное поле, что может быть полезно в скриптах. Например: LABEL="$(extfsinfo --label -- part3-ext.img)". Также можно использовать для проверки корректности образов файловой системы. Обратите внимание, что при выводе дифференцируется разница между ext4 и ext4new, так что если вторая по смыслу задачи не подходит, значение следует нормализовать:

fstype="$(extfsinfo --type -- part2-ext.img)"
[ "$fstype" != "ext4new" ] || fstype="ext4"

extfs2dir

$ extfs2dir -h
Usage: extfs2dir [<options>...] [--] <image> [<target>]

Options:
  -q, --quiet            Suppress additional diagnostic.
  -r, --root=<path>      Unpack specified directory only.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

vfat2dir

$ vfat2dir -h
Usage: vfat2dir [<options>...] [--] [<target>] <image> [<files>...]

Options:
  -s, --subdir           Recursive copy directories and their contents.
  -q, --quiet            Suppress additional diagnostic.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

Под занавес

Настоящий набор скриптов (более 4 тыс. строк) впервые опубликован в репозитории Сизиф 15.10.2020 под свободной лицензией GPL v3+. Первоначальный автор программы: Леонид Кривошеин -- спасибо подвигшим на это mike@ и antohami@. Присоединение к разработке приветствуется!


Enjoy! ;-)