В системах на базе ARM в большинстве случаев используется один из двух форматов загрузочных образов: а) стандартные ядра Linux в формате zImage («vmlinuz») в вместе со стандартными начальными Linux ramdisk («initrd.gz») или б) ядра в формате uImage («uImage») вместе с соответствующими начальными ramdisk («uInitrd»).
uImage/uInitrd — формат образов, разработанный для микропрограммы u-boot, которая используется во многих системах за основе ARM. Старые версии u-boot позволяли только загружать файлы в формате uImage/uInitrd, поэтому они часто используются в старых системах armel. Новые версии u-boot — помимо загрузки uImage/uInitrd — также загружают стандартные ядра Linux и образы ramdisk, но синтаксис команды загрузки несколько отличается от работающего на загрузку uImage.
Для систем, использующих мультиплатформенное ядро, помимо ядра и начального ramdisk требуется так называемый файл дерева устройств (device-tree blob, «dtb»). Он уникальный для каждой поддерживаемой системы и содержит описание аппаратуры устройства.
Загрузка по сети требует наличия сетевого подключения и сетевого загрузочного сервера TFTP (и, вероятно, также серверов DHCP, RARP или BOOTP для автоматической настройки по сети).
Настройка сервера для обеспечения загрузки из сети описана в Раздел 4.3, «Подготовка файлов для загрузки по TFTP».
Загрузка по сети в системах, использующих микропрограмму u-boot, состоит из трёх шагов: а) настройка сети, б) загрузка образов (ядро/начальный ramdisk/dtb) в память и в) исполнение ранее загруженного кода.
Во-первых, нужно настроить сеть, или автоматически по DHCP командой
setenv autoload no dhcp
или вручную указав настройки в переменных окружения
setenv ipaddr <ip address of the client> setenv netmask <netmask> setenv serverip <ip address of the tftp server> setenv dnsip <ip address of the nameserver> setenv gatewayip <ip address of the default gateway>
Если хотите, то можно сделать настройки постоянными с помощью команды
saveenv
После этого нужно загрузить образы (ядро/начальный ramdisk/dtb) в память. Это выполняется с помощью команды tftpboot, которой указывается адрес по которому требуется сохранить образ в память. К сожалению, в разных устройствах карты памяти сильно различаются, поэтому нет общего правила какие адреса следует использовать.
В некоторых системах в u-boot уже настроены переменные окружения нужными адресами загрузки: kernel_addr_r, ramdisk_addr_r и fdt_addr_r. Вы можете проверить их наличие выполнив
printenv kernel_addr_r ramdisk_addr_r fdt_addr_r
Если они не определены, то обратитесь к документации на систему и введите их значения вручную. В системах на основе ЦПУ Allwinner SunXi (например, Allwinner A10, имя архитектуры name «sun4i» или Allwinner A20, имя архитектуры «sun7i»), вы можете, например, использовать следующие значения:
setenv kernel_addr_r 0x46000000 setenv fdt_addr_r 0x47000000 setenv ramdisk_addr_r 0x48000000
После определения адресов загрузки вы можете загрузить образы в память с ранее настроенного сервера tftp с помощью команд
tftpboot ${kernel_addr_r} <имя файла образа ядра> tftpboot ${fdt_addr_r} <имя файла dtb> tftpboot ${ramdisk_addr_r} <имя файла начального ramdisk>
Третьим шагом является настройка командной строки ядра и запуск загруженного кода. U-boot передаёт содержимое переменной окружения «bootargs» ядру как командную строку, поэтому все параметры ядра и программы установки — консольное устройство (смотрите Раздел 5.3.1, «Загрузочная консоль») или ответы на вопросы о настройке (смотрите Раздел 5.3.2, «Параметры программы установки Debian» and Приложение B, Автоматическая установка с помощью списка ответов) — можно указать с помощью команды вида
setenv bootargs console=ttyS0,115200 rootwait panic=10
Точная команда для выполнения ранее загруженного кода зависит от используемого формата образа. Для uImage/uInitrd, команда будет
bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
, а для родных образов Linux
bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}
Замечание: При загрузке стандартных образов linux важно загрузить образ начального ramdisk после ядра и dtb так как u-boot устанавливает переменную filesize равной размеру последнего загруженного файла, а для правильной работы команды bootz требуется размер образа ramdisk. При загрузке специального ядра устройства, то есть ядра без дерева устройств, просто не указывайте параметр ${fdt_addr_r}.
Многие современные версии u-boot поддерживают USB и позволяют выполнять загрузку накопителей USB, например карт памяти USB (флешек). К сожалению, точный шаги для выполнения данной процедуры для разных устройств различаются.
В u-Boot v2014.10 появился общий механизм обработки командной строки и autoboot. Это позволяет собирать единые загрузочные образы, которые работают на любой системе, поддерживающей данный механизм. debian-installer
поддерживает установку с носителей USB для таких систем, но, к сожалению, пока не все платформы переделаны под этот новый механизм.
Чтобы создать загрузочный носитель USB для установки Debian распакуйте tar-архив hd-media (смотрите Раздел 4.2.1, «Где искать установочные образы») на носитель USB с файловой системой, поддерживаемой версией u-boot вашего устройства. Современные версии u-boot, обычно, работают с FAT16 / FAT32 / ext2 / ext3 / ext4. После этого скопируйте на носитель образ ISO первого установочного CD или DVD Debian.
Механизм autoboot в современных версиях u-boot работает также как BIOS ПК, т. е. по списку возможных загрузочных устройств ищется корректный загрузочный образ и запускается первый найденный. Если операционная система не установлена, то подключение носителя USB и включение питания должно привести к запуску программы установки. Также вы можете запустить процесс загрузки с USB в любой момент из приглашения u-boot с помощью команды «run usb_boot».
Единственная проблема, которая может возникнуть при загрузке с USB при использовании последовательной консоли — несовпадение скоростей передачи консоли. Если переменная консоли определена в u-boot, то загрузочный сценарий debian-installer
автоматически передаёт её ядру для настройки первичной консоли устройства и, если уместно, скорость консоли. К сожалению, на разных платформах используется разная переменная консоли — у некоторых она содержит скорость («console=ttyS0,115200»), а у других имеется только устройство («console=ttyS0»). В последнем случае из-за несовпадения скоростей консоли по умолчанию у u-boot и ядра вывод данных искажается. Современные версии u-boot часто используют скорость 115200 бод, а ядро по-прежнему работает на традиционных 9600 бод. Если такое произошло, то вы должны задать переменную консоли вручную с правильной скоростью и затем запустить программу установки с помощью команды «run usb_boot».