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.
Booten per TFTP
&boot-installer-intro-net.xml;
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 ) oder eventuelle
Voreinstellungsoptionen (Näheres in und ) -
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.
Booten von USB-Stick in U-Boot
Viele moderne Versionen von U-Boot haben USB-Unterstützung und
erlauben das Booten von USB-Massenspeicher-Geräten wie z.B.
USB-Sticks. Unglücklicherweise können sich die genauen Schritte, die
dazu nötig sind, von Gerät zu Gerät ein wenig unterscheiden.
In U-Boot v2014.10 wurde das grundlegende Handling für eine
Kommandozeile sowie ein Rahmenwerk für automatisches Booten
(autoboot) eingeführt. Dies erlaubt die Erzeugung generischer
Boot-Images, die auf jedem System funktionieren, das dieses Rahmenwerk
implementiert hat. Der &d-i; unterstützt die Installation von
USB-Stick auf solchen Systemen, aber leider haben noch nicht alle
Plattformen dieses Rahmenwerk übernommen.
Um einen boot-fähigen USB-Stick zur Installation von &debian;
zu erstellen, entpacken Sie das hd-media-Tarball-Archiv (Näheres
in ) auf einen USB-Stick,
der mit einem Dateisystem formatiert ist, welches von der
U-Boot-Version auf Ihrem Gerät unterstützt wird.
Bei neueren U-Boot-Versionen sollten FAT16, FAT32, ext2, ext3
und ext4 normalerweise funktionieren. Kopieren Sie dann auch die
ISO-Image-Datei der ersten &debian;-Installations-CD oder -DVD
auf den Stick.
Das autoboot-Rahmenwerk in modernen U-Boot-Versionen funktioniert
ähnlich wie die Optionen für die Bootreihenfolge in einem PC-Bios,
d.h. auf verschiedenen möglichen Boot-Geräten wird der Reihe nach
nach einem gültigen Boot-Image gesucht und das erste gefundene wird
gestartet. Wenn kein Betriebssystem installiert ist, sollte das
Starten des Systems mit eingestecktem USB-Stick den Installer booten.
Sie können den USB-Boot-Prozess auch zu jeder Zeit vom
U-Boot-Prompt aus anstoßen, indem Sie den
run bootcmd_usb0
-Befehl ausführen.
Ein Problem, das beim Booten von einem USB-Stick bei Nutzung der
seriellen Konsole auftreten könnte, ist eine nicht passende
Konsolenbaudrate. Wenn die console-Variable in U-Boot definiert
ist, wird das Boot-Skript des &d-i; diese automatisch an den
Kernel weiterleiten, um das primäre Konsolengerät und - falls
anwendbar - die Baudrate einzustellen. Unglücklicherweise
variiert die Handhabung der console-Variable von Plattform zu
Plattform - auf einigen Plattformen enthält die console-Variable
die Baurate (wie in console=ttyS0,115200
), auf
anderen hingegen lediglich den Gerätenamen (z.B.
console=ttyS0
).
In letzterem Fall kann es zu einer verstümmelten Konsolenausgabe
kommen, wenn die Standard-Baudrate bei U-Boot und dem Kernel
nicht übereinstimmt. Moderne U-Boot-Versionen verwenden oft
eine Geschwindigkeit von 115200 Baud, während beim Kernel noch
der alte traditionelle Wert von 9600 Baud voreingestellt ist.
Falls dies passiert, sollten Sie die console-Variable händisch
setzen, so dass Sie die korrekte Baudrate für Ihr System
enthält, und dann den Installer mit run bootcmd_usb0
starten.
Verwenden von vorbereiteten (pre-built) SD-Karten-Images mit dem Installer
Für eine Reihe von Systemen bietet Debian SD-Karten-Images an,
die sowohl U-Boot wie auch den &d-i; enthalten. Diese Images gibt es
in zwei Varianten - eine für das Herunterladen der Software-Pakete
über das Netzwerk (verfügbar unter &armmp-netboot-sd-img;) und die
andere für Offline-Installationen ohne Internet-Verbindung, die
stattdessen eine Debian-CD/DVD verwenden (unter &armmp-hd-media-sd-img;
verfügbar).
Um Speicherplatz und Bandbreite zu sparen, bestehen die Images aus
zwei Teilen - einem System-abhängigen Teil namens
firmware.<system-typ>.img.gz
und einem
System-unabhängigen Teil namens partition.img.gz
.
Um auf einem Linux-System aus diesen beiden Teilen ein vollständiges
Image zu erzeugen, können Sie zcat wie folgt verwenden:
zcat firmware.<system-typ>.img.gz partition.img.gz > complete_image.img
Auf Windows-Systemen müssen Sie die beiden Teile zunächst separat
dekomprimieren, was zum Beispiel mit 7-Zip erledigt werden kann,
und dann durch Eingabe des folgenden Befehls in einem cmd.exe-Fenster
wieder zusammenfügen:
copy /b firmware.<system-typ>.img + partition.img complete_image.img
Schreiben Sie das erzeugte Image auf eine SD-Karte, indem Sie
z.B. auf einem Linux-System folgenden Befehl nutzen:
cat complete_image.img > /dev/SD_KARTEN_GERÄT
Nachdem Sie die SD-Karte in das Zielsystem eingesteckt
und dieses eingeschaltet haben, wird der Installer von der
SD-Karte geladen. Falls Sie die hd-media-Variante für eine
Installation ohne Internet-Verbindung verwenden, müssen Sie dem
Installer über ein separates Medium Zugriff auf die erste
&debian;-CD/DVD ermöglichen; dies kann z.B. über ein CD/DVD-ISO-Image
auf einem USB-Stick geschehen.
Wenn Sie im Installer den Schritt für die Partionierung erreichen
(lesen Sie dazu ), können Sie jegliche
Partitionen auf der SD-Karte löschen oder ersetzen. Sobald der Installer
einmal gestartet ist, läuft er komplett im Arbeitsspeicher des
Systems und benötigt keinen Zugriff auf die SD-Karte mehr.
Daher können Sie die vollständige SD-Karte zur Installation von
&debian; benutzen.
Der einfachste Weg, ein passendes Partitions-Layout auf der
SD-Karte zu erstellen, ist die Nutzung der Geführten Partitionierung
(Näheres hierzu in ).