U-Boot на Raspberry Pi: Когда и зачем

По умолчанию Raspberry Pi использует собственную проприетарную загрузочную цепочку: bootcode.bin, start.elf, config.txt, cmdline.txt, и затем kernel.img. Однако в ряде случаев может понадобиться установить альтернативный загрузчик U-Boot.

Что такое U-Boot?

U-Boot (Universal Bootloader) это гибкий загрузчик для встроенных систем. Он может загружать ядро Linux, выполнять сетевую загрузку (TFTP), поддерживать FAT/ext файловые системы, и предоставлять интерфейс командной строки.

U-Boot часто используется в:

  • IoT-устройствах

  • Промышленных контроллерах

  • Пользовательских сборках Linux

  • OpenWRT, Buildroot, Yocto и других embedded-сборках

Когда использовать U-Boot на Raspberry Pi?

  • Если нужно: - Загружать ядро с USB или по сети - Заменить start.elf цепочку загрузки (частично) - Автоматизировать конфигурацию загрузки через скрипты - Вставить промежуточный отладочный загрузчик - Поддерживать мультизагрузку (multi-boot)

  • Когда не стоит использовать U-Boot: - Если вы довольны стандартной цепочкой - Если вы не используете кастомные образы - Если нужна максимальная совместимость с Raspberry Pi OS

Как это работает на практике?

U-Boot может быть размещён как kernel.img, и Raspberry Pi будет считать его ядром. Далее, U-Boot сам загружает «настоящее» ядро Linux.

Минимальная конфигурация:

config.txt:

kernel=u-boot.bin
enable_uart=1

U-Boot может получить Device Tree (.dtb) и загрузить ядро через extlinux.conf, скрипт boot.scr, или вручную через CLI.

Установка:

  1. Скомпилировать U-Boot с поддержкой RPi 3 (или скачать готовый u-boot.bin)

  2. Переименовать файл в kernel.img или указать kernel=u-boot.bin

  3. Создать boot.scr или extlinux/extlinux.conf с нужной логикой

Отладка:

  • UART остаётся активным, U-Boot выводит лог в консоль

  • Можно использовать встроенные команды: printenv, boot, load, mmc, tftp, setenv, saveenv

Заключение:

U-Boot мощный инструмент, если вы строите пользовательскую или промышленную систему. Для классической Raspberry Pi OS он не обязателен, но если вы хотите управлять загрузкой до ядра это ваш выбор.