5.1. Zavedení instalátoru na 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ů:

  • Standardní linuxové jádro ve formátu zImage (vmlinuz) spolu se standardním linuxovým ramdiskem (initrd.gz).

  • 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 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.

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_adresa_klienta
setenv netmask maska
setenv serverip ip_adresa_TFTF_serveru
setenv dnsip ip_adresa_DNS_serveru
setenv gatewayip ip_adresa_výchozí_brány

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 – „Zavěděcí konzole“) 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}

Poznámka

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}.