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

(Bitte erst bis zum Ende lesen, bevor irgend etwas aus diesem Artikel ausprobiert wird!)
Basierend auf Alexander Hollers Anleitung, aus einem Seagate DockStar eine kleine Version des SheevaPlugs zu machen, dokumentiere ich hier meine Schritte, um meinen DockStar meinen beiden SheevaPlugs (sowie dem NSLU2) möglichst ähnlich zu machen, d. h. Ubuntu-/Debian-basiertes full-blown System, welches hier dann von einem USB-Stick startet (meine Sheevas starten vom NAND-Flash mit UBIFS, /var & Co. liegen ggf. auf einer externen USB-Platte; der NSLU2 startet von einer 1-TB Platte), …
Da Alexander Gentoo präferiert, ich aber keinen neuen Bastelschauplatz aufmachen möchte, habe ich aus dem SheevaPlug Installer das rootfs.tar.gz auf eine ext3-Partition (/dev/sdX2; die erste Partition muß wg. U-Boot VFAT oder ext2 sein (enthält nachher das Kernelimage), was man beides für / nicht möchte) eines 1-GB-USB-Sticks kopiert:

root@greebo:~# fdisk /dev/sdc
root@greebo:~# mke2fs -L /boot -m 2 /dev/sdc1
[...]
root@greebo:~# mke2fs -j -L /dockstar -m 2 /dev/sdc2
[...]
root@greebo:~# mkswap /dev/sdc3
[...]
root@greebo:~# mkdir /mnt2
root@greebo:~# mount /dev/sdc2 /mnt2
root@greebo:~# mkdir /mnt2/boot
root@greebo:~# mount /dev/sdc1 /mnt2/boot
root@greebo:~# cd /mnt2
root@greebo:~# tar --same-owner --numeric-owner -p -zxvf /home/wusel/SheevaPlug/sheevaplug-installer-v1.0/installer/rootfs.tar.gz
[...]
var/local/
root@greebo:/mnt2# tar --same-owner --numeric-owner -p -zxvf /home/wusel/SheevaPlug/sheevaplug-installer-v1.0/installer/modules.tar.gz
[...]
./lib/modules/2.6.30.2/source
root@greebo:/mnt2# cp -p /home/wusel/SheevaPlug/sheevaplug-installer-v1.0/installer/uImage boot/
root@greebo:/mnt2# ls -la boot/
total 5832
drwxr-xr-x 2 root root 4096 2010-03-07 18:44 .
drwxr-xr-x 21 root root 4096 2009-07-23 04:01 ..
-rw-r--r-- 1 wusel wusel 2620504 2009-07-23 04:11 uImage
root@greebo:/mnt2# chown -R root:root boot/
root@greebo:/mnt2# ls -la boot/
total 5832
drwxr-xr-x 2 root root 4096 2010-03-07 18:44 .
drwxr-xr-x 21 root root 4096 2009-07-23 04:01 ..
-rw-r--r-- 1 root root 2620504 2009-07-23 04:11 uImage
root@greebo:/mnt2# cd
root@greebo:~# umount /mnt2

