Sonntag, 28. August 2011

Sheevaplug: Debian im internen Flash installieren

Hoi zäme

Hier habe ich eine kleine Anleitung zusammengestellt, wie man Debian Squeeze mit Debian-Kernel auf den Sheevaplug in den internen Flash installieren kann. Der Vorteil vom Debian-Kernel: Sicherheits-Updates kommen automatisch über den Paket-Manager und müssen nicht von Hand gemacht werden.

Ich habe dabei hauptsächlich zwei Anleitungen zusammengetragen:

Anleitung Martin Michlmayr
Anleitung Plugcomputer.org-Wiki

Herzlichen Dank an Martin Michlmayr, Matthias Blaicher und die Jungs vom Plugcomputer-Wiki.

Die Anleitung geht von folgendender Umgebung aus:

- Sheevaplug per USB an einen PC angeschlossen
- Terminal-Verbindung auf den Sheeva (z.B. mit PuTTY)
- TFTP-Server zum Flashen (geht auch mit einem USB-Stick)
- eine SD-Speicherkarte zur Installation (darauf wird das System installiert und anschliessen auf den internen Flash gespielt)

Auf geht's...

1. U-Boot aktualisieren

a) Das U-Boot-Binary von hier auf den TFTP-Server legen.
b) Auf dem Sheeva (per Terminal):
$ setenv serverip 172.25.1.1 # TFTP server-IP
$ setenv ipaddr 172.25.1.200
$ tftpboot 0x0800000 u-boot.kwb
$ nand erase 0x0 0x80000
$ nand write 0x0800000 0x0 0x80000
$ reset # der Sheeva startet neu, Konsole bleibt aber bestehen
$ setenv ethaddr 00:11:22:AA:BB:CC # MAC-Adresse eingeben (steht auf der Unterseite vom Sheeva)
$ saveenv
$ reset
/Edit 06.01.2018: U-Boot wird grösser.  Beim Befehl "nand erase" und "nand write" unbedingt bis 0x80000 löschen/beschreiben. Sonst *bricked*...


2. Kernel installieren

a) Kernel Images (uImage und uInitrd) für den Sheeva von hier herunterladen und auf den TFTP-Server legen
b) Auf dem Sheeva (per Terminal):
$ setenv serverip 172.25.1.1 # TFTP server-IP
$ setenv ipaddr 172.25.1.200
$ tftpboot 0x2000000 uImage
$ iminfo
$ nand erase 0x100000 0x400000
$ nand write 0x2000000 0x100000 0x400000
$ reset
$ setenv mainlineLinux yes
$ setenv arcNumber 2097
$ saveenv
$ reset


3. Debian Installer

a) Auf dem Sheeva (per Terminal):
$ setenv serverip 172.25.1.1 # TFTP server-IP
$ setenv ipaddr 172.25.1.200
$ mmc init # bin nicht sicher, ob's das wirklich braucht
$ tftpboot 0x0400000 uImage
$ tftpboot 0x0800000 uInitrd
$ setenv bootargs console=ttyS0,115200 base-installer/initramfs-tools/driver-policy=most
$ bootm 0x0400000 0x0800000

b) Der Installer startet - Debian wie gewohnt installieren

4. Nach der Installation

a) Am Ende der Installation startet der Sheeva neu. Im U-Boot automatischen Bootvorgang unterbrechen (Taste drücken, wenn er von 3 herunterzählt) und folgendes eingeben:
$ mmc init
$ ext2load mmc 0:1 0x400000 /uImage
$ ext2load mmc 0:1 0x800000 /uInitrd
$ bootm 0x400000 0x800000


b) Das Debian bootet ab SD-Karte, als Root einloggen und folgende Befehle ausführen:
# apt-get update
# apt-get install mtd-utils
# ln -fs /proc/mounts /etc/mtab


5. interner Flash vorbereiten

a)
# ubiformat /dev/mtd2 -s 512
# ubiattach /dev/ubi_ctrl -m 2
# ubimkvol /dev/ubi0 -N rootfs -m
# mount -t ubifs ubi0:rootfs /mnt


6. SD-Karte auf Flash kopieren und anpassen

a)
# mkdir /tmp/rootfs
# mount -o bind / /tmp/rootfs/
# cd /tmp/rootfs
# sync
# cp -ar . /mnt/ #dauert ein Weilchen...

b) Flash fstab anpassen:
# vi /mnt/etc/fstab

Sämtliche Einträge die mit "UID" beginnen auskommentieren (# vor die Zeile setzen). Dann zwei zusätzliche Zeilen einfügen:
/dev/root / ubifs defaults,noatime,rw 0 0
tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0

c) neu starten
# shutdown -r now


7. U-Boot aktualisieren

a) Im U-Boot automatischen Bootvorgang unterbrechen (Taste drücken, wenn er von 3 herunterzählt) und folgendes eingeben:
$ setenv bootargs 'console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs'
$ saveenv
$ reset

b) Der Sheeva sollte nun vom internen Flash booten (je nach SD-Karte deutlicher Geschwindigkeitszuwachs bemerkbar.

8. Kernel-Update Script erstellen

a) Nach einem Kernel-Update (erkennbar daran, dass ein apt-get upgrade/dist-upgrade ein neues "linux-image-..." installiert) wird der Kernel leider (noch) nicht automatisch ans richtige Ort in den Flash-Speicher geschrieben. Wir können uns aber abhelfen, in dem wir ein kleiner Scriptli schreiben und das nach einem Kernel-Update ausführen.
b) Einloggen.
# cd /boot

