Dans la plupart des cas, un ou deux types d'image d'amorçage sont utilisés sur les systèmes ARM : a) un noyau Linux standard au format zImage (« vmlinuz ») associé à un initrd Linux standard (« initrd.gz ») ou b) un noyau au format uImage (« uImage ») associé à un initrd correspondant (« uInitrd »).
Les formats d'image uImage/uInitrd sont conçus pour le microprogramme u-boot utilisé sur de nombreux systèmes ARM. Les anciennes versions de u-boot ne peuvent amorcer que des fichiers au format uImage/uInitrd, qui sont donc utilisés principalement sur les anciens systèmes. Les versions plus récentes de u-boot peuvent aussi amorcer les noyaux Linux récents et les initrd (en plus des fichiers uImage/uInitrd), mais la syntaxe est légèrement différente que pour l'amorçage des uImages.
Pour les systèmes utilisant un noyau multiplate-forme, un fichier appelé arbre de périphériques (« device-tree blob, dtb ») est requis en plus du noyau et de l'initrd. Ce fichier est spécifique à chaque système et contient une description d'un matériel particulier.
Pour amorcer depuis le réseau, il vous faut une connexion au réseau et un serveur TFTP (et aussi, sûrement, un serveur DHCP, RARP ou BOOTP pour la configuration automatique du réseau).
L'installation côté serveur pour l'amorçage depuis le réseau est décrite dans la Section 4.3, « Préparer les fichiers pour amorcer depuis le réseau avec TFTP ».
Sur les systèmes utilisant le microprogramme u-boot, l'amorçage depuis le réseau est effectué en trois étapes : a) configurer le réseau, b) charger les images (noyau/initrd/dtb) en mémoire et c) exécuter le code chargé.
Premièrement, il faut configurer le réseau automatiquement avec DHCP en exécutant :
setenv autoload no dhcp
ou manuellement en positionnant plusieurs variables d'environnement :
setenv ipaddr <adresse ip du client> setenv netmask <masque réseau> setenv serverip <adresse ip du serveur tftp> setenv dnsip <adresse ip du serveur de noms> setenv gatewayip <adresse ip de la passerelle par défaut>
Si vous préférez, vous pouvez rendre ces réglages permanents en exécutant :
saveenv
Une fois cette étape exécutée, vous devez charger les images (noyau/initrd/dtb) en mémoire avec la commande tftpboot qui doit être appelée avec l'adresse à laquelle charger l'image. Malheureusement, l'adressage de la mémoire varie d'un système à l'autre et il n'y a donc pas de règle générale à appliquer.
Sur certains systèmes, u-boot prédéfinit un ensemble de variables d'environnement avec des adresses de chargement adaptées : kernel_addr_r, ramdisk_addr_r et fdt_addr_r. Vous pouvez vérifier si elles sont définies en exécutant :
printenv kernel_addr_r ramdisk_addr_r fdt_addr_r
Si elles ne sont pas définies, vous devez consulter la documentation de votre système et les positionner manuellement. Pour les systèmes basés sur les puces Allwinner SunXi (par exemple, les Allwinner A10 ou A20, noms d'architecture sun4i et sun7i), vous pouvez utiliser les valeurs suivantes :
setenv kernel_addr_r 0x46000000 setenv fdt_addr_r 0x47000000 setenv ramdisk_addr_r 0x48000000
Lorsque les adresses de chargement sont définies, vous pouvez charger les images depuis le serveur tftp défini précédemment avec :
tftpboot ${kernel_addr_r} <fichier de l'image du noyau> tftpboot ${fdt_addr_r} <fichier du dtb> tftpboot ${ramdisk_addr_r} <fichier de l'image initrd>
La troisième étape consiste à positionner la ligne de commande du noyau et exécuter le code chargé. U-boot envoie le contenu de la variable d'environnement « bootargs » au noyau. Tous les paramètres pour le noyau et l'installateur — comme le périphérique d'interface (consultez la Section 5.3.1, « Console d'amorçage ») ou les options de préconfiguration (consultez la Section 5.3.2, « Paramètres pour l'installateur Debian » et l'Annexe B, Automatisation de l'installation par préconfiguration) — peuvent être positionnés avec une commande comme celle-ci
setenv bootargs console=ttyS0,115200 rootwait panic=10
La commande exacte pour exécuter le code chargé dépend du format d'image utilisé. Pour le format uImage/uInitrd, la commande sera :
bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
et avec une image Linux native, elle sera :
bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}
Note : dans le cas de l'amorçage avec une image Linux standard, il est important de charger l'initrd après le noyau et le dtb, car u-boot positionne la variable filesize à la taille du dernier fichier chargé, et la commande bootz a besoin de la taille de cet initrd pour fonctionner correctement. Dans le cas de l'amorçage d'un noyau spécifique (c'est-à-dire sans arbre de périphériques), il suffit d'omettre le paramètre ${fdt_addr_r}.
Many modern u-boot versions have USB support and allow booting from USB mass storage devices such as USB sticks. Unfortunately the exact steps required to do that can vary quite a bit from device to device.
U-Boot v2014.10 has introduced a common commandline handling and autoboot framework. This allows building generic boot images that work on any system implementing this framework. The installateur Debian
supports installation from a USB stick on such systems, but unfortunately not all platforms have adopted this new framework yet.
To build a bootable USB stick for installing Debian, unpack the hd-media tarball (see Section 4.2.1, « Où trouver les fichiers d'installation ? ») onto a USB stick formatted with a filesystem supported by the u-boot version on your device. For modern u-boot versions, any of FAT16 / FAT32 / ext2 / ext3 / ext4 usually works. Then copy the ISO image file of the first Debian installation CD or DVD onto the stick.
The autoboot framework in modern u-boot versions works similar to the boot ordering options in a PC BIOS, i.e. it checks a list of possible boot devices for a valid boot image and starts the first one it finds. If there is no operating system installed, plugging in the USB stick and powering up the system should result in starting the installer. You can also initiate the USB-boot process any time from the u-boot prompt by entering the « run usb_boot » command.
One problem that can come up when booting from a USB stick while using a serial console can be a console baudrate mismatch. If a console variable is defined in u-boot, the installateur Debian
boot script automatically passes it to the kernel to set the primary console device and, if applicable, the console baudrate. Unfortunately the handling of the console variable varies from platform to platform - on some platforms, the console variable includes the baudrate (as in « console=ttyS0,115200 »), while on other platforms the console variable contains only the device (as in « console=ttyS0 »). The latter case leads to a garbled console output when the default baudrate differs between u-boot and the kernel. Modern u-boot versions often use 115200 baud while the kernel still defaults to the traditional 9600 baud. If this happens, you should manually set the console variable to contain the correct baudrate for your system and then start the installer with the « run usb_boot » command.