Nett gedacht, aber zu kurz gesprungen; im Mailwechsel machte mich Alex’ auf Hardwareunterschiede zw. SheevaPlug & DockStar aufmerksam, sodaß eine simple Übernahme des Kernels leider ausscheidet. Also sind die weiteren Ausführungen Alex’ zu befolgen, als da wären:

  • Installation of the kernel (Linux)
    Wobei ich hier auf den SheevaPlug-Kernel setze; ich habe also meinen Kernel-Source auf dem Desktop geklont (neben linux-2.6.32.2-SheevaPlug habe ich nun auch ein Verzeichnis linux-2.6.32.2-DockStar). Danach wurden Alex’ Patches runtergeladen (in ein neues Unterverzeichnis DockStar-Patches) und per Hand applied: [EDIT: Auch wenn im Folgenden der 0001-Patch nicht gelistet ist, ist jener wichtig für das weitere Vorgehen im Verlauf dieser Artikelserie. Sorry, hatte ich augenscheinlich zu kopieren vergessen.]
    wusel@greebo:~/SheevaPlug/linux-2.6.32.2-DockStar$ patch --backup -p1 <DockStar-Patches/0002-MTD-partitons-used-by-the-Seagate-FreeAgent-DockStar.patch
    patching file arch/arm/mach-kirkwood/sheevaplug-setup.c
    wusel@greebo:~/SheevaPlug/linux-2.6.32.2-DockStar$ patch --backup -p1 <DockStar-Patches/0003-LED-definitions-for-the-Seagate-FreeAgent-DockStar.patch
    patching file arch/arm/mach-kirkwood/sheevaplug-setup.c
    wusel@greebo:~/SheevaPlug/linux-2.6.32.2-DockStar$ patch --backup -p1 <DockStar-Patches/0004-Change-board-name-for-the-SheevaPlug-to-reflect-the-.patch
    patching file arch/arm/mach-kirkwood/Kconfig
    Hunk #1 succeeded at 27 with fuzz 1.
    patching file arch/arm/mach-kirkwood/sheevaplug-setup.c
    wusel@greebo:~/SheevaPlug/linux-2.6.32.2-DockStar$ ls DockStar-Patches
    0001-ARM-Add-option-CMDLINE_FORCE-to-force-usage-of-the-i.patch
    0002-MTD-partitons-used-by-the-Seagate-FreeAgent-DockStar.patch
    0003-LED-definitions-for-the-Seagate-FreeAgent-DockStar.patch
    0004-Change-board-name-for-the-SheevaPlug-to-reflect-the-.patch
    linux-2.6.33_patches_dockstar.tar
  • Installation of the boot loader (Das U-Boot) sowie Patches for the boot loader (Das U-Boot)
    Hier habe ich die Werte wie von Alex beschrieben geändert, auch wenn ich bislang netconsole nicht genutzt habe. Ich habe U-Boot auf einem meiner SheevaPlugs kompiliert (anders als Alex in seinem Beispiel), dabei fiel auf, daß das Skript »./mkDockStar.sh« hier stolpert; gibt es eine Fehlermeldung wie folgt, den Aufruf in der ersten Zeile des Skriptes von /bin/sh auf /bin/bash ändern:
    Image Type: Kirkwood Boot from NAND Flash Image
    Data Size: 185616 Bytes = 181.27 kB = 0.18 MB
    Load Address: 00c00000
    Entry Point: 00c00000
    Building u-boot.bin.pagesize
    [: 19: Illegal number: $[262144-185616]

Da ich keine Lust hatte, die Box aufzumachen und die serielle Schnittstelle zu bemühen, habe ich das »blparam«-Kommando der PogoPlug-/DeskStar-Installation bemüht¹:

 98 PATH=$PATH:/usr/local/cloudengines/bin/
99 blparam
100 blparam "oldbootcmd=nand read.e 0x800000 0x100000 0x300000; setenv bootargs $(console) $(bootargs_root); bootm 0x800000"
101 blparam 'oldbootcmd=nand read.e 0x800000 0x100000 0x300000; setenv bootargs $(console) $(bootargs_root); bootm 0x800000'
102 blparam "bootargs_usb_root=root=/dev/sda2 rw rootdelay=5 rootfstype=ext3"
103 blparam "bootload_kernel=ext2load usb 0:1 0x800000 /uImage"
104 blparam 'bootcmd_usb=usb start'
105 blparam 'newbootcmd=${bootcmd_usb}; ${bootload_kernel}; setenv bootargs ${bootargs_usb_root}; bootm 0x800000'
106 blparam "bootcmd_MLL_yes=setenv mainlineLinux yes; saveenv"
107 blparam "bootcmd_MLL_no=setenv mainlineLinux no; saveenv"
108 blparam "arcNumber=2097"
109 blparam "bootcmd_pogo=run bootcmd_MLL_no; run oldbootcmd"
110 blparam "bootcmd_plugapps=run bootcmd_MLL_yes; run newbootcmd"
111 blparam 'newbootcmd=usb start; ext2load usb 0:1 0x800000 /uImage; setenv bootargs ${bootargs_usb_root}; bootm 0x800000'
112 blparam 'bootcmd=run bootcmd_plugapps'

Leider funktionierte dies nicht, das Schätzchen bootete nicht mehr :( Nun muß also doch der Pegelwandler her und über die serielle Schnittstelle debugged werden …
Wiederbelebung – hoffentlich ;) – in Teil II.
(Redaktioneller Hinweis: Da meine Blogsoftware nicht vorsieht, Artikel zu schreiben und später zu veröffentlichen, trickse ich i. d. R. durch eine Velagerung in die Zukunft um diese Unzulänglichkeit herum; dieser Artikel sollte eigentlich auch die Lösung, also die Reanimierung meines DockStars, enthalten, nur kam ich zeitlich nicht dazu, diesen Teil in der Zeit, die ich den Artikel vorverlegt hatte, auch zu realisieren. Dadurch wurde der Artikel offensichtlich schon von anderen gelesen, und nach der zweiten Bitte auf (Wieder-) Veröffentlichung ist er hier nun also, als Teil I von (geplant) Zweien. Have fun, but: DON’T TRY THIS AT HOME, YOU’LL DEFINITIVELY BRICK YOUR DOCKSTAR AND IT’S UNCERTAIN IF IT’S UNBRICKABLE!)
___

¹ Die Idee stammt letztlich von einem nur noch im Google-Cache vorhandenen pastie.org-NoPaste:
#!/bin/bash
# This script updates the pogoplug uboot enviroment in preparation for running
# plugapps on the pogoplug v1, pogoplug v2 and dockstar.
# This script adds environment variables to make usb booting possible
# This script assumes that it is being run on a pogoplug that has
# firmware at least at rev 2.0.1 with the blparam executable.
# Preparation
mount -o rw,remount /
# Add boot commands
cd /usr/local/cloudengines/bin
./blparam "arcNumber=2097"
./blparam "bootcmd_mtd1_usb=nand read.e 0x800000 0x100000 0x200000; setenv bootargs $(console) $(bootargs_usb_root) $(bootargs_mtdparts); bootm 0x800000"
./blparam "bootcmd_pogo=run bootcmd_MLL_no; run bootcmd_mtd1_mtd2"
./blparam "bootcmd_MLL_yes=setenv mainlineLinux yes; saveenv"
./blparam "bootcmd_MLL_no=setenv mainlineLinux no; saveenv"
./blparam "bootargs_mtd2_root=root=/dev/mtdblock2 ro"
./blparam "bootcmd_mtd3_usb=nand read.e 00x800000 0x02500000 0x200000; setenv bootargs $(console) $(bootargs_usb_root) ; bootm 0x800000"
./blparam "bootcmd_mtd1_mtd2=nand read.e 0x800000 0x100000 0x200000; setenv bootargs $(console) $(bootargs_mtd2_root); bootm 0x800000"
./blparam "bootargs=console=ttyS0,115200 root=/dev/mtdblock2 ro"
./blparam "bootargs_usb_root=root=/dev/sda1 rw rootdelay=10 rootfstype=ext2"
./blparam "bcktopogo=setenv bootcmd run bootcmd_pogo; saveenv"
./blparam "bootcmd_plugapps=run bootcmd_MLL_yes; run bootcmd_mtd3_usb"
./blparam "bootcmd=run bootcmd_pogo"
# Replace rcS
cd /etc/init.d
mv rcS rcS.backup
wget http://plugapps.com/os/pogoplug/full/rcS
chmod 755 rcS
# Write new kernel (2.6.32.7) to the free partition
cd /tmp
wget http://sheeva.with-linux.com/sheeva/2.6.32.7/sheeva-2.6.32.7-uImage
# Now, how do we write it?
# Download and extract Plugbox-1.0.tar.gz to USB drive
touch /tmp/.cemnt/mnt_sda1/plugapps