5.1. Avvio dell'installatore su ARM ARMv7 32 bit con unità di calcolo in virgola mobile

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 (principalmente quelli a 32-bit). 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. Normalmente il dtb è fornito dal firmware del dispositivo ma, in pratica, è necessario caricarne uno più recente.

5.1.2. Configurazione della console

Il tarball per l'avvio da rete (Sezione 5.1.3.2, «Tarball preconfezionato per avvio da rete») e le immagini delle schede SD con l'installatore (Sezione 5.1.5, «Uso di immagini per schede SD precompilate con l'installatore») utilizzano la console predefinita (specifica di ciascuna piattaforma) definita nella variabile «console» di U-Boot. Nella maggior parte dei casi è una console seriale e quindi su tali piattaforme è necessario un cavo per console seriale per utilizzare l'installatore.

Sulle piattaforme che supportano una console video è possibile modificare la variabile «console» di U-Boot in modo da avviare l'installatore in una console video.

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

5.1.3.2. Tarball preconfezionato per avvio da rete

Debian fornisce un tarball preconfezionato ( .../images/netboot/netboot.tar.gz ) da scompattare sul proprio server tftp che contiene tutti i file necessari per l'avvio da rete. Contiene anche uno script di avvio che automatizza tutti i passi per caricare l'installatore. Le versioni di U-Boot recenti dispongono della funzione di avvio automatico tftp, tale funzione si attiva quando non ci sono altri dispositivi locali (MMC/SD, USB, IDE/SATA/SCSI) dai quali è possibile fare l'avvio e poi carica lo script di avvio dal server tftp. Per usare questa funzione è necessario che nella rete sia presente un server dhcp che fornisce al client l'indirizzo del server tftp.

Per far scattare la funzione di avvio automatico tftp dalla riga di comando di U-Boot è possibile usare il comando seguente:

run bootcmd_dhcp

Per caricare manualmente lo script di avvio fornito nel tarball è possibile anche usare il seguente comando dal prompt di U-Boot:

setenv autoload no
dhcp
tftpboot ${scriptaddr} /debian-installer/armhf/tftpboot.scr
source ${scriptaddr}

5.1.4. Avvio da chiavetta USB in U-Boot

Molte delle versioni moderne di U-Boot hanno il supporto per USB e permettono di fare l'avvio da dispositivi di memorizzazione di massa USB come le chiavette USB. Sfortunatamente i passi esatti per fare l'avvio variano leggermente da dispositivo a dispositivo.

In U-Boot v2014.10 sono stati introdotti una gestione comune della riga di comando e l'infrastruttura autoboot. Ciò permette di creare immagini d'avvio generiche che funzionano su qualsiasi sistema con tale framework. Il installatore Debian può fare l'installazione a partire da una chiavetta USB su tali sistemi, purtroppo non tutte le piattaforme hanno già adottato questa nuova infrastruttura.

Per creare una chiavetta USB con la quale installare Debian occorre prima scompattare l'archivio tar hd-media (consultare Sezione 4.2.1, «Dove trovare le immagini per l'installazione») su una chiavetta USB formattata con uno dei filesystem supportati dalla versione di U-Boot del proprio dispositivo (le versioni più recenti di U-Boot suportano FAT16 / FAT32 / ext2 / ext3 / ext4), poi copiare il file dell'immagine ISO del primo CD o DVD d'installazione Debian sulla chiavetta.

L'infrastruttura autoboot delle recenti versioni di U-Boot funziona in modo similare alla opzione sull'ordine di avvio del BIOS dei PC, cioè ricerca nell'elenco dei dispositivi da cui è possibile fare l'avvio il primo che contiene un'immagine avviabile e la fa partire. Se non è installato alcun sistema operativo, inserendo una chiavetta USB e l'accensione del sistema dovrebbe comportare l'avvio dell'installatore. È anche possibile iniziare il processo d'avvio da USB in qualsiasi momento inserendo dal prompt di U-Boot il comando «run bootcmd_usb0».

Un problema che può verificarsi durante l'avvio da una chiavetta USB quando è collegata una console seriale è un disallineamento della velocità di comunicazione. Se in U-Boot è definita la varibile console, lo script di avvio del installatore Debian ne passa automaticamente il valore al kernel in modo da impostare il device della console primaria e, se possibile, la velocità di trasmissione. Sfortunatamente la gestione della variabile console varia da piattaforma a piattaforma: su alcune la varibile contiene anche la velocità (come in «console=ttyS0,115200»), invece su altre la varibile contiene solo il device (come in «console=ttyS0»). In quest'ultimo caso è possibile avere dell'output confuso sulla console qual ora la velocità predefinita di U-Boot sia diversa da quella del kernel. Le versioni recenti di U-Boot spesso utilizzano 115200 baud mentre il kernel tutt'ora utilizza i tradizionali 9600 baud. In questo caso è necessario impostare manualmente la varibile console in modo che contenga anche la velocità di trasmissione adatta al sistema e avviare l'installatore con il comando «run bootcmd_usb0».

5.1.5. Uso di immagini per schede SD precompilate con l'installatore

Per un certo numero di sistemi Debian fornisce delle immagini di schede SD contenenti U-Boot e installatore Debian. Tali immagini sono create in due varianti, una che scarica i pacchetti software dalla rete (disponibile da .../images/netboot/SD-card-images/ ) e l'altra chiamata hd-media per le installazioni senza un collegamento di rete e ha bisogno di un CD/DVD Debian (disponibile da .../images/hd-media/SD-card-images/ ). Per risparmiare spazio e traffico di rete le immagini consistono di due parti: la prima parte dipende dal sistema è chiamata «firmware.<tipo-sistema>.img.gz», la seconda parte indipendente dal sistema è chiamata «partition.img.gz».

Su sistemi Linux per unire le due parti e creare un'immagine completa è possibile usare zcat in questo modo:

zcat firmware.<tipo-sistema>.img.gz partition.img.gz > immagine_completa.img

Su sistemi windows è necessario prima decomprimere ciascuna delle due parti, ciò può essere fatto usando per esempio 7-Zip e poi unire assieme le due parti eseguendo il comando

copy /b firmware.<tipo-sistema>.img + partition.img immagine_completa.img

da una finestra con il prompt dei comandi di Windows.

Scrivere l'immagine risultante su una scheda SD, su un sistema Linux con il seguente comando:

cat immagine_completa.img > /dev/DEVICE_SCHEDA_SD

Inserire la scheda SD nel sistema e poi accenderlo, l'installatore verrà caricato dalla scheda SD. Con la variante hd-media per le installazioni senza un collegamento alla rete è necessario fornire all'installatore l'accesso al primo CD/DVD Debian su un altro supporto che, per esempio, può essere l'immagine ISO del CD/DVD su una chiavetta USB.

Usando l'installatore, durante il passo relativo al partizionamento (vedere Sezione 6.3.3, «Partizionamento e selezione del punto di mount»), è possibile cancellare o sostituire qualsiasi partizione presente sulla scheda. Infatti, una volta avviato, l'installatore viene completamente caricato in memoria e non ha più bisogno di accedere alla scheda SD quindi è possibile scegliere di installare Debian sulla stessa scheda. Il modo più semplice per partizionare al meglio la scheda SD è lasciare che sia l'installatore a creare automaticamente le partizioni (vedere Sezione 6.3.3.2, «Partizionamento guidato»).