Ubuntu auf's SheevaPlug

Fri, 08 Jan 2010

Hä, aber da ist doch schon ein Ubuntu drauf, oder?

Ja, das stimmt so.

Allerdings ist das vorinstallierte Ubuntu der schlechteste Ausgangspunkt, den man sich wohl denken könnte:

  • alter, unvollständiger U-Boot Loader
  • alter, langsamer Kernel
  • misskonfiguriertes Ubuntu
  • sehr langsames Filesystem JFFS2

Das Gute ist: Es gibt ein Tool, da macht man quasi zwei Klicks, und schon sind alle genannten Punkte in einem Rutsch erledigt.

Im Schnelldurchlauf

1. SheevaPlug Installer herunterladen.
2. Entpacken und Terminal und ./README.txt öffnen, kurz lesen.
3. "openocd" benötigt (in Ubuntu Quellen). Arch Linux hat es im AUR (openocd-git-libftdi)
4. USB Stick (/mnt/disk) fat32 formatieren (mkfs.msdos)
   und die Dateien unterhalb von "Installer" nach /mnt/disk/ kopieren
5. "sudo php ./runme.php nand" und warten (php/php5-cli package wird gefordert)
6. Warten und nach ~5-10 Minuten via "ssh root@192.168.0.123" - pass: nosoup4u

HowTo

Vorbereitungen

Benötigt wird:

  • SheevaPlug Installer (extern)
  • Ubuntu/Debian Linux oder was vergleichbares
    • nativ / virtuell via VirtualBox : Ubuntu 9.10 VDI (user: ubuntu pass: reverse)
      Wichtig: VirtualBox mit USB Unterstützung (also nicht PUEL)
  • USB Stick > 200 MB
    Achtung: Muss formatiert werden!
  • SheevaPlug (jetzt wirklich) und das Kabel für die serielle Schnittstelle

Durchführung

Der Einfachheit halber beschreibe ich ausschließlich den Weg für Ubuntu (9.*) in VirtualBox, sodass auch Mac- und Windows-User diese Anleitung verfolgen können.

