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.
Configurazione della console
Il tarball per l'avvio da rete () e le immagini delle
schede SD 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.
Configurazione della console
L'installatore grafico non è disponibile nelle immagini arm64 del &d-i;
per jessie e quindi occorre usare una console seriale. Il device della
console dovrebbe essere rilevato automaticamente dal firmware ma se non
lo fosse dopo l'avvio di linux dal menu di GRUB appare il messaggio
Booting Linux
e nulla più.
Nel caso si verifichi questo problema occorre passare la configurazione
della console nella riga di comando del kernel. Nel menu di GRUB premere
e per Edit Kernel command-line
e
modificare --- quiet in
console=<device>,<speed>
per esempio console=ttyAMA0,115200n8.
Fatta la modifica premere Control
x per continuare l'avvio con la nuova
configurazione.
Installazione su Juno
Juno dispone di UEFI quindi l'installazione è diretta. Il modo più
pratico è l'installare da una chiavetta USB. Per eseguire l'avvio da
dispositivo USB è necessario aggiornare il firmware. I firmware in
&url-juno-firmware; creati
dopo Marzo 2015 sono stati verificati e funzionano. Consultare la
documentazione di Juno su come aggiornare il firmware.
Preparare un'immagine del CD arm64 su una chiavetta USB. Inserirla in
una delle porte USB sul retro e collegare un cavo seriale nella porta
a 9 pin in alto. Se è necessario accedere alla rete (con l'immagine
netboot) inserire il cavo Ethernet nel connettore sul davanti della
macchina.
Attivare la console seriale a 115200, 8 bit, senza parità e poi avviare
Juno. Dovrebbe avviarsi dalla chiavetta USB e mostrare il menu di GRUB.
La configurazione della console non è rilevata correttamente quindi
premere Invio per vedere l'output del kernel. Per impostare la console
console=ttyAMA0,115200n8
come descritto in . Per avviare il
&d-i; premere Controlx
e continuare con l'installazione standard.
Installazione su Applied Micro Mustang
Per queste macchine è possibile usare UEFI e normalmente sono
equipaggiate con U-Boot quindi sarà possibile installare prima
il firmware UEFI e poi usare i metodi d'avvio e d'installazione
standard, oppure usare uno dei metodi d'avvio con U-Boot. Inoltre
il supporto per USB non è presente nel kernel di jessie e quindi
l'installazione da chiavetta USB non funziona. È necessario usare una
console seriale per controllare l'installazione perché l'installatore
grafico non è disponibile sull'architettura arm64.
Il metodo d'installazione raccomandato è copiare il kernel e l'initrd
del &d-i; sul disco fisso utilizzando il sistema openembedded
fornito insieme alla macchina poi avviare ed eseguire l'installatore.
In alternativa usare TFTP per copiare e avviare kernel/dtb/initrd
(). Dopo l'installazione occorre
modificare manualmente la configurazione per l'avvio.
Attivare la console seriale a 115200, 8 bit, senza parità e poi avviare
la macchina. Riavviare la macchina e quando appare Hit any key to
stop autoboot:
premere un tasto qualsiare per avere il prompt
Mustang#. Poi usare i comandi U-Boot per caricare e avviare kernel, dtb
e initrd.
Avvio con TFTP
&boot-installer-intro-net.xml;
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 )
oppure le opzioni di preconfigurazione (vedere e ), 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}.
Tarball preconfezionato per avvio da rete
&debian; fornisce un tarball preconfezionato (&armmp-netboot-tarball;)
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}
Avvio da chiavetta USB con UEFI
&boot-installer-intro-usb.xml;
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 &d-i; 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 ) 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 &d-i; 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
.
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 &d-i;. Tali immagini sono create in due
varianti, una che scarica i pacchetti software dalla rete (disponibile
da &armmp-netboot-sd-img;) e l'altra chiamata hd-media per le
installazioni senza un collegamento di rete e ha bisogno di un CD/DVD
Debian (disponibile da &armmp-hd-media-sd-img;). 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 ), è 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 ).