How to brick your DockStar, voiding warranty and installing Ubuntu … (Conclusion)

Update 2010-10-19: Der folgender Artikel ist nur noch von historischer Bedeutung; das aktuelle Vorgehen kommt bei mir ohne Consolenzugriff oder Geräteöffnung aus. Es ist zwar noch nicht verskriptet, aber immerhin habe ich mit jenem Verfahren schon >5 Dockstars zu kleinen Sheevas gemacht …
···

Ich gebe zu, es hat ein bißchen gedauert seit den ersten Schritten, aber ich mache ja auch gerne eigene Erfahrungen …
In diesem Blogbeitrag geht es um die Zusammenfassung, vielleicht um »lessons learned«; wer alles noch einmal nachlesen will, hier die Historie von »How to brick your DockStar, voiding warranty and installing Ubuntu …«: Part I, Part II, Part III, Part IV, Part V und Part VI ;-)
Angefangen hat alles ja mit dem Wunsch, den etwas lahmen NSLU2 als Fileserver abzulösen; ich komme per NFS von dort, mit einem Debian Lenny als OS-Basis (installiert auf /dev/sda1), nur rund 3-4 MByte/sec, technisch möglich wären (Festplattengeschwindigkeit per USB, Gigibit-Netz) 10-12, bei Einsatz von sshfs – sicherlich nur bezüglich der Ressourcenverschwendung optimal, ist bei gut 1,5 MByte/sec Schicht im Schacht (die NSLU2-CPU ist dann bei 100%).
Idealerweise möchte ich nur den NSLU2 ausschalten, die USB-HDD umstecken, den DHCP-Server anpassen und den DockStar wieder einschalten … Insofern sind »andere« Linux-Lösungen nicht wirklich von Interesse, ich brauche was, was von USB direkt in mein Lenny bootet.
Die Vorarbeit von Alexander Holler bzgl. Patches für die etwas unterschiedliche Hardware des DockStar führte zur Entscheidung, einen eigenen Kernel einzusetzen; schließlich möchte ich ggf. auch mjpeg-streamer o. ä. einsetzen, sofern der DockStar wie erwartet dazu noch Luft hat … Als »How To« für das Kernelbauen unter Ubuntu, meinem präferierten Desktop-OS, habe ich mich an den Hinweisen von plugcomputer.org orientiert — analog zum Bauen von Kerneln bzw. Modulen für meine Sheevas.
Ich habe dann mir erst die Finger verknotet beim Versuch, mittels des DockStar-U-Boot von USB zu booten — dies kann der leider nicht. (Steht zwar auch verschiedentlich geschrieben, aber probieren geht über studieren ;)) Letztlich erfolgreich war dann – in abgewandelter Form, siehe unten – der Plugapps-Ansatz für mich. Hier boote ich also den DockStar einmal an (er muß Internet-Verbindung haben), verbinde mich per SSH und führe die Schritte »Download Blparam« und »Installation«, hier nur die Punkte 1 und 2, aus. im Ergebnis habe ich einen DockStar, der bei jedem zweiten Bootvorgang versucht, über einen sekundären, neueren U-Boot – der leider nicht über Möglichkeiten zur dauerhaften Änderung der Paramater verfügt – vom ersten erkannten USB-Speichermedium »/boot/uImage« zu booten.
Da ich hier meinen eigenen Kernel einsetzten will, habe ich den, wie gesagt. selbst gebaut — und auch meine eigenen Fehler dabei gemacht ;) Merke: für Boot von USB sollten nicht nur das Modul für das Root-FS sowie usb-storage fest im Kernel integriert sein (also nicht als Modul gebaut werden), auch die entsprechenden USB-Low-Level-Treiber (hier: EHCI für USB-2.0) müssen mit reingebacken werden. Nachdem ich deses endlich erkannt hatte, stieß ich auf’s nächste Problem: der »PlugApps-U-Boot« startet den Kernel mit »console=ttyS0,115200 root=/dev/sda1 rootdelay=1 rootfstype=ext2« — mein Root-FS ist allerdings ein ext3, der Fehler »EXT2-fs: sda1: couldn’t mount because of unsupported optional features (4).« also nur logisch.
Lösung für dieses Problem: im »make ARCH=arm menuconfig« unter »Boot options« »console=ttyS0,115200 root=/dev/sda1 rootdelay=10« als »Default kernel command string« eintragen und »Always use the default kernel command string« selektieren. Dann ignoriert der Kernel übergebene Parameter — dies erspart mir, auch noch einen eigenen U-Boot bauen zu müssen …
Nachdem ich meinen Kernel also als »uImage« ins /boot-Verzeichnis der externen USB-HDD am NSLU2 und die Module zu diesem Kernel nach /lib/modules kopiert habe, der erste Bootversuch:

Linux.............................................................................................................................................................. done, booting the kernel.
Linux version 2.6.32.2 (wusel@greebo) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-68) ) #11 PREEMPT Thu Jun 17 02:35:21 CEST 2010
CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: Seagate DockStar Board
Ignoring unrecognised tag 0x54410009
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
Kernel command line: console=ttyS0,115200 root=/dev/sda1 rootdelay=10
[...]
Waiting 10sec before mounting root device...
scsi 0:0:0:0: Direct-Access WD 10EAVS External 1.75 PQ: 0 ANSI: 4
sd 0:0:0:0: Attached scsi generic sg0 type 0
sd 0:0:0:0: [sda] 1953525168 512-byte logical blocks: (1.00 TB/931 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1 sda2 sda3
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] Attached SCSI disk
kjournald starting. Commit interval 5 seconds
EXT3 FS on sda1, internal journal
EXT3-fs: mounted filesystem with writeback data mode.
VFS: Mounted root (ext3 filesystem) on device 8:1.
Freeing init memory: 120K
INIT: version 2.86 booting
Starting the hotplug events dispatcher: udevd.
Synthesizing the initial hotplug events...done.
Waiting for /dev to be fully populated...done.
Setting the system clock.
Cannot access the Hardware Clock via any known method.
Use the --debug option to see the details of our search for an access method.
Unable to set System Clock to: Thu Jan 1 00:00:15 UTC 1970 (warning).
Activating swap...Adding 489972k swap on /dev/sda2. Priority:-1 extents:1 across:489972k
done.
Checking root file system...fsck 1.41.3 (12-Oct-2008)
e2fsck 1.41.3 (12-Oct-2008)
/dev/sda1 has filesystem last checked time in the future, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda1: 23102/1831424 files (1.6% non-contiguous), 346622/7323624 blocks
done.
EXT3 FS on sda1, internal journal
FATAL: Module rtc_dev not found.
Setting the system clock.
Cannot access the Hardware Clock via any known method.
Use the --debug option to see the details of our search for an access method.
Unable to set System Clock to: Thu Jan 1 00:00:50 UTC 1970 (warning).
Cleaning up ifupdown....
Loading kernel modules...done.
Checking file systems...fsck 1.41.3 (12-Oct-2008)
e2fsck 1.41.3 (12-Oct-2008)
Superblock last mount time is in the future. Fix? yes
Superblock last write time is in the future. Fix? yes
/dev/sda3 has filesystem last checked time in the future, check forced.
Pass 1: Checking inodes, blocks, and sizes
/dev/sda3: |== \ 4.4% 

Tja, Fazit soweit: »there’s still work to do«; die fehlende RTC (»RealTimeClock«; batteriegepufferte Uhr) beim Seagate FreeAgent DockStar wird sicherlich noch Spaß machen; ein fsck über mehrere TB-Filesysteme bei jedem Start ist mehr so ein no-go. Gut, es ist kein grundlegender Unterschied zum NSLU2, denn auch dort hatte ich nach jedem Neustart ein nicht sauberes FS, sodaß der tapfere NSLU2 sich rd. 1h mit dem fsck vergnügte …
Tendentiell liesse sich da sicherlich über die initrd was reißen, wenngleich es natürlich tricky ist; man müßte das älteste Datum des letzten Schreibzugriffes jedes gefundenen Dateisystems nehmen, und dies +1 Sekunde als Initialwert für die Uhr nhemen … Naja, jetzt muß der fsck erst einmal fertig werden und dann steht der erste Speedtest an, ob sich der Aufwand NSLU2 -> DockStar überhaupt lohnt ;)
Aber, so als Erfolgsmeldung: Ubuntu oder Debian auf dem DockStar ist nur ein marginales Problem. Kurzfassung der Schritte:

  1. Plugapps-Tools für zweiten U-Boot auf dem DockStar nehmen; »Download Blparam« und »Installation« (hier: Punkte 1 und 2) ausführen.
    Danach hat man einen DockStar, der bei jedem zweiten(!) Boot versucht, von »/dev/sda1« (USB) »/boot/uImage« als Kernel zu laden — was dieser Kernel dann macht, ist dessen Sache; er sollte allerdings auf den SheevaPlug DockStar zugeschnitten sein. Um dauerhaft nur per USB zu booten, muß man im »DockStar-Modus« per »blparam« die Parameter dauerhaft ändern. Dies sollte man aber nur dann tun, wenn man willens und fähig ist, einen gebrickten DockStar nach Gehäuseöffnung per TTL-RS232 zu reaktivieren …
  2. DockStar-Kernel-Patches von Alexander Holler in eigenen Kernel einpflegen, feste Kernel-Kommandozeile setzen und diese als Präferenz markieren; »uImage« backen, nach »/boot/« auf dem Zielgerät (USB-Stick oder USB-HDD, »/dev/sda1« aus Sicht des DockStars), die dazugehörigen Module nicht vergessen.

Als OS-Basis bietet sich u. a. das SheevaPlug-FS (Ubuntu) von plugcomputer.org an, oder auch ein Debian natürlich – Voraussetzung ist, daß die Binaries zur Hardware passen ;)