Ich selber habe es mit Arch Linux ebenfalls hinbekommen; mit Debian sollte die Installation auch funktionieren. Man müsste das halt nur adaptieren und für seine Distribution leicht anpassen.

  1. startet Linux und stöpselt das SheevaPlug schon mal auf 'ne Steckdose und verbindet es mit dem seriellem Kabel.

  2. sudo apt-get install minicom libftdi libftdi-dev openocd php5-cli

  3. USB-Stick anstöpseln und via Geräte -> USB-Geräte -> $Modell zum Gast durchleiten.
    Formatieren des Sticks mit fat32:

    $ sudo umount /media/usbstick # falls gemountet
    $ sudo mkfs.msdos /dev/sdb1 # je nach eigenen Geräten
    $ sudo mount /dev/sdb1 /mnt
    

  4. Entpackt sheevaplug-installer-v1.0.tar.gz und geht in das Verzeichnis sheevaplug-installer-v1.0.

  5. $ ubuntu@ubuntu-desktop:~/Downloads$ cd sheevaplug-installer-v1.0/
    $ sudo cp ./installer/* /mnt/
    $ umount /mnt/
    

  6. Nehmt den USB-Stick und steckt ihn ans SheevaPlug.

  7. Nun geht's ans Flashen via JTAG. Es unnötig zu sagen, dass alle Daten auf dem Sheeva werden gelöscht...

     $ sudo ./runme.php nand 

    [bei wem die runme.php streikt, der kann eine syntaktisch Korrekte hier beziehen]

    Dauert etwas und resultiert in:

    ****   exec(modprobe ftdi_sio vendor=0x9e88 product=0x9e8f)
    ****   Preparing environment variables file ...
    reading uboot/uboot-env/uboot-dflt.txt
    uboot/uboot-env/fw_setenv baudrate 115200
    CRC read error on uboot-env.bin: Success
    [...]
    ****   Burning uboot and environment variables ... This will take few minutes ...
    Open On-Chip Debugger 0.2.0 (2009-07-26-14:56) Release
    $URL: http://svn.berlios.de/svnroot/repos/openocd/tags/openocd-0.2.0/src/openocd.c $
    For bug reports, read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS
    2000 kHz
    jtag_nsrst_delay: 200
    jtag_ntrst_delay: 200
    dcc downloads are enabled
    [...]
    ****        U-boot should be up and running now. Open your console ...
    

  8. Der Prozess dauert einige Minuten, nach Erhalt der letzten Zeile kann dann via minicom der Bootprozess und das Einrichten von Ubuntu verfolgt werden.
    (wenn minicom den Bootprozess unterbricht, einfach in u-boot reset eintippen, dann geht es nochmal los.)

Zugriff via SSH

Nachdem man fertig ist, kann man ein frisches Ubuntu 9.04 auf einem UBIFS mit neuem Kernel und U-Boot betrachten.
Ein LAN-Kabel eingesteckt, einem DHCP Router und man kann sich via ssh in das System einloggen:

 $ ssh root@192.168.0.123 # passwort: nosoup4u 

SheevaPlug Installer

Der SheevaPlug Installer ist ein sehr nettes Tool. Damit lässt sich zum Beispiel ein tot geflashtes SheevaPlug wiederbeleben.
Totflashen geht, indem man den Bootloader falsch flasht, sodass das Plug nicht einmal mehr die Hardware initialisieren kann. (Erkennbar an der nicht leuchtetenden blauen Lampe)

Dieser Schritt sollte der allererste sein, den man nach Erhalt eines neuen Sheevas tut.

Hinterher haben wir:

  • Das U-Boot 3.4.19 (kann von SD booten)
  • Linux ubuntu 2.6.30.2 #11 PREEMPT Wed Jul 22 19:53:31 MDT 2009 armv5tel GNU/Linux
  • verdammt schnelles Dateisystem UBIFS mit lzo on-the-fly Komprimierung
  • Ubuntu mit korrekt konfigurierter DNS-Auflösung und apt-get

Weiterhin ist es mit diesem Werkzeug möglich, eigene Distributionen einzubinden. Im installer/-Verzeichnis kann der rootfs.tar.gz Tarball mit einem eigenen Distro-Baum ausgetauscht werden.

Auf diesem Weg habe ich selber ein Debian zum Laufen bekommen. Wer das allerdings selber probieren möchte, sollte den vorgefertigten Tarball nutzen. Die aktuelle Build (Anfang Januar) via bootstrap funktionierte bei mir nämlich nicht.

Der Installer bietet auch die Möglichkeit, das Betriebssystem auch auf die SD Flashkarte zu spielen. Denn diese wird mit dem Kernel Update wieder richtig schnell:

Benchmark SDHC Karte Class 4 mit Kernel 2.6.30.2

100 bis 1 GB MB:

== Schreiben via dd bs=1024 count=[100K, 200K, 1M] if=/dev/zero of=/mnt/test.img ==
104857600 bytes (105 MB) copied, 6.31505 s, 16.6 MB/s
209715200 bytes (210 MB) copied, 30.8354 s, 6.8 MB/s
1073741824 bytes (1.1 GB) copied, 221.97 s, 4.8 MB/s

== Lesen via dd if=/mnt/test.img of=/dev/null  ==
104857600 bytes (105 MB) copied, 5.46798 s, 19.2 MB/s
209715200 bytes (210 MB) copied, 10.8675 s, 19.3 MB/s
1073741824 bytes (1.1 GB) copied, 64.4165 s, 16.7 MB/s

/tmp und /var und swap

Da das NAND Flashspeicher ist und dieser bekanntlich eine begrenzte Schreibvorgangsanzahl haben, ist es ratsam, swap, /tmp und /var (sehr häufige Schreib/Lesezyklen) auf eine USB-Festplatte oder auf eine externe (billige) SD Karte umzubiegen oder in den RAM zu speichern.

Das NAND selber kann nämlich nur zwischen 1.000 und 10.000 Schreibzyklen bestehen. Dazu editiert man sich einfach seine /etc/fstab zurecht. Meine sieht z.B. so aus:

USB Festplatte

mone                   /dev/pts      devpts    defaults            0      0
none                   /dev/shm      tmpfs     defaults            0      0
ubi0:rootfs            /             ubifs     defaults,noatime    0      0
/dev/sda1               /var            jfs       defaults,mode=0755 0 0
/dev/sda6               /home           jfs       defaults,noatime
/dev/sda5               swap    swap    defaults 0 0
/tmp                   /var/tmp      bind      defaults,bind       0      0

RAM (ohne SD/HDD)

nach Arch Mobile Wiki

none                   /dev/pts      devpts    defaults            0      0
none                   /dev/shm      tmpfs     defaults            0      0
ubi0:rootfs            /             ubifs     defaults,noatime    0      0
tmpfs                  /var/lock     tmpfs     defaults,size=50m,mode=0755 0 0
tmpfs                  /var/log      tmpfs     defaults,size=50m,mode=0755 0 0
tmpfs                  /var/run      tmpfs     defaults,size=50m,mode=0755 0 0
tmpfs                  /tmp          tmpfs     defaults,size=100m,mode=1777 0 0
/tmp                   /var/tmp      bind      defaults,bind       0      0


Viel Spaß mit eurem neuen System!

---

Vorbereitungen, kleinere Tests und Infos zum SheevaPlug

Sat, 26 Dec 2009

Gestern habe ich ja schon den ersten Einblick geschildert.

Heute hab ich noch kurz weitergemacht, teils mit erfreuten Ergebnissen, teilweise etwas schlechten.

Ubuntus ARM Repository: ports.ubuntu.com

Nirgends habe ich eine vollständige Liste der möglichen Pakete gefunden. Nirgends.

Daher habe ich einmal apt-get update samt apt-cache pkgnames gemacht und nun eine vollständige Liste aller Pakete, die am 25.12.2009 bereits im Repository waren:

10:32:56::# apt-cache pkgnames
http://posativ.org/blog/files/linux/sheevaplug/all-packages.txt

10:35:03::# apt-cache stats
Total package names: 32956 (1318k)
    Normal packages: 25053
    Pure virtual packages: 250
    Single virtual packages: 2200
    Mixed virtual packages: 240
    Missing: 5213

10:35:25::# cat /etc/apt/sources.list
deb http://ports.ubuntu.com jaunty main restricted universe multiverse

Erste Benchmarks vom NAND und einer SDHC Karte

512 MB NAND

  • default Filesystem: JFFS2
  • zlib Kompression
  • 100 MB Testdatei

10:50:40::# dd if=/dev/zero of=/root/test.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 9.37936 s, 11.2 MB/s

10:50:59::# dd if=/root/test.img of=/dev/null
204800+0 records in
204800+0 records out
104857600 bytes (105 MB) copied, 0.826774 s, 127 MB/s

Dabei findet eine on-the-fly Kompression und Dekompression statt, die sogar recht effektiv ist: 151 MB physikalisch belegt (Ubuntu), mittels du -sh komme ich allerdings auf 427MB.

Auf 500 MB NAND bei zlib Kompression kann also ca. 1400 MB theoretisch gespeichert werden.

Neben JFFS2 gibt es allerdings noch ein etwas schnelleres Dateisystem: UBIFS. Das hat neben zlib die deutlich performantere Kompression lzo, die dafür allerdings etwas mehr Platz benötigt.


4 Gb SDHC

  • default Filesystem: VFAT
  • 1 GB Testdatei

21:09:23::# dd bs=1024 count=1M if=/dev/zero of=/mnt/file
1073741824 bytes (1.1 GB) copied, 1455.34 s, 738 kB/s

22:05:19::# dd if=/mnt/file of=/dev/null
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 158.693 s, 6.8 MB/s

Also ich habe ja mit ein paar Einbußen gerechnet, aber nicht mit 700 kB/s. Gekauft hab ich eine Class 4 SDHC von Panasonic, mit 20 MB/s Lesen und 9 MB/s Schreiben.

Weil ich kein SD-Kartenlesegerät für USB habe, konnte ich maximal noch vom Sony PRS-505 die Schreib- und Lesegeschwindigkeit testen. Da kam ich beim Schreiben immerhin auf gut 6 MB/s, beim Lesen allerdings auf utopische 200 MB/s.

Dennoch gibt es wohl sehr heftige Probleme beim mitgeliefertem Kernel und SD Karten (anderer Vergleich).

Welches OS denn nun für das SheevaPlug?

Es gibt mehrere Linuxdistributionen, die entweder einen Port für ARM oder generell für Embedded Systems konzipiert sind:

Um nur die aufzuzählen, die mir bisher begegnet sind. Es gibt sicherlich noch mehr.

Da allein schon der Linux Kernel knapp 50 Minuten zum Kompilieren auf dem Plug braucht, fällt Gentoo für mich schon einmal weg. Fedora und Ubuntu sind beides Ports von so schon sehr schwergewichtigen Distributionen. Daher will ich die auch nicht wirklich haben.

Da ich Arch Linux auf dem Desktop verwende und es recht klein ist, liegt es für mich nahe, dieses zu verwenden. Allerdings schaut das Repository noch etwas klein aus und das archmobile.org Projekt ist mehr auf Mobiles fokussiert. Ich werde allerdings Arch Linux on NAND testen!

Alle anderen bis auf Debian sind mir unbekannt. Debian ist sehr populär, daher stelle ich mir auch das Repository recht umfrangreich vor. Aber auch da gibt es natürlich keine Liste mit allen verfügbaren Paketen...

Wie geht's weiter?

U-Boot muss aktualisiert werden für SDHC Boot, dazu der aktuelle Kernel kompiliert werden. UBIFS statt JFFS2 nutzen und dann kommt Arch Linux aufs NAND und Debian auf die SDHC Karte

Wenn das dann geschafft ist, sehe ich weiter.

---

Mein erster Eindruck vom SheevaPlug

Fri, 25 Dec 2009

Tja, wie beginnt man diesen Blogpost nicht prahlend?
Ich habe vom Weihnachtsmann etwas aus England erhalten: Marvells SheevaPlug

Wenn jetzt jemand denkt "Hää, wasn das?":

Ein SheevaPlug ist ein headless Server für den Betrieb zu Hause. Bei maximal 11 Watt mit angeschlossener USB-Festplatte, samt Ethernet und Flash Karte unter Volllast. Soviel brauchen manche High-End Rechner, wenn sie angeblich "aus" sind.

Nutzen kann man das z.B. für: Wuala, IRC-Bouncer, Fileserver, Torrent und Webserver.

SheevaPlug Dev Kit

SheevaPlug; CC-Bild

Um jetzt nicht wiederzukauen, was andere Blogs bereits gepostet haben, nur eine kurze Übersicht:

  • ARM Prozessor mit 1,2 Ghz
  • 512 Mb RAM
  • 512 Mb NAND (interner Flash Speicher)
  • 1x USB 2.0 (480 Mb/s) Port, 1x Gigabit Netzwerk, SDHC Input

Interessanterweise klackert mein SheevaPlug, wenn ich es leicht schüttel. Allerdings müssten das nur ein paar lose Kabel sein, der Innenarchitektur zu urteilen.

Im Paket befinden sich ein ca. 3m LAN-Kabel, Mini-USB->USB Kabel (50 cm) (für serielles Terminal) und zwei verschiedene Baustücke für die Stromversorgung. Mein Sheevaplug ist einfach auf eine Steckdosenleiste gesteckt.

Leider schaut eine eingesteckte SD-Karte etwas sehr hervor.

Erster Anlauf

Das SheevaPlug hat kein Power-Schalter oder ähnliches. Wenn es auf eine aktive Stromleiste gesteckt wird, fährt es automatisch hoch.

Das SheevaPlug lässt sich im Übrigen auch nicht ausschalten; zwar kann man Ubuntu zum sudo halt zwingen, aber das Sheeva läuft munter weiter. (Also es leuchtet...)


Also in die Steckdose gesteckt, samt seriellem Kabel und LAN und schon geht's los. Da ein Ubuntu (9.04) im NAND vorinstalliert ist, bezieht es sich über DHCP automatisch eine IP. Daher kann man sich einfach per SSH einloggen:

21:09:47::$ ssh root@192.168.0.200
root@192.168.0.200's password: nosoup4u
Linux debian 2.6.22.18 #1 Thu Mar 19 14:46:22 IST 2009 armv5tejl
[...]
To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
Last login: Tue Mar 28 19:07:19 2000
[root@debian]/root
19:07:34::#


Alternativ kann man sich auch via serieller Schnittstelle einloggen und somit auch die Bootsequenz verfolgen.

Als Programm empfehle ich an dieser Stelle minicom, das zuerst via minicom -s auf den USB Anschluss: /dev/ttyUSB0 konfiguriert werden muss.
Zwar wird den Entwicklern des "Das U-Boot" Bootloaders gerade minicom nicht empfohlen. Allerdings finde ich persönlich die vorgestellten Programme cu (Teil des uucp Pakets) und kermit nicht gerade zeitgemäß.

Der U-Boot Bootloader, der eigentlich einen extra Blogbeitrag wert wäre, bootet ziemlich zügig vom Sheeva.
Aussehen tut der Anfang so:

         __  __                      _ _
        |  \/  | __ _ _ ____   _____| | |
        | |\/| |/ _` | '__\ \ / / _ \ | |
        | |  | | (_| | |   \ V /  __/ | |
        |_|  |_|\__,_|_|    \_/ \___|_|_|
 _   _     ____              _
| | | |   | __ )  ___   ___ | |_
| | | |___|  _ \ / _ \ / _ \| __|
| |_| |___| |_) | (_) | (_) | |_
 \___/    |____/ \___/ \___/ \__|
** MARVELL BOARD: SHEEVA PLUG LE

U-Boot 1.1.4 (Mar 19 2009 - 16:06:59) Marvell version: 3.4.16

U-Boot code: 00600000 -> 0067FFF0  BSS: -> 006CEE80

Soc: 88F6281 A0 (DDR2)
CPU running @ 1200Mhz L2 running @ 400Mhz
SysClock = 400Mhz , TClock = 200Mhz

DRAM CAS Latency = 5 tRP = 5 tRAS = 18 tRCD=6
DRAM CS[0] base 0x00000000   size 256MB
DRAM CS[1] base 0x10000000   size 256MB
DRAM Total size 512MB  16bit width
Flash:  0 kB
Addresses 8M - 0M are saved for the U-Boot usage.
Mem malloc Initialization (8M - 7M): Done
NAND:512 MB

CPU : Marvell Feroceon (Rev 1)

Streaming disabled
Write allocate disabled

USB 0: host mode
PEX 0: interface detected no Link.
Net:   egiga0 [PRIME], egiga1
Hit any key to stop autoboot:  0

Erster Blick auf die Software

Ohne etwas angerührt zu haben, sieht die vorgefertigte Speicherbelegung wie folgt aus:

19:38:20::# df -h
Filesystem            Size  Used Avail Use% Mounted on
rootfs                507M  148M  360M  30% /
tmpfs                 252M     0  252M   0% /lib/init/rw
varrun                252M   40K  252M   1% /var/run
varlock               252M     0  252M   0% /var/lock
udev                  252M  8.0K  252M   1% /dev
tmpfs                 252M     0  252M   0% /dev/shm
tmpfs                 252M     0  252M   0% /var/cache/apt

Vorinstalliert ist, wie schon erwähnt, Ubuntu 9.04 (Jaunty Jackalope). Leider ist es etwas unglücklich installiert:

apt-get:
Wer einmal apt-get in irgendeiner Weise nutzen wollte, erfährt ersteinmal:
19:43:15::#  apt-get update
E: Archive directory /var/cache/apt/archives/partial is missing.
Da das Problem auf zwei Wege gefixt werden kann und es je nach Nutzung des SheevaPlugs ankommt, empfehle ich hier einfach http://computingplugs.com/index.php/Fixing_apt-get.
Schuld ist /var, da es hier ein Dateisystem im RAM ist und somit nicht persistent.
DNS Auflösung:

Per default kann zwar 74.125.43.106 angepingt werden, allerdings nicht die dazugehörende Domain google.com.

Nach einem Neustart ist das behoben, wenn in /etc/dhcp3/dhclient.conf eine Route (#) vor

 supersede domain-name-servers 127.0.0.1; 
gesetzt wird.

Eine vollständige Auflistung aller installierten Pakete gibt es hier.


Der Linux Kernel ist leider eine etwas ältere Version. Allerdings lässt sich dieser updaten, wenn nötig.

20:13:42::# uname -a
Linux debian 2.6.22.18 #1 Thu Mar 19 14:46:22 IST 2009 armv5tejl GNU/Linux

Da es beim mitgelieferten Kernel recht heftige Performance Einbußen beim Lesen und Schreiben einer eingesteckten SD-Karte gibt, sollte man ihn zumindest patchen oder gleich den aktuellsten nehmen.

Das würde ich allerdings in einem separaten Blogposting detailliert beschreiben.

Bilder

sind nicht von mir; ich hatte ehrlich gesagt keine Lust, eigene zu machen.
via Flicker: #1 #2 #3 #4

bilderreihe

---