Artikel als PDF Gesamtansicht

3 Anpassung des Bootloaders

Um Arch Linux ARM vom USB-Stick starten zu können, muss der Bootloader U-Boot aktualisiert und angepasst werden. Dazu wird zunächst das auf dem internen Flash-Speicher befindliche Pogoplug-Linux gebootet. Wer ein ungewolltes Firmwareupdate befürchtet, das u.U. den SSH-Zugang deaktiviert, trennt zuvor einstweilen den Router physisch vom Internet.

3.1 Update

Nach Herstellen der Stromzufuhr können einige Minuten vergehen, bis der DockStar vom Router eine IP Adresse anfordert und der Zugang per SSH (Login: root, Passwort: stxadmin) möglich ist. Als erstes beendet man dann den Pogoplug Client:

Pogoplug:$ killall hbwd 

Danach kann die Internetverbindung ggf. wieder hergestellt werden. Anschließend wird das Installationsscript von Jeff Doozan heruntergeladen und ausgeführt:

Achtung: Das in den folgenden Schritten installierte U-Boot Environment ermöglicht weiterhin auch das auf dem NAND befindliche Pogoplug Linux zu booten. Das neue, von Arch Linux ARM gepflegte Environment erlaubt dies nicht. Das neue Environment wird wie in Schritt 7 und 8 der Installationsanleitung beschrieben mit dem Script dockstar.sh (bzw. pogo_e02.sh für den Pogoplug E02) installiert. Auf bestehenden ALARM-Installationen erfolgt die Umstellung - sofern gewünscht - durch Installation des Paketes uboot-dockstar (bzw. uboot-pogo_e02)

Pogoplug:~$ cd /tmp
Pogoplug:/tmp$ wget http://jeff.doozan.com/uboot/install_uboot_mtd0.sh
Pogoplug:/tmp$ chmod +x install_uboot_mtd0.sh
Pogoplug:/tmp$ ./install_uboot_mtd0.sh

Bevor das Script eine neue Version von U-Boot installiert, deaktiviert es den Pogoplug Client permanent durch Auskommentieren einer Zeile im Startscript /etc/init.d/rcS:

#Uncomment the line below to enable the pogoplug service
#/etc/init.d/hbmgr.sh start

3.2 Konfiguration

Hinweis: Die folgenden Einstellungen beziehen sich auf das U-Boot Environment von Jeff Doozan. Das von Arch Linux ARM gepflegte Environment verwendet z.T. andere Umgebungsvariablen, die vorzugsweise über eine auf dem USB-Stick anzulegende Datei /boot/uEnv.txt (re)konfiguriert werden.

Das U-Boot Environment besteht aus Variablen und Befehlen, die auf der U-Boot-Kommandozeile4 mit sentenv gesetzt und mit printenv angezeigt werden können. Um dasselbe aus dem laufenden Betriebssystem heraus zu bewerkstelligen zu können, installiert das Script im Verzeichnis /usr/sbin/ die Programme fw_setenv und fw_printenv5. Sie müssen ggf. mit vollständigem Pfad aufgerufen werden, man kann aber auch vorübergehend die Shellvariable PATH erweitern:

Pogoplug:/tmp$ PATH=$PATH:/usr/sbin/
Pogoplug:/tmp$ fw_printenv

Wie der Ausgabe zu entnehmen ist, generiert der Befehl usb_set_bootargs die Kernel-Bootparameter. Die dort verwendete Variable für die Rootpartition $usb_root wird über usb_scan ermittelt. Folgende Anpassungen habe ich vorgenommen, um sicherzustellen, dass hier nicht die erste, sondern die zweite Partition des USB-Sticks zugeordnet wird:

Pogoplug:/tmp$ fw_setenv usb_scan_1 'usb=0:1 dev=sda2'
Pogoplug:/tmp$ fw_setenv usb_scan_2 'usb=1:1 dev=sdb2'
Pogoplug:/tmp$ fw_setenv usb_scan_3 'usb=2:1 dev=sdc2'
Pogoplug:/tmp$ fw_setenv usb_scan_4 'usb=3:1 dev=sdd2'

Ist das Device der Rootpartition bekannt (z.B. bei fester Anordnung von USB-Datenträgern), kann stattdessen auch das Script usb_set_bootargs direkt editiert werden, siehe Abschnitt 8. Vorläufig behelfen wir uns aber wie beschrieben. Weiterhin müssen noch die Angaben betreffs des root-Dateisystems und der arcNumber6 (zur Ansteuerung der LEDs) angepasst werden:

Pogoplug:/tmp$ fw_setenv usb_rootfstype ext4
Pogoplug:/tmp$ fw_setenv arcNumber 2998

Empfehlenswert ist auch das Aktivieren der Netzkonsole (Abschnitt 3.3). Schließlich wird der vorbereitete USB-Stick angeschlossen und der DockStar neu gebootet:

Pogoplug:/tmp$ /sbin/reboot

Wie man ggf. den Bootmeldungen entnehmen kann, scheitert der Start von Arch Linux ARM u. U. zunächst. In diesem Fall wird spätestens nach einigen Minuten erneut das weiterhin auf dem internen Flash-Speicher residierende Pogoplug Linux geladen. Nach einem weiteren Neustart sollte es dann gelingen. Wurde dieselbe IP vergeben bzw. statisch eingestellt, ist vor der nächsten Anmeldung (Login: root, Passwort: root) der öffentliche Schlüssel von Pogoplug Linux aus der Liste der bekannten Hosts zu entfernen (IP-Adresse anpassen).

[user@linux ~]$ ssh-keygen -R 192.168.1.5

