Сборка образа

Внимание

Это заготовка страницы. Здесь приведены общие инструкции, тестирование которых не производилось. Окончательная версия страницы войдёт во вторую версию руководства LFA.

Всё готово для сборки img-образа, который в будущем будет пригоден для записи на SD-карту или eMMC-накопитель.

Общий процесс

В общем случае вам нужно собрать три образа:

  1. Заголовок, в который будет записан загрузчик U-Boot;
  2. Системный раздел, куда будет скопирована собранная система;
  3. Общий образ, объединяющий заголовочный и системный разделы вместе.

Общий образ повторяет структуру разделов, которая в итоге будет получена после записи этого образа на SD- или иной накопитель, с которого будет производиться загрузка. Однако важно отметить, что это не единственный верный путь для создания готового образа системы — как минимум из-за того, что загрузчик системы может располагаться не просто на другом разделе, он может быть расположен на другом накопителе вообще (некоторые материнские платы оснащены SPI NOR Flash небольшого объёма, которого достаточно для установки туда U-Boot или иной микропрограммы). Конкретный алгоритм действий по созданию готового образа системы, ровно как и его структура и принципы его создания, являются сугубо индивидуальными и подбираются в зависимости от оборудования и задач сборщика. Ниже представлены общие инструкции для большинства материнских плат по типу Raspberry Pi, Orange Pi и подобных.

Создание базовых файлов

Сначала создадим заголовок размером 2 Мб:

dd if=/dev/zero bs=1M count=2 of=bootloader.img

И копируем сохранённый образ U-Boot по смещению 128:

dd if=$LFA/bootloader.bin \
  conv=notrunc seek=128 \
  of=bootloader.img

Внимание

Вне зависимости от SoC (Allwinner, Broadcom или Rockchip), для которого вы собирали U-Boot, он был сохранён в файл $LFA/bootloader.bin. Так что имя файла в аргументе dd if=... правильное.

Теперь нужно создать образ, в котором будут содержаться файлы собранной системы:

dd if=/dev/zero bs=1M count=512 of=rootfs.img

Здесь размер образа составляет 512 Мб. В зависимости от требований и объёма собранной системы установите вместо 512 своё значение.

Создайте файловую систему на этом разделе:

mkfs.ext4 -L BOOT \
  -O ^metadata_csum -F \
  -b 4096 \
  -E stride=2,stripe-width=1024 \
  -L rootfs rootfs.img

Копирование файлов

Смонтируйте полученный образ и скопируйте в неё файлы нашей системы (саму систему, ядро, Devicetree и сценарий загрузки):

mkdir -pv /tmp/lfa_rootfs
sudo mount -v rootfs.img /tmp/lfa_rootfs

sudo cp -rfv $LFA_SYS/* /tmp/lfa_rootfs
sync

Внимание

Все действия здесь выполняются от имени пользователя lfa. Поскольку здесь используется программа sudo, вам нужно добавить пользователя lfa в группу wheel.

После копирования файлов размонтируйте образ:

sudo umount /tmp/lfa_rootfs

Создание окончательного образа

Объедините два образа в один:

dd if=rootfs.img conv=notrunc oflag=append bs=1M seek=2 of=bootloader.img

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

Созданный нами образ нерабочий, поскольку ещё не содержит таблицу разделов. Создайте её с помощью fdisk:

fdisk bootloader.img
o
n
p
1
4096
+512M

w

Значения новых команд:

После начала редактирования мы вводим команду o, чтобы создать пустую таблицу разделов MBR. Затем командой n создаём новый раздел. Выбираем тип, номер и первый сектор. Дело в том, что размер сектора равен 512 байт, т.е. 1 Кб равен двум секторам. Размер заголовка 2 Мб, т.е. 2048 Кб или 4096 секоторов. Размер раздела можно указать в Мб. Сохранение и выход командой w.

Переименуйте файл bootloader.img, дав ему более логичное и подходящее имя:

mv -v bootloader.img lfa-2.0.img

Сжатие образа

При необходимости вы можете сжать образ с помощью xz или любого другого архиватора, который вам больше нравится. Я часто видел img-образы, сжатые с помощью xz, поэтому использую его:

xz lfa-2.0.img

Запись образа на SD-карту

Теперь вы можете записать полученный образ на SD-карту. Для этого можете использовать dd:

sudo dd if=lfa-2.0.img of=/dev/sdX

где X - буква (a, b, c, etc.) устройства, на которое будет производиться запись образа, например, /dev/sdc. Обратите внимание на то, что в некоторых случаях вместо sdX имя устройства может быть и mmcblkX.

Также для записи можете использовать программу Balena Etcher.


Смотрите также: