5.1. Starten des Installers auf ARM-Systemen

5.1.1. Boot-Image-Formate

Auf ARM-basierten Systemen wird in den meisten Fällen eines dieser beiden Formate für die Boot-Images verwendet: a) Standard-Linux-Kernel im zImage-Format (vmlinuz) zusammen mit einer Standard-Linux-Initial-Ramdisk (initrd.gz) oder b) Kernel im uImage-Format (uImage) zusammen mit dazu zugehöriger Initial-Ramdisk (uInitrd).

uImage/uInitrd sind Image-Formate, die für die u-boot-Firmware ausgelegt wurden, welche auf vielen ARM-basierten Systemen eingesetzt ist. Ältere u-boot-Versionen können nur Dateien im uImage-/uInitrd-Format booten, daher werden diese Formate oft auf älteren armel-Systemen genutzt. Neuere u-boot-Versionen können - neben uImage/uInitrd - auch Standard-Linux-Kernel- und Ramdisk-Images booten, aber die Befehlssyntax dafür ist etwas anders als beim Booten von uImages.

Für Systeme, die einen Multiplattform-Kernel verwenden, ist zusätzlich zu Kernel- und Initial-Ramdisk-Image noch eine sogenannte Gerätebaum-Datei (auch Gerätebaum-Abbild / device-tree blob, dtb) erforderlich. Diese ist spezifisch für jedes unterstützte System und enthält eine Beschreibung der jeweiligen Hardware.

5.1.2. Booten per TFTP

Um per Netzwerk booten zu können, benötigen sie eine Netzwerkverbindung sowie einen TFTP-Netzwerk-Boot-Server (und unter Umständen auch einen DHCP-, RARP- oder BOOTP-Server zur automatischen Netzwerkkonfiguration).

Die server-seitige Einrichtung zur Unterstützung vom Booten über Netzwerk ist im Abschnitt 4.3, „Dateien vorbereiten für TFTP-Netzwerk-Boot“ beschrieben.

5.1.2.1. TFTP-Boot in u-boot

Das Booten von Systemen über das Netzwerk mittels der u-boot-Firmware erfordert drei Schritte: a) Konfigurieren des Netzwerks, b) Laden der Images (Kernel/Initial-Ramdisk/dtb) in den Speicher und c) das eigentliche Ausführen des vorher geladenen Codes.

Als erstes müssen Sie das Netzwerk konfigurieren, entweder automatisch über DHCP, indem Sie dies ausführen:

setenv autoload no
dhcp

oder manuell, indem Sie verschiedene Umgebungsvariablen setzen:

setenv ipaddr <ip-adresse des clients>
setenv netmask <netmask>
setenv serverip <ip-adresse des tftp-servers>
setenv dnsip <ip-adresse des nameservers>
setenv gatewayip <ip-adresse des standard-gateways>

Falls Sie möchten, können Sie diese Einstellungen auch fest einrichten mit:

saveenv

Danach müssen Sie die Images (Kernel/Initial-Ramdisk/dtb) in den Speicher laden. Dies wird mit dem tftpboot-Befehl erledigt, der zusammen mit der Adresse, an der das Image im Speicher abgelegt werden soll, angegeben werden muss. Unglücklicherweise kann die Lücke im Speicher von System zu System variieren, daher gibt es keine grundsätzliche Regel, welche Adresse hierfür verwendet werden muss.

Auf einigen Systemen legt u-boot einige Umgebungsvariablen mit passenden Ladeadressen an: kernel_addr_r, ramdisk_addr_r und fdt_addr_r. Sie können überprüfen, ob diese definiert sind, indem Sie dies ausführen:

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Falls sie nicht definiert sind, müssen Sie die Dokumentation des Systems konsultieren bezüglich näherer Angaben zu passenden Werten und diese händisch setzen. Für Systeme, die auf Allwinner SunXi-SoCs (z.B. dem Allwinner A10, Architekturname sun4i oder dem Allwinner A20, Architekturname sun7i) basieren, können Sie z.B. folgende Werte nutzen:

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

Sind die Ladeadressen bereits definiert, können Sie die Images von dem vorher definierten TFTP-Server in den Speicher laden mit:

tftpboot ${kernel_addr_r} <dateiname des kernel-images>
tftpboot ${fdt_addr_r} <dateiname des dtb>
tftpboot ${ramdisk_addr_r} <dateiname des initial-ramdisk-images>

Der dritte Schritt ist das Setzen der Kernel-Befehlszeile und das eigentliche Ausführen des geladenen Codes. u-boot übergibt den Inhalt der Umgebungsvariable bootargs als Befehlszeile an den Kernel; also können alle Parameter für den Kernel und den Installer - wie z.B. die Konsolen-Gerätedatei (lesen Sie dazu Abschnitt 5.3.1, „Boot-Konsole“) oder eventuelle Voreinstellungsoptionen (Näheres in Abschnitt 5.3.2, „Debian-Installer-Parameter“ und Anhang B, Automatisieren der Installation mittels Voreinstellung) - mit einem Befehl wie dem folgenden gesetzt werden:

setenv bootargs console=ttyS0,115200 rootwait panic=10

Der exakte Befehl zur Ausführung des vorher geladenen Codes hängt vom verwendeten Image-Format ab. Bei uImage/uInitrd lautet der Befehl:

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

Bei nativen Linux-Image ist es:

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

Beachten Sie: wenn Sie Standard-Linux-Images booten, ist es wichtig, dass das Initial-Ramdisk-Image nach dem Kernel und der DTB geladen wird, da u-boot die filesize-Variable (Dateigröße) auf die Größe der letzten geladenen Datei setzt und der bootz-Befehl benötigt die Größe des Ramdisk-Images, um korrekt zu arbeiten. Beim Booten eines plattformspezifischen Kernels, also eines Kernels ohne Gerätebaum-Abbild (DTB), lassen Sie den ${fdt_addr_r}-Parameter einfach weg.