Не хотел пользоваться Armbian, откуда мне знать что там накрутили, даже сборка армбиана из исходников мне не понравилась, так как там внешние компиляторы качаются извне. Рассказываю как собирал Debian для Orange Pi 3 LTS. Инструкция может быть не точной.
Пользовался Debian 11, склонировал репозиторий армбиана https://github.com/armbian/build, откатился на тег v22.11 e323753fe7fb26f833dbfeab94351b38fe97550d, так как более свежие версии требуют свежего дебиана. Далее прогнал сборку образа и отдельно ядра и загрузчика с дебагом баша:
sudo bash -x ./compile.sh BOARD=orangepi3-lts RELEASE=bullseye 2>/home/user/compile.txt
sudo bash -x ./compile.sh BOARD=orangepi3-lts RELEASE=bullseye KERNEL_ONLY=yes 2>/home/user/compile_kernel.txt
Накатил собранный образ на microsd, загрузился, всё работает, дальше начал экспериментировать. Полностью удалил все файлы на разделе, накатил дебиан через debootstrap --arch=arm64 bullseye /mnt/sda1/ https://deb.debian.org/debian систему, закинул /boot и /etc/fstab из собранного образа, попробовал загрузиться - грузится. Попробовал обновить ядро из бэкпортов дебиана - тоже получилось, но надо было сгенерировать uInitrd: mkimage -A arm64 -O linux -T ramdisk -C gzip -n uInitrd -d /boot/initrd.img-6.1.0-0.deb11.21-arm64 /boot/uInitrd-6.1.0-0.deb11.21-arm64. И возможно обновить boot.scr: mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr.
С ядром разобрался, решил попробовать накатить чистый дебиан самостоятельно. Занулил микросд, разметил начало первого раздела с 8192 блока, отформатировал раздел, подглядел в compile*.txt как накатывается первичный uBoot загрузчик:
+ dd if=/dev/zero of=/dev/loop0 bs=1k count=1023 seek=1 status=noxfer
+ dd if=/tmp/tmp.wsKbG8hLG5/usr/lib/linux-u-boot-current-orangepi3-lts_22.11.2_arm64/u-boot-sunxi-with-spl.bin of=/dev/loop0 bs=1024 seek=8 status=noxfer
Нашёл у себя файл u-boot-sunxi-with-spl.bin, записал его при помощи dd на микросд, дебутстрапнул дебиан, затем накатил все пакеты, сгенерированные с KERNEL_ONLY=yes. Прописал /etc/fstab и armbianEnv.txt (подглядел в сгенерированном образе), система загрузилась. По сути, дальше можно смотреть в содержимое этих пакетов:
linux-u-boot-current-orangepi3-lts_22.11.2_arm64.deb - содержит u-boot-sunxi-with-spl.bin
linux-image-current-sunxi64_22.11.2_arm64.deb - ядро
linux-dtb-current-sunxi64_22.11.2_arm64.deb - device tree, которые в /boot/dtb лежат, arm устройствам нужны для загрузки
armbian-bsp-cli-orangepi3-lts_22.11.2_arm64.deb - тут содержатся разные армбиановские примочки, но самое важное это 99-uboot в /etc/initramfs/post-update.d, это скрипт, который генерирует uInird после каждого обновления ядра. Ну и /usr/share/armbian тоже содержит важные armbianEnv.txt и boot.cmd
armbian-firmware_22.11.2_all.deb - фирмварь, тут нужные uwe* файлы для wi-fi карточки, которые я методом исключения нашёл, когда wi-fi не работал
armbian-config_22.11.2_all.deb - этот пакет не особо важен, только чтобы при первой загрузке удобно настроить armbian
Отталкиваясь от всего вышеперечисленного я примерно понял что мне нужно для сборки дебиана под одноплатник без использования армбиановских пакетов.
0. Разметить microsd и отформатировать раздел
1. Пропатчить, скопилировать u-boot и записать его через dd с нужным отступом
2. Пропатчить linux ядро, так как без патчей как минимум wi-fi и экран не будут работать. Вместе с компиляцией ядра сгенерируются и device-tree файлы.
3. Дебутстрапнуть дебиан на раздел microsd.
4. В chroot установить u-boot-tools, установить скомпилированное ядро и device-tree файлы в /boot/dtb. Добавить boot.cmd. Настроить /etc/fstab и /boot/armbianEnv.txt, далее при помощи вышеописанных mkimage команд сгенерировать boot.scr и uInitrd, сделать симлинки на ядро и uInitrd при помощи ln -s
5. Закинуть uwe* фирмарь для работы wi-fi
6. Поставить пароль для root
Вроде ничего критичного не упустил, этого должно быть достаточно, чтобы одноплатник заработал.
Более подробно:
1. u-boot я не собирал, но его исходники можно найти после сборки армбиана в build/cache/sources/u-boot/v2022.07,