IB-NAS6210 Linux

Booting your own Linux on an Icybox NAS6210 box
Project started on October 31, 2011.

Diese Anleitung gilt ebenso für den IB-NAS6220. Dieser besitzt 2 HDD Schächte und ein völlig anderes Webinterface. Über dieses ist es möglich, das root Passwort zu ändern (siehe diesen Forenbeitrag), was evtl. eine Neuinstallation einer Linux Distribution erübrigt.

Der Icy Box IB-NAS6210 (Affiliate Link) hat mit seiner hauseigenen Firmware nur einen beschränkten Funktionsumfang. Es ist kein AFP oder DAAP möglich, was als Mac User von großem Nachteil ist. Deshalb muss Linux her, welches auf der verbauten ARM CPU hervorragend läuft. Es ist zwar bereits ein Linux System installiert, leider ist aber der root User nicht zugänglich.

Die Basisplattform des NAS6210 bildet die Kirkwood Plattform, welche auch im SheevaPlug und im OpenRD zum Einsatz kommt. Dies erleichtert die Suche nach einer fertigen Linux Distribution.

Update

Jayare hat mir per E-Mail mitgeteilt, dass er einen Weg gefunden hat, root Zugang zum Installierten Linux System zu bekommen. Dafür folgende Schritte befolgen:

Dies ähnelt den Methoden, die bei Netgear und Seagate Geräten zum root Zugriff führen. Vielen Dank dafür, Jayare!

Hardware Modifikation

Um das Starten einer anderen Linux Distribution über USB oder eSata zu ermöglichen, benötigen wir Zugang zum Bootloader Das U-Boot. Dieser gibt beim Booten Statusmeldungen über den internen Seriellen Port des NAS aus und ermöglicht, den Bootprozess zu unterbrechen. Anschliessend kann ein anderer Kernel und eine passende Ramdisk zum Booten ausgewählt werden. Eine bebilderte Anleitung zum aufspüren des Seriellen Ports findet sich, auf Englisch, hier. Kurz zusammengefasst müssen die hintere Abdeckung und die hinteren Füße weggeschraubt werden, danach lässt sich die Platine mitsamt der Rückwand heraus schieben. Dabei sollte der Festplattenrahmen vorher entfernt worden sein. Unter dem Lüfter befinden sich einige Steckverbindungen auf der Platine. Davon ist eine 4 polige unbelegt. Dies ist der serielle Anschluss. Er arbeitet mit 3,3V Pegeln. Wenn der Stecker an der oberen linken Ecke sitzt, ist die Belegung wie folgt:

(GND) (TX) (RX) (3V3)

Ein passender Adapter um den Port an den Computer anzuschliessen ist schnell gemacht. Hierzu habe ich einen FT232R auf meine DIP Adapterplatine gelötet und wie folgt beschaltet (Klick vergrößert):

Schaltplan Fertiger Adapter

Software

Nun besteht also eine Verbindung zwischen meinem Computer und dem NAS mit 115200bps. Wird letzterer nun gebootet, erscheinen U-Boots Statusmeldungen in meinem Terminal. Früher oder später erscheint ein Countdown. Wird dieser mit dem drücken einer beliebigen Taste unterbrochen, findet man sich in U-Boots Kommandozeile wieder. Hier kann zum Beispiel U-Boots eigenes USB System gestartet werden, damit ein Kernel von einem angeschlossenen USB Stick geladen werden kann. Alternativ kann ein Kernel von einem TFTP Server geladen und gestartet werden. Ausserdem können Umbgebungsvariablen angezeigt, geändert, und im NAND gespeichert werden:

printenv
setenv name wert
saveenv

Zum Starten eines anderen Kernels muss zunächst die Variable "mainlineLinux" auf "yes" gesetzt werden. Anschliessend ändern wir die "arcNumber" auf "2361". Dies gaukelt dem Debian Linux Kernel ein anderes System vor, da es den NAS6210 nicht kennt und deshalb sonst nicht booten will. Die Originale arcNumber lautet 3104. Nun wird noch "ipaddr" auf die gewünschte NAS IP gesetzt und "serverip" auf die IP des Rechners, der im nächsten Schritt einen TFTP Server startet. Geschrieben werden die Änderungen dann mit saveenv.

setenv mainlineLinux yes
setenv arcNumber 2361
setenv ipaddr 192.169.2.107
setenv serverip 192.168.2.101
saveenv

Nun wird auf einem Rechner im selben Netzwerk ein TFTP Server gestartet. Ich habe auf meinem Mac TftpServer verwendet. Dieser muss ein uImage und eine uInitrd zur Verfügung stellen. Die verlinkten Dateien sind die des aktuellen Armel OpenRD Debian Installers. Der Installer wird nun auf dem NAS gebootet:

tftpboot 0x01100000 uInitrd
tftpboot 0x00800000 uImage
setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most
bootm 0x00800000 0x01100000

Die Installation kann sowohl auf einem USB-Stick, einem eSATA oder einem internen SATA Laufwerk erfolgen. Ich habe Debian auf einen 8GB USB-Stick installiert. Beim Debian Support gibt es Hilfe zur Installation. Ist die Installation abgeschlossen, muss U-Boot konfiguriert werden, um sie zu starten. Zuerst die folgenden 2 Zeilen eingeben:

