Если плата на Armbian после подачи питания показывает только заставку или вовсе чёрный экран, а на последовательной консоли видны строки вида U-Boot 2022.10-armbian с последующей остановкой — проблема почти наверняка находится на этапе работы загрузчика, ещё до запуска ядра Linux. Именно U-Boot (Das U-Boot) в Armbian отвечает за инициализацию памяти, поиск ядра и передачу ему параметров, поэтому любая ошибка на этом уровне блокирует запуск всей системы.
Эта статья разбирает, как устроена цепочка загрузки в Armbian, где хранятся переменные окружения U-Boot, как безопасно обновить загрузчик и что проверить, если плата перестала стартовать после обновления или переноса системы на другой носитель.
Роль U-Boot в цепочке загрузки Armbian
Загрузка одноплатника с Armbian проходит несколько стадий. Сначала встроенный в чип BROM (Boot ROM) ищет на носителе первичный загрузчик — для плат Allwinner это SPL, для Rockchip — TPL/SPL. Затем управление передаётся основному U-Boot, который читает файл boot.scr или extlinux.conf, загружает ядро (zImage/Image), device tree (.dtb) и initrd, после чего запускает ядро Linux.
Понимание этой цепочки важно для диагностики: сбой на стадии SPL обычно означает проблему с самим загрузчиком на носителе, а ошибка после строки Starting kernel... указывает уже на ядро или device tree. Точное место остановки видно только через UART-консоль (USB-to-TTL адаптер, скорость чаще всего 115200 бод, но зависит от платы — уточняйте в документации на вашу модель).
- 🔌 SPL/TPL — инициализация DRAM и загрузка полного U-Boot в память.
- 📄 boot.scr — скомпилированный скрипт с командами загрузки, генерируется из
boot.cmd. - 🌳 Device Tree (.dtb) — описание оборудования конкретной платы для ядра.
- ⚙️ armbianEnv.txt — текстовый файл с переменными окружения, который можно править без перекомпиляции.
Где хранятся настройки: armbianEnv.txt и переменные окружения
В отличие от «чистого» U-Boot, где переменные часто сохраняются в отдельную область флеш-памяти, Armbian хранит пользовательские параметры в обычном текстовом файле /boot/armbianEnv.txt. Это удобно: файл можно отредактировать, подключив SD-карту к компьютеру, даже если сама плата не загружается.
Типичные переменные, которые там встречаются:
- 🧩
fdtfileилиfdtfile=...— какой device tree использовать (актуально для образов, поддерживающих несколько плат). - 🖥️
extraargs— дополнительные параметры командной строки ядра, например отключение графического вывода. - 📦
rootdev— UUID корневого раздела; при переносе системы на другой диск его нужно обновить. - 🔧
overlays— подключаемые оверлеи device tree (SPI, I2C, UART и т.д.).
Изменения в armbianEnv.txt применяются при следующей загрузке — никаких дополнительных команд выполнять не нужно. Однако синтаксическая ошибка в файле может привести к тому, что часть переменных не будет прочитана.
⚠️ Внимание: редактируйте armbianEnv.txt редактором, сохраняющим Unix-окончания строк (LF). Файл, сохранённый в Windows-формате (CRLF), может обрабатываться некорректно. Перед правкой сделайте копию файла.
Обновление U-Boot через armbian-config
Штатный способ обновить загрузчик в Armbian — утилита armbian-config. В ней предусмотрен пункт установки/обновления загрузчика: обычно это раздел System → пункт вроде Install to/update bootloader (точное название зависит от версии armbian-config). Утилита записывает свежий U-Boot в начало носителя, не трогая разделы с данными.
Обновление имеет смысл, когда вы переходите на новую версию образа Armbian, ядро отказывается стартовать со старым загрузчиком или требуется поддержка нового типа носителя (например, загрузка с NVMe, если она добавлена в свежих сборках для вашей платы). Проверить текущую версию можно командой:
strings /dev/mmcblk0 | grep "U-Boot 20" | head -1
Путь к устройству (/dev/mmcblk0, /dev/mmcblk1, /dev/sda) зависит от того, откуда грузится система — уточните выводом lsblk.
☑️ Перед обновлением загрузчика
Интерактивная консоль U-Boot
При подключённом UART-адаптере в первые секунды загрузки появляется приглашение вида Hit any key to stop autoboot. Нажатие любой клавиши останавливает автозагрузку и открывает командную строку U-Boot. Это основной инструмент низкоуровневой диагностики.
Полезные команды консоли:
printenv # показать все переменные окружения
setenv var val # установить переменную (только в RAM)
saveenv # сохранить переменные (если поддерживается платой)
mmc list # список найденных MMC-устройств
boot # продолжить загрузку
Учтите: setenv меняет переменные только в оперативной памяти, и после перезагрузки они сбросятся, если не выполнить saveenv. При этом на платах Armbian saveenv может быть настроен на запись в файл на разделе, а не во флеш — поведение зависит от конфигурации конкретной сборки.
Типичные проблемы и их диагностика
Большинство неполадок с загрузкой Armbian сводится к нескольким повторяющимся сценариям. Ниже — таблица симптомов и вероятных причин.
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
| Нет вывода в консоль вообще | Неисправный/неподходящий носитель, питание, битая запись SPL | Другой блок питания, перезапись образа, другая SD-карта |
| SPL стартует, U-Boot не находится | Повреждён загрузчик на носителе | Переустановка загрузчика через armbian-config или перезапись образа |
| Остановка на "Starting kernel..." | Несовместимый .dtb или битое ядро | Проверить fdtfile, вернуть прежнее ядро |
| Kernel panic: unable to mount root fs | Неверный rootdev/UUID в armbianEnv.txt | Сверить UUID раздела командой blkid |
| Циклическая перезагрузка | Нестабильное питание или повреждённый boot.scr | Блок питания с запасом по току, пересоздать boot.scr |
Отдельно стоит сказать о питании. Недостаточный или проседающий под нагрузкой блок питания — одна из самых частых причин «невнятных» сбоев загрузки одноплатников, которые ошибочно принимают за программные проблемы. Прежде чем пересобирать загрузчик, попробуйте другой кабель и адаптер питания.
⚠️ Внимание: запись загрузчика «не на то» устройство (например, на eMMC вместо SD или наоборот) может сделать плату временно незагружаемой. Перед командами записи на блочное устройство дважды проверяйте его имя через lsblk.
Как пересоздать boot.scr вручную
Файл boot.scr компилируется из boot.cmd утилитой mkimage: mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr. Утилита входит в пакет u-boot-tools. Обычно это делается автоматически скриптами Armbian, ручное вмешательство требуется редко.
Восстановление после неудачного обновления
Если после обновления загрузчика плата не стартует, порядок действий зависит от того, есть ли у вас доступ к носителю с компьютера. Самый простой путь — снять SD-карту, подключить её к ПК и проверить содержимое раздела /boot: целостность boot.scr, armbianEnv.txt и наличие файлов ядра.
Когда проблема в самом загрузчике (область до первого раздела), её не видно при монтировании файловой системы. В этом случае варианты такие:
- 💾 Перезаписать образ Armbian на карту целиком — самый надёжный способ вернуть рабочую цепочку загрузки.
- 🔄 Если плата поддерживает загрузку с SD приоритетнее eMMC, загрузиться с карты и из неё восстановить загрузчик на eMMC через
armbian-configили скрипты вродеnand-sata-install(наличие зависит от образа). - 🧰 Для плат с maskrom-режимом (Rockchip) — восстановление через USB-инструменты вендора; процедура специфична для чипа, сверяйтесь с документацией на вашу плату.
Заранее подготовленная загрузочная SD-карта с рабочим образом — лучшая страховка перед любыми экспериментами с загрузчиком на eMMC.
Сборка U-Boot из исходников
Для нестандартных задач — например, включения загрузки с NVMe, изменения задержки автозагрузки или добавления патчей — U-Boot собирают из исходников. Armbian предоставляет собственный build framework, который умеет компилировать загрузчик, ядро и готовый образ целиком в Docker-окружении или на хосте с Ubuntu.
Ручная сборка вне фреймворка тоже возможна: потребуется кросс-компилятор (например, gcc-aarch64-linux-gnu для 64-битных плат) и конфигурация под вашу плату (make <board>_defconfig). Однако готовые defconfig и патчи из репозитория Armbian, как правило, дают более предсказуемый результат, чем ванильный U-Boot, поскольку учитывают особенности конкретных плат.
⚠️ Внимание: самосборный загрузчик записывайте только при наличии рабочего способа восстановления (загрузочная SD-карта, maskrom, UART-консоль). Неправильно собранный SPL может сделать плату незагружаемой с данного носителя полностью.
Часто задаваемые вопросы
Как узнать версию U-Boot на работающей системе?
Выведите строки из начала загрузочного устройства: strings /dev/mmcblk0 | grep "U-Boot 20" (имя устройства уточните через lsblk). Также версия видна в первых строках вывода UART-консоли при старте платы.
Можно ли править armbianEnv.txt с компьютера на Windows?
Да, раздел boot обычно имеет файловую систему FAT и доступен из Windows. Используйте редактор с поддержкой Unix-окончаний строк (например, Notepad++) и сохраняйте файл в формате LF.
Плата не грузится после обновления — данные на карте потеряны?
Обычно нет: сбой загрузчика не затрагивает разделы с данными. Подключите карту к компьютеру — файлы, как правило, доступны. После резервного копирования можно перезаписать образ или восстановить только загрузчик.
Чем boot.scr отличается от armbianEnv.txt?
boot.scr — скомпилированный скрипт с логикой загрузки, он генерируется из boot.cmd и редактируется только перекомпиляцией. armbianEnv.txt — простой текстовый файл с переменными, который boot.scr подгружает при старте; его можно править любым текстовым редактором.
Нужен ли UART-адаптер обязательно?
Для штатной работы — нет. Но для диагностики проблем загрузки это практически незаменимый инструмент: без последовательной консоли вы не увидите, на какой стадии останавливается плата, и будете действовать вслепую.