5.1. Het installatiesysteem starten op 32-bit soft-float ARM

5.1.1. Vormen van het opstart-image

Op systemen die gebaseerd zijn op ARM wordt in de meeste gevallen een van de twee volgende vormen van opstart-images gebruikt: a) een kernel in standaard Linux zImage-indeling (vmlinuz) in combinatie met een standaard initiële Linux ramschijf (initrd.gz) of b) een kernel in uImage-indeling (uImage) in combinatie met een overeenkomstige initiële ramschijf (uInitrd).

uImage/uInitrd zijn image-indelingen die ontworpen zijn voor de U-Boot firmware die op veel systemen die op ARM gebaseerd zijn, gebruikt wordt (meestal de 32-bits types). Oudere versies van U-Boot kunnen enkel bestanden in de uImage/uInitrd-indeling opstarten en daarom worden die vaak op oudere armel-systemen gebruikt. Recentere versies van U-Boot kunnen - naast uImages/uInitrds - ook standaard Linux kernels en ramschijf-images opstarten, maar de syntaxis van het commando om dat te doen verschilt lichtjes van die voor het opstarten van uImages.

Systemen die een multiplatformkernel gebruiken hebben naast een kernel en een initiële ramschijf ook nog een zogenaamd apparatenboombestand (of device-tree blob, dtb) nodig. Dat is specifiek voor elk ondersteund systeem en bevat een beschrijving van de bewuste hardware. De firmware van het apparaat zou moeten voorzien in de dtb, maar in de praktijk moet vaak een recentere versie geladen worden.

5.1.2. Opstarten via TFTP

Om over het netwerk te kunnen opstarten moet u een netwerkverbinding hebben en een TFTP netwerk-opstartserver (en wellicht ook een DHCP-, RARP-, of BOOTP-server voor het automatisch configureren van de netwerkinstellingen).

De instellingen aan de kant van de server voor het ondersteunen van opstarten over het netwerk, worden beschreven in Paragraaf 4.3, “Bestanden klaarmaken om over het netwerk op te starten met TFTP”.

5.1.2.1. Opstarten via TFTP in U-Boot

Over het netwerk opstarten met systemen die gebruik maken van de U-Boot firmware, omvat drie stappen: a) het netwerk configureren, b) de images (kernel/initiële ramschijf/dtb) in het geheugen laden, en c) de eerder geladen code daadwerkelijk uitvoeren.

Eerst moet u het netwerk configureren, ofwel automatisch via DHCP met de opdrachten

setenv autoload no
dhcp

ofwel handmatig door verschillende omgevingsvariabelen in te stellen

setenv ipaddr <ip-adres van de cliënt>
setenv netmask <netmasker>
setenv serverip <ip-adres van de tftp-server>
setenv dnsip <ip-adres van de naamserver>
setenv gatewayip <ip-adres van de standaard gateway>

Indien u dit verkiest, kunt u deze instellingen een permanent karakter geven met de opdracht

saveenv

Nadien moet u de images (kernel/initiële ramschijf/dtb) in het geheugen laden. Dit gebeurt met het commando tftpboot, waaraan het adres opgegeven moet worden waar het image in het geheugen geplaatst zal worden. Jammer genoeg kan het indelingsplan van het geheugen verschillend zijn van systeem tot systeem, waardoor er geen algemene regel bestaat voor welke adressen daarvoor gebruikt kunnen worden.

Op sommige systemen stelt U-Boot vooraf een aantal omgevingsvariabelen in met geschikte laadadressen: kernel_addr_r, ramdisk_addr_r en fdt_addr_r. U kunt nagaan of ze ingesteld werden met de opdracht

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Indien ze niet gedefinieerd zijn, moet u in de documentatie bij uw systeem nagaan welke waarden geschikt zijn en ze handmatig instellen. Voor systemen die gebaseerd zijn op SunXi SOC's van Allwinner (bijv. de Allwinner A10, met als architectuurnaam sun4i of de Allwinner A20, met als architectuurnaam sun7i), kunt u bijvoorbeeld de volgende waarden gebruiken:

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

Wanneer de laadadressen gedefinieerd zijn, kunt u de images vanaf de voordien gedefinieerde tftp-server in het geheugen laden met

tftpboot ${kernel_addr_r} <bestandsnaam van het kernel-image>
tftpboot ${fdt_addr_r} <bestandsnaam van het dtb>
tftpboot ${ramdisk_addr_r} <bestandsnaam van het initiële ramschijf-image>

De derde stap is het instellen van de commandoregel voor de kernel en het daadwerkelijk uitvoeren van de geladen code. U-Boot geeft de inhoud van de omgevingsvariabele bootargs als commandoregel door aan de kernel. Dus alle parameters voor de kernel en het installatiesysteem - zoals het apparaat dat de console gebruikt (zie Paragraaf 5.3.1, “Opstartconsole”) of opties in het kader van preseeding (vooraf ingestelde antwoorden - zie Paragraaf 5.3.2, “Parameters voor het installatiesysteem van Debian” en Bijlage B, De installatie automatiseren door antwoorden vooraf in te stellen) - kunnen ingesteld worden met een commando zoals

setenv bootargs console=ttyS0,115200 rootwait panic=10

Het exacte commando voor het uitvoeren van de voordien geladen code is afhankelijk van welk van de twee imagevormen gebruikt wordt. Met uImage/uInitrd is het commando

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

en met een authentieke Linux-image is het

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

Opmerking: Als u standaard Linux images start, is het belangrijk om het image van de initiële ramschijf te laden na de kernel en de dtb, omdat U-Boot de variabele filesize instelt op de grootte van het laatst geladen bestand en het commando bootz de grootte van de ramschijf nodig heeft om correct te werken. Indien u een platformspecifieke kernel start, d.w.z. een kernel zonder apparatenboom, moet u gewoon de parameter ${fdt_addr_r} weglaten.