MGB100

Der MGB100 ist ein WLAN Accesspoint mit Einbaumöglichkeit für eine 2.5” Festplatte. Die Firmware ist ein auf Linux 2.4.28 basierendes System mit einigen Closed Source Binaries von AMIT. Mich konnte diese Firmware nicht überzeugen. Die Hardware ist aber gut gelungen, und der Preis ist auch ansprechend. Das Gerät gibt es (ohne Festplatte) bereits ab 50 Euro zu kaufen.

Reseller

Das Gerät wird von mehreren Resellern angeboten. Die mir Bekannten sind folgende:

Hardware

Nach Entfernen des Gehäuses sieht das Ganze dann so aus:

mgb100-top.jpg mgb100-bottom.jpg

Die Hardware besteht im Wesentlichen aus:

Bis auf die Hardwareuhr (RTC) ist das Board praktisch PC kompatibel.

Telnet Zugang freischalten

Die Original Firmware bietet keinen Shell Zugang. Es ist aber relativ einfach, die Firmware so zu modifizieren, dass wir uns per Telnet einloggen können. Dazu laden wir die Version der Firmware, die bereits auf dem MGB100 installiert ist, von der Website des Herstellers herunter. Ist diese nicht verfügbar, so upgraden wir per Webinterface auf eine der verfügbaren Versionen. Die Firmwaredatei besteht meistens aus mehreren Segmenten:

Das Root File System ist mit Busybox aufgebaut, die auch einen telnetd enthält. Dieser muß nun auch beim Hochfahren der Box gestartet werden. Dazu müssen wir das rootfs modifizieren, wofür wir 2 kleine Hilfsprogramme benötigen:

Die Programme müssen erst mal kompiliert werden:

bunzip2 splitamitbin.c.bz2
cc -o splitamitbin splitamitbin.c
bunzip2 makeamitbin.c.bz2
cc -o makeamitbin makeamitbin.c

Nun können wir die runtergeladene Firmware in ihre einzelnen Teile zerlegen. Nehmen wir mal an, die Firmwaredatei heißt WAP-0007(R4.00b5)_2006-01-13.zip:

# unzip the firmware
unzip "WAP-0007(R4.00b5)_2006-01-13.zip"
# we have a BIN file now, we split it
./splitamitbin "WAP-0007(R4.00b5)_2006-01-13.BIN"
# see the product ID, remember this for later
# in this example it is: DDC_RUS001
# in your case it might be different
# see what we've got
ls -l

Nun haben wir die einzelnen Bestandteile als separate Dateien. Die größte ist vermutlich das rootfs, welches wir nun mounten und dann modifizieren.

# first make a copy of it
cp "WAP-0007(R4.00b5)_2006-01-13.BIN-0x100000" root.gz
# now unzip the root fs
gunzip root.gz
# create a directory to hold the root fs
mkdir rootfs
# become root
su
# mount the root fs
mount -o loop root rootfs
# make sure, we have a telnetd
find rootfs | grep telnetd
# modify startup script to start telnetd
vi rootfs/etc/rc.d/rc.bridge
# insert this after "#!/bin/ash" to start telnetd:
# ->   /sbin/telnetd &
# save file, quit
# unmount the root fs
umount rootfs
# back to normal user
exit
rmdir rootfs
# zip rootfs
gzip -9 root

Nun haben wir ein rootfs, welches beim Hochfahren der Box den telnetd startet. Jetzt erzeugen wir daraus eine Firmwaredatei:

# replace DDC_RUS001 by your product ID
./makeamitbin -1 DDC_RUS001 -o root.bin ramdisk root.gz

Jetzt machen wir ein Firmwareupgrade per Webinterface der Box. Die Firmwaredatei ist “root.bin”. Nach dem Flashen startet die Box neu, und wir können uns per telnet einloggen. Als User geben wir root an, das Passwort ist das Adminpasswort der Box (default: admin).

