5.1. Запуск программы установки на 32-bit soft-float ARM

5.1.1. Форматы загрузочных образов

В системах на базе ARM в большинстве случаев используется один из двух форматов загрузочных образов: а) стандартные ядра Linux в формате zImage («vmlinuz») в вместе со стандартными начальными Linux ramdisk («initrd.gz») или б) ядра в формате uImage («uImage») вместе с соответствующими начальными ramdisk («uInitrd»).

uImage/uInitrd are image formats designed for the U-Boot firmware that is used on many ARM-based systems (mostly 32-bit ones). Older U-Boot versions can only boot files in uImage/uInitrd format, so these are often used on older armel systems. Newer U-Boot versions can - besides booting uImages/uInitrds - also boot standard Linux kernels and ramdisk images, but the command syntax to do that is slightly different from that for booting uImages.

For systems using a multiplatform kernel, besides kernel and initial ramdisk a so-called device-tree file (or device-tree blob, «dtb») is needed. It is specific to each supported system and contains a description of the particular hardware. The dtb should be supplied on the device by the firmware, but in practice a newer one often needs to be loaded.

5.1.2. Загрузка по TFTP

Загрузка по сети требует наличия сетевого подключения и сетевого загрузочного сервера TFTP (и, вероятно, также серверов DHCP, RARP или BOOTP для автоматической настройки по сети).

Настройка сервера для обеспечения загрузки из сети описана в Раздел 4.3, «Подготовка файлов для загрузки по TFTP».

5.1.2.1. Загрузка по TFTP из U-Boot

Загрузка по сети в системах, использующих микропрограмму 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}.

5.1.3. Загрузка с карты памяти USB из U-Boot

Многие современные версии 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».