setenv bootargs_console console=ttyS0,115200
setenv bootcmd 'setenv bootargs $(bootargs_console); run bootcmd_slk; bootm 0x00800000 0x01100000'

Für eine USB-Stick Installation nun folgendes Eingeben:

setenv bootcmd_slk 'usb start; ext2load usb 0:1 0x01100000 /uInitrd; ext2load usb 0:1 0x00800000 /uImage'

Dieses Kommando funktioniert so nur, wenn /boot auf der ersten, als ext2 formatierten Partition liegt. Ansonsten den Pfad anpassen. Ext3 und 4 werden von U-Boot nicht unterstützt.

Für SATA oder eSATA:

setenv bootcmd_slk 'ide reset; ext2load ide 0:1 0x01100000 /uInitrd; ext2load ide 0:1 0x00800000 /uImage'

Nun noch ein "saveenv", um das ganze zu speichern. Jetzt reicht "run bootcmd" um die U-Boot Kommandozeile zu verlassen und das neu Installierte Debian zu booten.

Ein neuer Kernel muss her

Der Standard Kernel von Debian unterstützt den NAS6210 nicht wirklich, weshalb die grüne LED dauernd blinkt und das Gerät nach dem herunterfahren nicht ausgeht. Abhilfe schafft ein selbst kompilierter Linux Kernel mit dem richtigen Patch. Dieser ist auf der oben verlinkten Tutorial Seite zu finden, oder auch hier. Wer sich die Mühe machen will, kann seinen eigenen Kernel nach diesem Ausschnitt des Debian Kernel Handbook selbst konfigurieren und kompilieren. Ich habe mir diese Mühe bereits gemacht, und fertige .deb Pakete erstellt (18MB) (18.0 MiB), welche nur noch mittels diesem Befehl installiert werden müssen:

dpkg -i linux-image-3.1.0-rc742_xy42_armel.deb

Achtung: dpkg scheint nicht mehr mit Buchstaben in der Versionsnummer (“xy42”) klarzukommen. Bei Problemen, bitte eigenen Kernel kompilieren!

Im /boot Verzeichnis des NAS findet sich nun der neue Kernel als "vmlinuz-3.1.0-rc742" und die neue Ramdisk als "initrd.img-3.1.0-rc742". Diese 2 Dateien müssen nun mittels mkimage in U-Boot Images verwandelt werden:

mkimage -A arm -O linux -T kernel -C none -a 0x8000 -n Kernel -d vmlinuz-3.1.0-rc742 uImageN
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x8C800000 -n RamDisk -d initrd.img-3.1.0-rc742 uInitrdN

Das erzeugt die Dateien uInitrdN und uImageN, welche gebootet werden müssen. Dazu neu starten und folgendes im U-Boot Prompt eingeben:

setenv bootcmd_slk 'usb start; ext2load usb 0:1 0x01100000 /uInitrdN; ext2load usb 0:1 0x00800000 /uImageN'
setenv arcNumber 3104
saveenv

Ausserdem wird die arcNumber auf die des NAS6210 gestellt, welche dem neuen Kernel bekannt ist. Falls du nicht auf einen USB-Stick installiert hast, musst du das SATA Kommando von oben entsprechend anpassen.

Das wars! Nun kann beliebige Software installiert werden, um den Server für die eigenen Bedürfnisse anzupassen. Bei mir läuft folgendes:

Power Button nutzen

Per E-Mail hat mich Waepu auf seinen Weg aufmerksam gemacht, den Power Button nutzbar zu machen. Dafür muss ein neuer Kernel kompiliert werden. Neben dem oben verlinkten Patch muss folgende kleine Änderung angewendet werden:

static unsigned int nas6210_mpp_config[] __initdata = {
  MPP0_NF_IO2,
  MPP1_NF_IO3,
  MPP2_NF_IO4,
  MPP3_NF_IO5,
  MPP4_NF_IO6,
  MPP5_NF_IO7,
  MPP18_NF_IO0,
  MPP19_NF_IO1,

  MPP20_SATA1_ACTn,    /* HD1 LED red */
  MPP21_SATA0_ACTn,    /* HD0 LED red */
  MPP22_GPIO,    /* Power LED red */
  MPP23_GPIO,    /* Power button */

  MPP24_GPIO,    /* Power off device */
  MPP25_GPIO,    /* Power LED green */
  MPP27_GPIO,    /* USB transfer LED */
  MPP28_GPIO,    /* Reset button */
  MPP29_GPIO,    /* USB Copy button */
  0
};

Erst wenn im Struct MPP23_GPIO hinzugefügt wird, funktioniert folgendes Bash Script.

#!/bin/sh
echo 23 > /sys/class/gpio/export
while : ; do
  s=`cat /sys/class/gpio/gpio23/value`
  if test "$s" == 0 ; then
    shutdown -h now
    exit 0
  fi
  sleep 1
done

Der Button auf MPP23_GPIO hat eine Art Flip-Flop Funktion. Wenn man den Button für ein paar Sekunden hält, ändert sich der Status von MPP23_GPIO und bleibt so bis zum Reboot.

Ersetzt man im Kernel MPP20_SATA1_ACTn und MPP21_SATA0_ACTn durch MPP20_GPIO und MPP21_GPIO können per Bash auch die HDD LEDs angesteuert werden. Dann funktioniert jedoch die Anzeige der Festplattenaktivität nicht mehr.

Vielen Dank an Waepu hierfür!