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.
Zavedení z TFTP
&boot-installer-intro-net.xml;
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 () nebo
přednastavení ( a ). 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}.