c) Eine Datei mit folgendem Inhalt erstellen und z.B. kernel_update.sh benennen:
EDIT: "mkimage...." hinzugefügt um uImage zu erstellen
#!/bin/bash
#
#Script zum automatischen Kernel-Update im NAND-Speicher
#
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n Debian_Kernel -d vmlinuz uImage
flash_eraseall /dev/mtd1
nandwrite -p /dev/mtd1 /boot/uImage

d) Datei ausführbar machen
# chmod +x kernel_update.sh

e) Wird nun ein neuer Kernel installiert einfach das Scriptli ausführen:
# ./boot/kernel_update.sh
und schon wird der aktualisierte Kernel in den Flash geschrieben und beim nächsten Bootvorgang verwendet.
f) feddisch...

EDIT 12.11.2013
9. Update auf Wheezy

Da der NAND-Speicher im Sheeva nur 500MB gross ist, hatte ich das Problem, dass ich das Update von Squeeze auf Wheezy nicht per dist-upgrade durchführen konnte. Ich musste den Sheeva quasi mit Wheezy neu installieren. Es funkionierte aber nicht, einfach die Anleitung von oben abzuarbeiten - vermutlich wäre es gegangen aber ich hatte mir irgendwo die Env-Parameter im Uboot überschrieben. Und da ich keinen anderen Sheeva zur Hand hatte, musste ich bisschen üben. Resultat: ich kann jetzt direkt vom NAND (ubifs) booten. Aber schön der Reihe nach:

a) Daten vom Sheeva sicher (falls vorhanden)
b) Debian Installer uImage und uInitrd von hier herunterladen
c) Installer booten und Debian installieren (siehe oben, Punkt 2 - 7 ausführen)
d) Am Ende kontrollieren, ob im Ordner /boot die Dateien uImage und uInitrd (evtl. neben anderen oder als Symlink auf eine andere Datei) existieren -- falls nicht von der SD-Karte explizit kopieren
e) Im U-Boot folgende Umgebungs-Variablen definieren:

#setenv mtdids nand0=orion_nand
#setenv mtdparts mtdparts=orion_nand:0xa0000@0x0(u-boot),0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs)

#setenv bootargs_ubi 'console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs'
#setenv bootcmd_ubi 'ubi part nand0,2; ubifsmount rootfs; ubifsload 0x1100000 /boot/uInitrd; ubifsload 0x800000 /boot/uImage'
#setenv bootcmd 'setenv bootargs $(bootargs_ubi); run bootcmd_ubi; bootm 0x00800000 0x01100000'

#saveenv
Besten Dank für diesen Input an Matthias Blaicher!

Danach braucht man im Prinzip dann auch das Kernel-Update Script aus Punkt 8 nicht mehr, weil der Kernel aus dem Dateisystem und nicht aus dem Speicher gelesen wird. 

/EDIT
Edit 10.05.2015
Debian hat eine Version herausgebracht - 8.0 Jessie. Dass es Euch nicht geht wie mir, habe ich den obigen Link auf "oldstable" aktualisiert. Sobald ich einen Sheeva mit Jessie am Laufen habe, werde ich wieder ein Anleitung posten. 

ACHTUNG: ich habe den aktuellen Jessie-Installer für den Sheeva-Plug nicht zum Laufen gebracht - er hängt mit einer mir seltsam anmutenden Fehlermeldung. Da ich gerade im Ausland bin, nur Remote-Zugriff habe und nicht immer eine Fee damit bemühen möchte, meine Sheevas zu Power-Resetten, werde ich mich dem im Juni genauer annehmen, wenn ich wieder zu Hause bin.
/EDIT  

Edit 30.08.2014
10. Probleme nach Stromausfall

Leider passiert es bei mir trotz USV, dass ich nach Stromausfall mit einem korrupten UBIFS dastehe. Man merkt das ganz einfach daran, dass der Sheeva im U-Boot hängenbleibt mit einem Dutzend UBIFS-Fehlermeldungen, unter anderem:
UBIFS: recovery needed 
Auf den ersten Blick ist da guter Rat teuer, dabei ist die "Reparatur" ganz einfach:
  1. Debian Installer booten (von USB oder TFTP oder... siehe oben)
  2. Installer verlassen und in eine Shell wechseln
  3. UBI-Partition mounten und wieder unmounten:
  4. #mount -t ubifs ubi0:rootfs /tmp
    #umount /tmp
  5.  Anschliessend Sheeva neu starten
Besten Dank für diesen Input an EWTUC im Forum hier

11. Speicher "erweitern"

Die 500MB NAND-Flash werden schnell knapp, wenn man etwas mehr, als das Debian-Grundsystem installieren möchte (z.B. Asterisk....). Um etwas Platz zu schaffen habe ich /usr auf eine SD-Karte ausgelagert. Es muss nicht einmal eine Schnelle sein... So habe ich es gemacht:
  1. Karte im Sheeva eingesteckt und formartiert mit ext2
  2. Karte gemountet nach /mnt
  3. /usr nach /mnt kopiert (#cp -ar /usr/* /mnt/)
  4. /usr geleert (#cd /usr #rm -r *)
  5. /etc/fstab erweitert mit:  /dev/mmcblk0p1  /usr            ext2    defaults        1       1
  6. neu gestartet
ACHTUNG!!! Den Befehl im Punkt 4 UNBEDINGT nur im Ordner /usr ausführen. Sonst sind u.U. alle Daten weg!! Besser zweimal schauen!! 
/EDIT

Bemerkung: Diese Anleitung stellt eine Zusammenfassung der oben genannten ausführlichen Anleitungen dar. Besten Dank an die Autoren dieser Anleitungen. Ich bin mir bewusst, dass die Lösung mit dem Update-Script eine Quick-and-Dirty Lösung ist. Da ich aber die Updates immer von Hand mache, ist diese Lösung für mich so okay.

Herzliche Grüsse

dä Beni