Je nach verwendetem USB-Stick führt jede künftige Unterbrechnung der Stromzufuhr u.U. dazu, dass zunächst wieder Pogoplug Linux gestartet wird. Um einen Reboot per SSH herbeiführen zu können, muss nun ggf. erneut der Schlüssel gelöscht werden. Eine Möglichkeit diesen Zyklus zu unterbinden und zuverlässig auch nach einem Kaltstart Arch Linux ARM zu booten findet sich im Forum von Jeff Doozan.

Pogoplug:/tmp$ fw_setenv bootcmd 'usb start; usb stop; usb start; run force_rescue_bootcmd; run ubifs_bootcmd; run usb_bootcmd; usb stop; run rescue_bootcmd; run pogo_bootcmd; reset'

Nun sollte Pogoplug Linux als Fallback nur noch bei nicht angeschlossenem USB-Stick booten.7

3.3 Netzkonsole

Mithilfe der Netzkonsole können Meldungen des Bootloaders auf einem anderen Rechner (Server) im Netzwerk angezeigt werden. Die notwendigen Einstellungen beschreibt Jeff Doozan in seinem Forum. Im folgenden Beispiel ist 192.168.1.5 die IP des DockStar, U-Boot sendet die Nachrichten an Port 6666 des angegebenen Servers:8

Pogoplug:/tmp$ fw_setenv serverip 192.168.1.7
Pogoplug:/tmp$ fw_setenv ipaddr 192.168.1.5
Pogoplug:/tmp$ fw_setenv if_netconsole 'ping $serverip'
Pogoplug:/tmp$ fw_setenv start_netconsole 'setenv ncip $serverip; setenv bootdelay 10; setenv stdin nc; setenv stdout nc; setenv stderr nc; version;'
Pogoplug:/tmp$ fw_setenv preboot 'run if_netconsole start_netconsole'

Auf demselben Weg lassen sich auch Kernelmeldungen übertragen, die benötigten Kernelparameter können in der Variablen usb_custom_params hinterlegt werden9. Auch hier wird Port 6666 verwendet. Das ist unproblematisch, da die Kernelmeldungen ohnehin zeitlich nach den Bootmeldungen folgen. Der letzte Parameter ist die MAC-Adresse der Netzwerkkarte des Servers.

Pogoplug:/tmp$ fw_setenv usb_custom_params 'loglevel=7 netconsole=6666@192.168.1.5/eth0,6666@192.168.1.7/00:13:32:20:r9:a5'

Auf dem Server startet man netcat wie folgt. Es besteht auch die Möglichkeit mit U-Boot zu interagieren: Nach Beginn des Countdowns gelangt man durch mehrmaliges Drücken der Tastenkombination Strg+j an den Bootprompt.

[user@linux ~]$ netcat -l -u -p 6666
U-Boot 2011.12 (Feb 12 2012 - 21:33:07)
Seagate FreeAgent DockStar
GNU ld (Sourcery G++ Lite 2009q3-67) 2.19.51.20090709
Hit any key to stop autoboot: 10 
 9 

 0 
u-boot>> help

Bleibt das Gerät nach dem Booten im Netzwerk unsichtbar, kann man versuchen mit einer direkt angeschlossenen USB-Tastatur über die Tastenkombination Strg+Alt+Entf einen Reboot herbeizuführen. Via netcat lässt sich der Bootvorgang dann wie beschrieben aufhalten, um den USB-Stick entnehmen und am Linux-PC untersuchen und reparieren zu können10. Eingabe von boot am U-Boot Prompt setzt den Bootvorgang anschließend fort.

Einrichtung von Arch Linux ARM Anpassung des Bootloaders

  1. Zur interaktiven U-Boot-Kommandozeile gelangt man über eine serielle Konsole oder über die Netzkonsole.

  2. fw_printenv ist ein symbolischer Link auf fw_setenv. Innerhalb von Arch Linux ARM stellt das Paket uboot-tools diese Befehle bereit, sie können dann ohne Pfad bzw. PATH-Anpassung aufgerufen werden.

  3. Auf dem Pogoplug E02 setzt man stattdessen die machid auf den Wert dd6.

  4. Mainline U-Boot bietet diese Funktionalität nicht, bei fehlendem USB-Stick wird der Bootvorgang abgebrochen. Wie man den von Jeff Doozans U-Boot gewohnten Fallback-Mechanismus auf Mainline U-Boot übertragen könnte, habe ich im Forum skizziert.

  5. Unter Mainline U-Boot steht der Befehl preboot gegenwärtig nicht zur Verfügung.

  6. Unter Mainline U-Boot ist für diesen Zweck die Variable optargs vorgesehen:

    #/boot/uEnv.txt
    optargs=loglevel=7 netconsole=6666@192.168.1.5/eth0,6666@192.168.1.7/00:13:32:20:r9:a5
  7. So lässt sich, falls vorhanden, das Journal inspizieren:

    [root@linux ~]# fsck /dev/sdx2
    [root@linux ~]# mount /dev/sdx2 /mnt
    [root@linux ~]# journalctl -D /mnt/var/log/journal/

    Dabei könnte z.B. zutage treten, dass die Einbindung ins Netzwerk per DHCP fehlschlägt:

    Jan 01 01:00:33 alarm dhcpcd[124]: timed out
    Jan 01 01:00:33 alarm dhcpcd[124]: exited
    Jan 01 01:00:33 alarm ifplugd[96]: client: DHCP IP lease attempt failed on interface 'eth0'
    Jan 01 01:00:33 alarm ifplugd[96]: client: Failed to bring the network up for profile 'eth0'

    Hier wäre dann zumindest vorubergehend eine statische IP-Adresse hilfreich, siehe Abschnitt 2.3.