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.

5.1.3. In U-Boot opstarten vanaf een USB-stick

Veel moderne versies van U-Boot ondersteunen USB en bieden de mogelijkheid om op te starten vanaf USB-massaopslagapparaten, zoals USB-sticks. Jammer genoeg kunnen de exacte stappen die daarvoor nodig zijn nogal wat verschillen van apparaat tot apparaat.

Met U-Boot v2014.10 werd een gemeenschappelijk commandoregelgebruik geïntroduceerd en een raamwerk voor automatisch opstarten. Dit maakt het mogelijk om algemene opstart-images te bouwen die werken op elk systeem dat dit raamwerk gebruikt. Op dergelijke systemen ondersteunt debian-installer een installatie vanaf USB-stick, maar jammer genoeg hebben nog niet alle platformen reeds dit raamwerk overgenomen.

Om een opstartbare USB-stick te bouwen om Debian te installeren, moet u het tar-archief hd-media (zie Paragraaf 4.2.1, “Waar u installatie-images kunt vinden”) uitpakken op een USB-stick die geformatteerd werd met een bestandssysteem dat ondersteund wordt door de versie van U-Boot op uw apparaat. Moderne versies van U-Boot kunnen gewoonlijk werken met FAT16 / FAT32 / ext2 / ext3 / ext4. Nadien moet u het ISO-imagebestand van de eerste Debian installatie-CD of -DVD naar de stick kopiëren.

Het raamwerk voor automatisch opstarten van moderne U-Boot-versies heeft een gelijkaardige werking als de opstartvolgordeopties in het BIOS van een PC. Het controleert dus een lijst van mogelijke opstartapparaten op een geldig opstartimage en start het eerste dat het vindt, op. Indien er geen besturingssysteem geïnstalleerd is, zou het inpluggen van de USB-stick en het aanzetten van het systeem moeten uitmonden in het opstarten van het installatiesysteem. U kunt het proces van het opstarten vanaf USB ook op elk ogenblik uitlokken aan de prompt van U-Boot met het commando run bootcmd_usb0.

Een probleem dat zich kan stellen bij het opstarten vanaf een USB-stick terwijl u een seriële console gebruikt, is een verkeerde baudsnelheid van de console. Indien de variabele console gedefinieerd werd in U-Boot, geeft het opstartscript van debian-installer dit automatisch door aan de kernel voor het instellen van het primaire console-apparaat en, in voorkomend geval, de baudsnelheid van de console. Jammer genoeg verschilt de wijze van aanpakken van de variabele console van platform tot platform - op sommige platformen bevat de variabele console de baudsnelheid (zoals bij console=ttyS0,115200), terwijl op andere platformen de variabele console enkel het apparaat bevat (zoals bij console=ttyS0). In dit laatste geval krijgt u een verknoeide uitvoer op de console als U-Boot en de kernel een verschillende standaard baudsnelheid hebben. Moderne versies van U-Boot gebruiken vaak een baud van 115200, terwijl de kernel nog steeds als standaard de traditionele 9600 baud gebruikt. Als dit zich voordoet, moet u de variabele console handmatig instellen, zodat hij de voor uw systeem correcte baudsnelheid bevat, en moet u nadien het installatiesysteem starten met het commando run bootcmd_usb0.