5.1. Avvio dell'installatore su ARM

5.1.1. Formati delle immagini d'avvio

Sulla maggior parte dei sistemi ARM è utilizzato uno tra questi due formati per le immagini di avvio: a) kernel Linux standard («vmlinuz») insieme ai tradizionali ramdisk iniziali di Linux («initrd.gz») oppure b) kernel in formato uImage insieme al suo ramdisk iniziale («uInitrd»).

uImage/uInitrd sono formati pensati per il firmware u-boot, presente su molti sistemi ARM. Le versioni di u-boot più vecchie possono avviare solo file nel formato uImage/uInitrd, quindi spesso sono usate sui sistemi armel più vecchi. Le versioni di u-boot più recenti sono in grado di avviare ovviamente le immagini uImages/uInitrds ma riescono ad avviare anche i kernel e i ramdisk in formato Linux, la sintassi del comando per avviare le immagini in formato Linux è leggermente diversa da quella del comando per avviare le immagini uImage.

Per i sistemi che usano un kernel multipiattaforma, oltre al kernel e al ramdisk, è necessario anche un cosiddetto file con l'albero dei dispositivi (device-tree oppure device-tree blob, «dtb»). Tale file è specifico per ciscun sistema e contiene la descrizione dell'hardware.

5.1.2. Avvio con TFTP

L'avvio da rete richiede una connessione di rete e un boot server TFTP (e probabilmente anche un server DHCP, RARP o BOOTP per la configurazione automatica della rete).

La configurazione lato server per effettuare l'avvio dalla rete è descritto in Sezione 4.3, «Preparazione dei file per l'avvio TFTP da rete».

5.1.2.1. Avvio da TFTP con u-boot

L'avvio da rete per i sistemi che usano il firmware u-boot consiste di tre passi: a) configurazione della rete b) caricamento delle immagini (kernel, ramdisk e dtb) in memoria c) l'esecuzione del codice appena caricato.

Il primo passo è configurare la rete, automaticamente tramite DHCP con

setenv autoload no
dhcp

oppure manualmente impostando alcune variabili d'ambiente

setenv ipaddr <indirizzo ip del client>
setenv netmask <maschera di rete>
setenv serverip <indirizzo ip del server tftp>
setenv dnsip <indirizzo ip del nameserver>
setenv gatewayip <indirizzo ip del gateway predefinito>

È possibile salvare in modo permanente queste impostazioni eseguendo

saveenv

Dopodiche è necessario caricare le immagini (kernel, ramdisk iniziale e dtb) in memoria. Per questa operazione occorre usare il comando tftpboot passando l'indirizzo di memoria al quale deve deve caricata l'immagine. Sfortunatamente la mappa di memoria varia da sistema a sistema e non esiste una regola generale su quale indirizzo utilizzare.

Su alcuni sistemi, u-boot predefinisce una serie di varibili d'ambiente con gli indirizzi da usare: kernel_addr_r, ramdisk_addr_r e fdt_addr_r. È possibile verificare se tali variabili sono state definite con

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Se non sono state definite, è necessario trovare nella documentazione i valori adatti al proprio sistema e impostarli manualmente. Per i sistemi basati sui SOC Allwinner SunXi (per esempio per Allwinner A10 nome dell'architettura «sun4i», o Allwinner A20, nome dell'architettura «sun7i») è possibile usare i seguenti valori:

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

Dopo aver impostato gli indirizzi, è possibile caricare le immagini in memoria dal server tftp definito in precedenza con

tftpboot ${kernel_addr_r} <nome file dell'immagine del kernel>
tftpboot ${fdt_addr_r} <nome file del dtb>
tftpboot ${ramdisk_addr_r} <nome file del ramdisk iniziale>

Il terzo passo è impostare la riga di comando per il kernel e avviare l'esecuzione del codice appena caricato. U-boot passa il contenuto della variabile d'ambiente «bootargs» come riga di comando al kernel, quindi tutti parametri per il kernel e per l'installatore, come il device della console (vedere Sezione 5.3.1, «Avvio da console») oppure le opzioni di preconfigurazione (vedere Sezione 5.3.2, «Parametri dell'Installatore Debian» e Appendice B, Installazione automatica tramite preconfigurazione), possono essere impostati con un comando simile a

setenv bootargs console=ttyS0,115200 rootwait panic=10

Il comando per eseguire il codice caricato in precedenza dipende dal formato delle immagini usato. Con uImage/uInitrd, usare il comando

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

e con le immagini native Linux usare

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

Nota: quando si avviano immagini linux è importante caricare l'immagine del ramdisk iniziale dopo il kernel e il dtb poiché u-boot imposta il valore della variabile filesize pari alla dimensione dell'ultimo file caricato e il comando bootz ha bisogno di conoscere la dimensione dell'immagine del ramdisk per funzionare correttamente. Per avviare un kernel specifico per una piattaforma, vale a dire un kernel senza il device-tree, è sufficiente omettere il parametro ${fdt_addr_r}.