Сборка образа для Allwinner
Данный раздел содержит инструкции по сборке загрузочного образа для плат, оснащённых Allwinner SoC.
Создание базовых файлов
Здесь вам нужно создать ряд образов (образ с загрузчиком и образ с собранной системой), которые потом будут «объединены» в один большой образ, пригодный для записи на загрузочный носитель и дальнейшей эксплуатации.
Создание образа с загрузчиком U-Boot
Обратите внимание на то, что в данном разделе предполагается, что вы запишете собранный образ на SD-карту. Тем не менее, некоторые платы с Allwinner SoC оснащены встроенной eMMC- или SPI NOR памятью, куда также можно установить загрузчик. Тем не менее, эти два варианта в руководстве не рассматриваются. Если вам нужно установить загрузчик на eMMC или SPI NOR Flash, воспользуйтесь сведениями из документации U-Boot.
Сначала создайте заголовок размером 2 Мб. Этот заголовок будет содержать скомпилированный ранее загрузчик.
dd if=/dev/zero bs=1M count=2 of=bootloader.img
Поскольку все системы на кристалле Allwinner пытаются найти загрузочный код в секторе №256 (128 Кб) SD-карты, подключенной к первому MMC-контроллеру, вам нужно записать собранный файл загрузчика по этому смещению в образ bootloader.img
:
dd if=$LFA/bootloader.bin \
conv=notrunc seek=128 bs=1k \
of=bootloader.img
Вне зависимости от SoC (Allwinner, Broadcom или Rockchip), для которого вы собирали U-Boot, он был сохранён в файл $LFA/bootloader.bin
. Так что имя файла в аргументе dd if=...
правильное.
Если вы собирали систему для старых Allwinner SoC (выпущенных до 2013 года), то эти SoC ищут загрузчик в секторе 16 (8 Кб). Для использования загрузчика U-Boot на старых SoC просто замените
seek=128
наseek=8
.
Создание образа с базовой ОС
С помощью dd
создайте образ нужного вам размера (не меньше объёма, занимаемого собранной системой LFA, расположенной в $LFA_SYS
).
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
.
После копирования файлов размонтируйте образ:
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
Смотрите также:
- How to prepare a SD card? (https://docs.armbian.com/).
- Allwinner SoC based boards (сборка загрузчика для плат на базе Allwinner SoC).