Update: habe gerade gesehen, dass in der Firmware von Pearl kein telnetd enthalten ist…. :-( Da müßt ihr euch dann halt einen selber bauen oder mal bei Christian Welzel nachschauen.

Originale Firmware sichern

Für spätere Experimente mit anderer Firmware ist es immer gut ein Backup der originalen Firmware zu haben. Nachdem wir nun telnet Zugang zu unserer Box haben, können wir den Flashinhalt relativ einfach sichern. Dazu melden wir uns per telnet auf der Box als root an. Wenn wir die Box vorher schon mit der Original Firmware konfiguriert haben, können wir z.B. jetzt auch die WLAN Konfiguration sichern (die kann nämlich sehr zeitraubend sein -> /var/RT2500STA.dat und /var/RT2500AP.dat). Falls keine Festplatte eingebaut ist, müssen wir erst mal ein bisschen Platz auf der Ramdisk schaffen. Gute Kandidaten zum Löschen sind smbd, nmbd und e2fsck. Dazu einfach mal ‘ps’ aufrufen. Dann sehen wir die PIDs dieser beiden Samba Prozesse und können die beiden per ‘kill pid’ beenden. Danach die 3 Binaries löschen:

rm /sbin/smbd
rm /sbin/nmbd
rm /sbin/e2fsck

Jetzt sollte genug Platz auf der Ramdisk sein, um das Flashimage zwischenzulagern. Über das mtd0 Device haben wir Zugriff auf den Inhalt des Flash Speichers:

cat /dev/mtd0 > /share/mgb100.img

Jetzt müßte unser 4MB großes Flash-Abbild in /share liegen. Nun loggen wir uns aus und holen die Datei per ftp auf unseren PC (User anonymous, default ist kein Passwort).

Sollte nicht genug Platz auf der Ramdisk vorhanden sein, so können wir das Image natürlich auch auf einem eingesteckten USB-Memory Stick zwischenlagern. Auch das Einrichten einer zusätzlichen Ramdisk hilft (siehe auch: Christian’s Anleitung.

Bootloader

Um den Linux Kernel aus dem Flash nach dem Einschalten der Box zu laden und zu starten, brauchen wir einen Bootloader. Die originale Firmware verwendet dazu das “RDC BIOS”. Dieser Bootloader ist zum Experimentieren mit Kernel und rootfs nicht besonders geeignet, da er keine Möglichkeit bietet, neue Images zu flashen. Der kleinste Fehler verwandelt die Box bereits in einen Türstopper. Naja, nicht ganz. Es gibt immer noch die Möglichkeit, die Box per JTAG neu zu programmieren.

Redboot ist ein Bootloader, der einiges mehr kann und sich damit zum Experimentieren mit der Box besser eignet. Mit Redboot kann man zur Not auch neue Images ins Flash schreiben, oder übers Netzwerk booten (TFTP, HTTP). Ausserdem ist Redboot im Source Code verfügbar, so dass man leicht neue Features implementieren kann. So lassen sich z.B. im Source die Adressen anpassen, wo Redboot den Kernel und die Ramdisk erwartet. Ferner läßt sich natürlich die Command Line anpassen, die dem Linux Kernel mit übergeben wird. Das RDC BIOS hingegen erwartet den Kernel im Flash immer an Offset 000010h und eine Ramdisk (initrd) an Offset 100010h. Die Maximalgröße für den Kernel ist 1.048.560 Bytes und für die Ramdisk 2.621.424 Bytes. Die Command Line für den Kernel kann man auch nicht verändern.

Da Redboot allerdings größer als das RDC-BIOS ist, sollte man sich im Klaren darüber sein, dass der Recovery Loader durch das Flashen von Redboot überschrieben wird. Das ist allerdings kein Nachteil, da ja Redboot viel mehr Möglichkeiten bietet.

Am Ende des Howto zum Bauen des Redboot steht, wie man sich ein upgrade.bin File bastelt. Damit kann man, per Webinterface der originalen Firmware, Redboot auf den MGB100 flashen. Um erste Schritte mit Redboot auf dem MGB100 zu machen, soll dieses Howto dienen.

Achtung: Die Original Firmware funktioniert zusammen mit Redboot. Aber man muß beachten was passiert, wenn man nun versucht ein weiteres Upgrade mit einer Original Firmware zu machen. Wenn die Firmware zumindest RDC-BIOS, Linux und das rootfs enthält, dann sollte es funktionieren. Ist aber z.B. wie bei der Firmware von Pearl kein RDC-BIOS, aber der Recovery-Loader enthalten, dann wird der MGB100 danach nicht mehr booten. Das passiert, weil der Recovery- Loader über den ersten Teil des Redboot geflasht wird, aber der zweite Teil des Redboot aufgrund des fehlenden RDC-BIOS weiterhin im Flash bleibt. Das führt natürlich zu einem zerstörten Redboot. Danach ist der MGB100 nur noch per JTAG wiederzubeleben. Am besten man zerlegt eine zu flashende Original Firmware zuerst mit splitamitbin und baut sich dann mit makeamitbin eine Upgrade.bin zusammen, die genau die Teile enthält, die auch benötigt werden.

Linux Kernel

Der in der Firmware enthaltene Linux Kernel ist an einigen Stellen (übel) gepatcht. Allerdings lässt sich mit diesem Kernel z.B. die RTC nur durch die AMIT Binaries stellen. Auch die LEDs und die 2 Tasten sind nur durch Closed Source Programme zu bedienen. Die Konfiguration liegt in einem 64k Segment auf dem Flash in einem unbekannten Format, dass nur durch die AMIT Programme gelesen/geschrieben werden kann. Das Ganze ist also nicht besonders zufriedenstellend.

Mit dem Ziel eine Firmware für dieses Gerät zu schaffen, die nur aus offenem Code besteht, habe ich mal einen Patch für den neusten 2.4er Linux Kernel (2.4.35.3) zusammengestellt. Damit ist es dann möglich, die RTC per hwclock abzufragen und zu stellen (falls /dev/rtc verwendet wird). Außerdem sind Treiber für Ethernet (WLAN und Kabel) und IDE Controller enthalten. Weiterhin kann man nun einfach per Shell Skript die LEDs setzen, bzw. die Tasten abfragen. Ein Beispiel zeigt am besten wie:

while [ 1 ]; do
  KEY=`cat /proc/driver/mgb100/key`
  if [ "$KEY" = "KEY_SHUTDOWN" ]; then
    /sbin/poweroff
    break
  fi
  if [ "$KEY" = "KEY_RESET" ]; then
    /sbin/reboot
    break
  fi
done

# switch on LEDs
echo "LED_USB1:ON" > /proc/driver/mgb100/led
echo "LED_USB2:ON" > /proc/driver/mgb100/led
echo "LED_BACKUP:ON" > /proc/driver/mgb100/led
echo "LED_HDFILL:ON" > /proc/driver/mgb100/led

# switch off LED
echo "LED_USB1:OFF" > /proc/driver/mgb100/led

Wenn ich noch Lust und Zeit habe, werde ich den Treiber noch verbessern, so dass man die LEDs auch mit unterschiedlichen Puls/Pausen Verhältnissen blinken lassen kann.

Außerdem beinhaltet der Patch noch kleinere Anpassungen, so dass z.B. die CPU bei einem Reboot resettet wird, usw. Ich habe das Flash auch partitioniert. Der entsprechende maps driver ist im Patch enthalten.

Hier ist das Projekt auch zuhause: OpenMGB

Download

Sources

Der Rest…