Installation von PlugApps Linux auf dem Guruplug
Inzwischen habe ich sehr viele Erfahrungen mit Installation und Konfiguration des Guruplugs gesammelt und möchte nun eine kleine Zusammenfassung schreiben, um mit all den veralteten und falschen Anleitungen, die überall im Internet kursieren, aufzuräumen.
Diese Anleitung zeigt, im Gegensatz zu vielen Anderen, wie man ein Linux auf dem internen Flashspeicher installiert. Dafür wird allerdings die Zusatzbox mit serieller Konsole und JTAG-Interface benötigt. Ich gehe davon aus, dass auf dem Hostrechner ein aktuelles Fedora Betriebssystem installiert ist, für andere Distributionen müssen die Befehle gegebenenfalls angepasst werden.
Als Betriebssystem für den Guruplug habe ich mich für PlugApps Linux entschieden, da es Binärpakete für den ARM Prozessor gibt, leicht zu konfigurieren ist und regelmäßige Updates erfährt.
1. Vorbereitungen
1.1 Installation eine Crosscompilers
Dieser Compiler wird nur zur Übersetzung des Bootloaders benötigt, weshalb wir eine zwar etwas alte, dafür aber leicht für Fedora verfügbare Variante des GCC nutzen.
su
cd /etc/yum.repos.d/
wget http://ftp.linux.org.uk/pub/linux/arm/fedora/cross/cross.repo
yum install armv5tel-redhat-linux-gnueabi-gcc
1.2 Installation von OpenOCD
OpenOCD (On Chip Debugger) bietet die Möglichkeit per JTAG auf den Guruplug zuzugreifen. Da dies vollkommen unabhängig von der auf dem Plug installierten Software funktioniert, kann damit sehr einfach der Bootloader überschrieben werden, aber auch ein Plug mit zerstörtem Flashinhalt ins Leben zurück geholt werden. Uns reicht hier wieder die in den Paketquellen verfügbare Version, da diese alle nötigen Konfigurationsdateien schon mitbringt.
su
yum install openocd
1.3 Installation eines TFTP Servers
Durch den TFTP Server ist es möglich dem Bootloader des Guruplugs größere Dateien über das Netzwerk zur Verfügung zu stellen. Das benötigen wir um später den Kernel und das Rootdateisystem auf den Plug zu übertragen.
su
yum install tftp-server
chkconfig tftp on
chkconfig xinetd on
1.4 Installation und einrichten von Minicom
Minicom ist ein kleines Terminalprogramm, mit welchem man sich auf die serielle Konsole des Plugs verbinden kann. Ich nutze dieses Programm immer im root Modus, da ich mir nicht die Mühe gemacht habe es für einen einzelnen Benutzer einzurichten.
su
yum install minicom
minicom -s
Daraufhin erscheint ein Konfigurationsmenü, in welchem die folgenden Werte gesetzt werden müssen:
A - Serial Device : /dev/ttyUSB0
B - Lockfile Location : /var/lock
C - Callin Program :
D - Callout Program :
E - Bps/Par/Bits : 115200 8N1
F - Hardware Flow Control : No
G - Software Flow Control : No
Hier kann es nötig sein das "Serial Device" anzupassen, falls man mehr als eine serielle Konsole an einen Hostrechner anschließt. Die oben gezeigte Standardkonfiguration sollte also für fast alle Benutzer in Ordnung sein.
1.5 Installation der UBI-Tools
Die UBI-Tools werden benötigt um später das Rootdateisystem zu erstellen. Auch hier genügt die in den Paketquellen verfügbare Version.
su
yum install mtd-utils-ubi
2. Eine aktuelle U-Boot Version erstellen und auf den Plug flashen
Nun geht es richtig los. U-Boot ist ein Bootloader für eingebettete Systeme und wird auch auf dem GuruPlug verwendet. Allerdings ist standardmäßig eine veraltete Version installiert, mit der das Booten eines aktuellen Kernels nicht möglich ist, weshalb wir uns als erstes daran machen werden dort ein Update einzuspielen.
2.1 aktuelle Version bauen
Dazu müssen wir zuerst eine aktuelle Version des Sourcecodes herunterladen:
git clone git://git.denx.de/u-boot-marvell.git u-boot-marvell
cd u-boot-marvell
git checkout -b testing origin/testing
Danach können wir mit Hilfe des im Schritt 1.1 installierten Cross-Compilers ein Bootimage erstellen.
make mrproper
make guruplug_config
make u-boot.kwb CROSS_COMPILE=armv5tel-redhat-linux-gnueabi-
Das fertige Image stellen wir nun per TFTP im Netzwerk bereit.
su -c 'cp u-boot.kwb /var/lib/tftpboot/'
2.2 Flashen des Bootloaders mittels serieller Konsole
Zuerst muss dazu das JTAG-Board mit dem Guruplug und dem Hostrechner verbunden werden. Danach wird minicom in einer Rootkonsole gestartet.
su
minicom
Nun kann der Guruplug mit Strom versorgt werden, dabei sollte der Bootvorgang in minicom sichtbar werden. Sobald U-Boot initialisiert ist, kann der Boot durch drücken einer beliebigen Taste abgebrochen werden. Danach müssen auf dem Plug einige Umgebungsvariablen gesetzt werden, um den Datentransfer per TFTP zu ermöglichen. Hier ist es zu empfehlen Hostrechner und Guruplug jeweils eine statische, freie IP im Heimnetzwerk zuzuweisen, um Problemen mit dem DHCP vorzubeugen.
setenv serverip <ip-des-hostrechners>
setenv ipaddr <statische-ip-für-guruplug>
Danach ziehen wir das U-Boot Image vom TFTP Server in den RAM des Plugs und schreiben es anschließend in den Flash.
tftp 0x6400000 u-boot.kwb
nand erase 0 0x100000
nand write.e 0x6400000 0 0x100000
Nach einem Neustart sollte sich der neue Bootloader melden:
reset
3. PlugApps Linux auf Guruplug flashen
3.1 Download und entpacken des aktuellen Rootdateisystems
Die aktuelle Version des PlugApps Linux Rootdateisystems findet man auf der entsprechenden Wiki Seite. Hier bitte das .tar.gz Archiv herunterladen, da wir daraus noch das Kernelimage extrahieren müssen, was bei einem einem Ubi-Image nicht möglich ist. Das Archiv muss mit Rootrechten entpackt werden, da sonst einige notwendige Dateien nicht angelegt werden können.
su
cd <verzeichnis-in-das-entpackt-werden-soll>
tar -xzf <pfad-zu-archiv>
Aus dem nun entpackten Rootdateisystem kann das Kernelimage extrahiert werden und auf den TFTP Server kopiert werden.
su
cp rootfs/boot/uImage /var/lib/tftp
3.2 Umwandeln des rootfs Verzeichnisbaums in ein UBI-Image
Dazu wird zuerst eine Datei mit den Eigenschaften des Dateisystems erstellt:
cat << EOF > ./ubi.cfg
[ubifs]
mode=ubi
image=rootfs.ubifs.img
vol_id=0
vol_size=356MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
EOF
Danach kann das UBI-Image erzeugt werden:
mkfs.ubifs -x zlib -m 2048 -e 129024 -c 4096 -r <pfad-zu-rootfs-verzeichnis> rootfs.ubifs.img
ubinize -o rootfs.ubi.img -m 2048 -p 128KiB -s 512 ./ubi.cfg
rm -f rootfs.ubifs.img
Dieses Image wird auch ins TFTP Verzeichnis kopiert, um es für den Guruplug verfügbar zu machen.
3.3 Flashen des Kernels und des Rootdateisystems
Dazu muss wieder per minicom auf die serielle Konsole des Plugs zugegriffen werden. Nachdem der Bootvorgang unterbrochen wurde, werden wieder die IP Adressen in den Umgebungsvariablen gesetzt:
setenv serverip <ip-des-hostrechners>
setenv ipaddr <statische-ip-für-guruplug>
Danach wird der Kernel in den RAM übertragen und in den Flashspeicher geschrieben:
tftp 0x6400000 uImage
nand erase 0x100000 0x400000
nand write.e 0x6400000 0x100000 0x400000
Zuletzt wird das Rootdateisystem auf ähnliche Art und Weise geflasht:
tftp 0x6400000 rootfs.ubi.img
Nach dem Ende der Übertragung wird die Größe des Images als Hexadezimalzahl angezeigt. Diese Zahl muss gemerkt werden, da sie im nächsten Schritt gebraucht wird.
nand erase 0x500000 0x1fb00000
nand write.e 0x6400000 0x500000 0x<zahl_aus_letztem_schritt>
Damit ist die Installation von PlugApps Linux im internen Flashspeicher des Guruplugs abgeschlossen und bereit zum Boot.