5.1. Zavedení instalátoru na 32-bit soft-float ARM

5.1.1. Formáty zaváděcích obrazů

Systémy založené na architektuře ARM většinou používají dva formáty zaváděcích obrazů: a) Standardní linuxové jádro ve formátu zImage (vmlinuz) spolu se standardním linuxovým ramdiskem (initrd.gz) nebo b) Jádro ve formátu uImage (uImage) ve spojení s odpovídajícím ramdiskem (uInitrd).

Formáty uImage/uInitrd jsou speciálně navrženy pro firmware U-Boot, který se používá na mnoha (většinou starších 32 bitových) ARMových systémech. Starší verze U-Bootu uměly zavádět pouze soubory ve formátu uImage/uInitrd, proto se používají hlavně na starších systémech armel. Novější verze U-Bootu již umí kromě uImage/uInitrd zavádět také standardní linuxová jádra a initrd, ale syntaxe se trošku liší.

Na systémech používajících multiplatformní jádro je kromě jádra a initrd ještě zapotřebí soubor se stromem zařízení (device-tree blob, dtb), který je specifický pro každý systém a obsahuje popis toho konkrétního hardwaru. dtb by měl být obsažen přímo ve firmwaru zařízení, ale ve skutečnosti je často třeba nahrát novější verzi.

5.1.2. Zavedení z TFTP

Zavedení se sítě vyžaduje síťové připojení, funkční TFTP server a nejspíš i DHCP, RARP nebo BOOTP server pro automatické nastavení sítě.

Nastavení zavádění ze sítě je popsáno v 4.3 – „Příprava souborů pro zavedení ze sítě pomocí TFTP“.

5.1.2.1. Zavedení z TFTP přes U-Boot

Zavedení ze sítě přes firmware U-Boot se skládá ze tří kroků: nastavení sítě, zavedení obrazů jádra, initrd a dtb do paměti a konečně spuštění nahraného jádra.

Síť můžete nastavit buď automaticky pomocí DHCP:

setenv autoload no
dhcp

nebo ručně nastavením několika proměnných:

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>

Budete-li chtít toto nastavení uložit trvale, použijte příkaz

saveenv

Nyní musíte nahrát obrazy jádra, initrd a dtb do paměti, což se provádí příkazem tftpboot. jako parametr příkazu musíte zadat adresu v paměti, na kterou se má obraz nahrát. Bohužel, mapa paměti se liší systém od systému a proto zde nemůžeme vypsat pevné adresy platné pro všechny.

Na některých systémech si U-Boot předdefinovává proměnné prostředí s vhodnými adresami. Jsou to proměnné kernel_addr_r, ramdisk_addr_r a fdt_addr_r. Zda jsou ve vašem případě nastaveny, a připraveny k použití, si můžete ověřit příkazem

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Nejsou-li definovány, budete si muset konkrétní hodnoty zjistit v dokumentaci k vašemu systému a nastavit je ručně. Například na systémech založených na SOC Allwinner SunXi (třeba Allwinner A10, architektura sun4i nebo Allwinner A20, architektura sun7i) můžete použít následující hodnoty:

setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000

Po nastavení adres můžete stáhnout obrazy z dříve definovaného TFTP serveru a nahrát je do paměti příkazy:

tftpboot ${kernel_addr_r} <název_souboru_s_obrazem_jádra>
tftpboot ${fdt_addr_r} <název_souboru_s_dtb>
tftpboot ${ramdisk_addr_r} <název_souboru_s_obrazem_initrd>

Nyní zbývá nastavit parametry jádra a spustit ho. U-Boot předá jádru parametry přes proměnnou prostředí bootargs, takže do ní nastavte veškeré potřebné parametry jádra a instalačního systému, jako je třeba konzole (5.3.1 – „Boot serial console“) nebo přednastavení (5.3.2 – „Parametry instalačního programu“ a B – „Automatizování instalací pomocí přednastavení). Například:

setenv bootargs console=ttyS0,115200 rootwait panic=10

Samotné spuštění jádra závisí na použitém formátu. Pro uImage/uInitrd vypadá příkaz následovně:

bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

a pro nativní linuxový formát takto:

bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

Při zavádění standardních linuxových obrazů je důležité nahrát obraz úvodního ramdisku až po jádru a dtb, jelikož U-Boot automaticky uloží do proměnné filesize velikost posledně nahraného souboru. Aby příkaz bootz fungoval správně, potřebuje znát velikost ramdisku, kterou mu předáte právě z proměnné filesize. Jestliže zavádíte jádro sestavené pro konkrétní platformu (tj. bez stromu zařízení), jednoduše vynechte parametr ${fdt_addr_r}.