Debian 5.0 "Lenny" auf Linksys NSLU2 Howto
Anmerkung: dieses Howto steht auch in einer Kurzfassung zur Verfügung, die lediglich die einzelnen Schritte erläutert und nicht auf weitere Details eingeht.
Immer mehr Hersteller entwickeln NAS Geräte, die den Privatanwender als Kunden fokussieren. So hat u.a. die Firma Linksys bereits vor geraumer Zeit ein solches Gerät Namens NSLU2 (Network Storage Link for USB 2.0) auf den Markt gebracht. Dabei handelt es sich um ein NAS Device, das selbst keine internen Platten verwaltet, sondern diese über zwei USB 2.0 Anschlüsse angeschlossen werden können.

Einleitung
Da die NSLU2 dem Anwender es ermöglicht, das vorinstallierte Embedded Linux gegen eine vollwertige Linux-Distribution seiner Wahl zu tauschen, ergeben sich bei diesem Gerät vielfältige Möglichkeiten, was den Einsatz der Linksys NSLU2 (umgangssprachlich auch "Slug" genannt) als vollwertigen Server betrifft.
Die NSLU2 basiert auf folgender Hardware:
- CPU: ARM Prozessor (Intel XScale IXP420, 266 MHz, frühere Versionen waren künstlich auf 133 MHz gedrosselt)
- RAM: 32 MB
- Flashspeicher: 8 MB (reserviert für das Betriebssystem)
- USB Anschlüsse: zwei Anschlüsse (USB 2.0)
- Netzwerkinterface: 100 MBit/s
- Zusätzliche Anschlüsse: RS-232 (standardmäßig nicht nach außen geführt)
Durch den Einsatz eines USB-Hubs können beliebig viele USB Geräte (Festplatten, Speichersticks, Drucker, Webcams etc.) an die NSLU2 angeschlossen werden. Ein wichtiger Vorteil bei der Verwendung der NSLU2 als Server ist vor allem dessen geringe Stromaufnahme und der geräuschlose Betrieb des Geräts.
In diesem Howto erklären wir Schritt für Schritt die Installation und Konfiguration eines vollwertigen Debian GNU/Linux 5.0 (aka "Lenny") Systems auf der NSLU2. Das Howto basiert zum größten Teil auf der erstklassigen Arbeit von Martin Michlmayr, einem der Hauptentwickler der Portierung von Debian auf die ARM-Architektur, sowie seiner exzellenten Dokumentation. Martin, an dieser Stelle sei dir für deine hervorragende Arbeit nochmals gedankt.
Vorbereitung der USB-Sticks (System)
Zunächst partitionieren und formatieren wir den USB-Stick, auf dem später das gesamte Betriebssystem seinen Platz findet, indem wir diesen an einen beliebigen Linux Rechner anschließen. In unserem Fall verwenden wir statt einer USB-Festplatte einen 2 GB großen USB-Stick, da wir auf unserer NSLU2 lediglich einige grundlegende Netzwerkdienste betreiben wollen. Möchte man die NSLU2 als File- bzw. Media-Server verwenden, bietet sich dieses Vorgehen ebenfalls an. Hat man zunächst das System nach den eigenen Vorstellungen auf dem USB-Stick installiert und konfiguriert, können jederzeit weitere USB-Speichermedien, wie bspw. externe Festplatten an die NSLU2 angeschlossen werden.
In unserem Fall verwenden wir auf dem USB-Stick jeweils eine eigene Partition für /boot, / und /home sowie eine Swap-Partition. Das von uns verwendete Partitionsschema sieht dabei folgendermaßen aus (ausgehend von dem Fall, daß der Stick als /dev/sdb auf unserem Linux-System erkannt wird!):
Disk /dev/sdb: 2004 MB, 2004877312 bytes 129 heads, 32 sectors/track, 948 cylinders Units = cylinders of 4128 * 512 = 2113536 bytes Disk identifier: 0xc3072e18 Device Boot Start End Blocks Id System /dev/sdb1 * 1 33 68096 83 Linux /dev/sdb2 34 788 1558320 83 Linux /dev/sdb3 789 948 330240 5 Extended /dev/sdb5 789 869 167168 82 Linux swap / Solaris /dev/sdb6 870 948 163040 83 Linux
Anmerkung: aufgrund des verwendeten, speziell für die NSLU2 erstellten Debian Images, das wir zur Installation verwenden werden, muss die Reihenfolge und die Zuordnung der Partitionen diesem Schema entsprechen! Die Größe des Mediums und der einzelnen Partitionen ist dabei beliebig wählbar. Wichtig an dieser Stelle ist, dass die erste Partition als bootbar markiert wird.
Den einzelnen Partitionen werden später die folgenden Moountpoints zugewiesen:
- /dev/sda1 wird zu /boot (in unserem Fall 64 MB)
- /dev/sda2 wird zu / (in unserem Fall 1,7 GB)
- /dev/sda3 wird eine erweiterte Partition
- /dev/sda5 wird zu Swap (in unserem Fall 128 MB)
- /dev/sda6 wird zu /home (in unserem Fall 128 MB)
Wichtig: alle Daten auf USB-Stick bzw. der USB-Festplatte gehen dabei verloren! Daher unbedingt vorher ein Backup des Sticks erstellen und mehrmals kontrollieren, ob wir an dieser Stelle tatsächlich den USB-Stick partitionieren und formatieren und nicht ein anderes Speichermedium!
Anschliessend formatieren wir die einzelnen Partitionen mittels:
# mkfs.ext2 /dev/sdb1
# mkfs.ext3 /dev/sdb2
# mkfs.ext3 /dev/sdb6
# mkswap /dev/sdb5
Nun mounten wir die Root-Partition mittels:
# mount /dev/sdb2 /mnt
Anschließend erstellen wir einen Mountpoint für die Partition /boot und mounten diese:
# mkdir /mnt/boot
# mount /dev/sdb1 /mnt/boot
Anschliessend laden wir das Debian GNU/Linux 5.0 (aka "Lenny") Basissystem herunter, das in einer komprimierten Version vorliegt (Dateigröße ca. 108 MB). Das Archiv wurde ebenfalls von Martin Michlmayr erstellt und wird von ihm gepflegt. Es enthält alle Standardpakete von Lenny. Zusätzlich laden wir die zu dem Archiv zugehörige PGP Signatur herunter:
# cd /mnt
# wget http://people.debian.org/~tbm/nslu2/lenny/base.tar.bz2
# wget http://people.debian.org/~tbm/nslu2/lenny/base.tar.bz2.asc
Anmerkung: Es ist ebenfalls möglich Debian per Installer auf der NSLU2 direkt zu installieren. Seit der Debian Version 5.0 (aka "Lenny") unterstützt dieser die direkte Installation auf der NSLU2. Diese beansprucht jedoch durch die geringe CPU-Leistung ca. 4 Stunden. Daher installieren wir hier das fertige Image von Martin Michlmayr.
Nun überprüfen wir die Authentizität des heruntergeladenen Archivs. Dazu importieren wir zunächst die GPG-Schlüssel des Entwicklers Martin Michlmayr:
# gpg --keyserver subkeys.pgp.net --recv-keys 68FD549F
Daraufhin quittiert uns das System den Erhalt des GPG-Schlüssels, indem es die folgende Meldung generiert:
gpg: requesting key 68FD549F from hkp server subkeys.pgp.net gpg: key 68FD549F: public key "Martin Michlmayr <tbm@cyrius.com>" imported gpg: no ultimately trusted keys found gpg: Total number processed: 1 gpg: imported: 1
Anschließend überprüfen wir die Signatur des heruntergeladenen Archivs mittels:
# gpg --verify base.tar.bz2.asc base.tar.bz2
Die Unversehrtheit des Archivs quittiert das System mit der folgenden Ausgabe:
gpg: Signature made Mon 18 Feb 2008 11:38:05 AM CET using DSA key ID 68FD549F gpg: Good signature from "Martin Michlmayr <tbm@cyrius.com>" gpg: aka "Martin Michlmayr <tbm@debian.org>" gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: F849 E202 5D1C 194D E62B C6C8 29BE 5D22 68FD 549F
Als Nächstes entpacken wir das Archiv:
# tar xjvf base.tar.bz2
# rm base.tar.bz2
Das Archiv besitzt ca. 27.800 Dateien, die nun entpackt im Verzeichnis /mnt liegen.
Zuletzt hängen wir den USB-Stick aus unserem Dateisystem wieder aus:
# cd /
# umount /mnt/boot
# umount /mnt
Flashen der neuen NSLU2 Firmware
Nun benötigen wir noch auf einem lokalen Linux-PC die Applikation upslug2, mit deren Hilfe wir das Firmware-Image einspielen werden. Zudem brauchen wir das Tool arpwatch, um die IP-Adresse, die die NSLU2 in unserem Fall via DHCP bezieht, zu erfahren. Beide Applikationen können wir z.B. auf einem Linux-PC, auf dem Debian läuft, installieren mittels:
# aptitude install upslug2 arpwatch
Anmerkung: sollten wir Ubuntu als lokales Linux-System verwenden, müssen wir das obige Kommando mit einem vorangestelltem sudo ausführen, d.h.:
$ sudo aptitude install upslug2 arpwatch
Bevor wir die neue Firmware flashen, öffnen wir zunächst auf unserem lokalen Rechner ein Terminalfenster und geben folgendes Kommando ein, um die IP Adresse, die die NSLU2 von unserem DHCP-Server bezieht, zu ermitteln (ein DHCP-Server in unserem LAN ist Voraussetzung für die hier beschriebene Installation!):
# arpwatch -dN -i eth0
Nun laden wir das Debian Etch Firmware-Image herunter, das in den folgenden Schritten die Original-Firmware der NSLU2 ersetzen wird:
# cd /tmp
# wget http://www.cyrius.com/debian/nslu2/files/armel/sda2-2.6.26-19
Anschliessend verbinden wir die NSLU2 über einen Netzwerkswitch (wichtig später für die Ermittlung der via DHCP bezogenen IP-Adresse) mit unserem lokalen Linux-Rechner und versetzen diese in den Upgrade-Modus:
- Alle USB Geräte, die an den USB Ports angeschlossen sind, entfernen.
- Die NSLU2 ausschalten.
- Den Reset-Schalter (kleines Loch auf der Rückseite über dem Stromanschluss) drücken und gedrückt halten.
- Den Ein-/Ausschalter drücken und loslassen (dabei den Reset-Schalter weiterhin gedrückt halten).
- Die Status-LED beobachten. Nach ca. 10 Sekunden wechselt die Status-LED die Farbe von Orange nach Rot. Ist dies der Fall, den Reset-Schalter sofort loslassen.
- Die Status-LED wechselt nun permament ihre Farbe zwischen Rot und Grün. Damit befindet sich die NSLU2 nun im Upgrade Modus.
Nun spielen das neue Firmware-Image ein mittels:
# upslug2 -i sda2-2.6.26-19
Auch diesen Vorgang quittiert das System mit einer entsprechenden Meldung. Dabei läßt sich der Vorgang des Flashens beobachten:
LKG7E9672 00:0f:66:7e:96:72 Product ID: 1 Protocol ID:0 Firmware Version: R23V63 [0x2363]
Upgrading LKG7E9672 00:0f:66:7e:96:72
. original flash contents * packet timed out
! being erased - erased
u being upgraded U upgraded
v being verified V verified
Display:
<status> <address completed>+<bytes transmitted but not completed>
Status:
* timeout occured + sequence error detected
4a02ff+000000 ...UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUu--------------------------
Sobald der Vorgang des Flashens abgeschlossen ist (die obige Ausgabe endet mit der Meldung Rebooting... done), schliessen wir den vorhin von uns vorbereiteten USB-Stick an. Von nun an sollte unsere NSLU2 von diesem booten.
In dem Moment, in dem die NSLU2 eine IP-Adresse via DHCP bezieht (u.U. müssen wir einige Minuten warten, bis die Box hochgefahren ist), protokolliert arpwatch in dem von uns vorher geöffneten Terminalfenster (s.o.) das Erscheinen eines neuen Netzwerkknotens mit einer entsprechende Meldung. In unserem Fall lautet diese:
From: arpwatch (Arpwatch turing)
To: root
Subject: new station eth0
hostname: <unknown>
ip address: 192.168.1.4
interface: eth0
ethernet address: 0:f:66:7e:96:72
ethernet vendor: Cisco-Linksys
timestamp: Thursday, March 5, 2009 16:39:18 +0100
Dabei verwendet das Debian Image folgende Default-Einstellungen:
- Root-Passwort: root
- IP-Adresse: wird per DHCP bezogen (s.o., in unserem Fall also 192.168.1.4)
- Hostname: foobar
- DNS Domain Name: cyrius.com
- SSH Server ist aktiviert / Root Zugriff per SSH ist aktiviert
Nacharbeiten
Nachdem unsere neu geflashte NSLU2 ordnungsgemäß gebootet hat, loggen wir uns per SSH auf dieser ein (IP-Adresse s. obige Ausgabe des Kommandos arpwatch). Einige Einstellungen sollten direkt im Anschluss an den ersten Start der NSLU2 vorgenommen werden, um die Sicherheit des Systems zu erhöhen. Nach dem direkten Einspielen der Firmware haben alle damit geflashten Geräte bspw. die gleichen, mit der Firmware ausgelieferten Passwörter und SSH-Schlüssel gesetzt, was ein erhebliches Sicherheitsrisiko darstellt.
Neue SSH Schlüsselpaare generieren
Anschließend generieren wir zwei neue Schlüsselpaare für unseren SSH Server (DSA und RSA). Da der private Schlüssel in dem Debian Image abgelegt ist, ist er für jeden, der das Image heruntergeladen hat gleich! Dieser muss so schnell, wie möglich nach der Installation neu generiert werden.
# rm /etc/ssh/ssh_host*
# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
Dabei benötigt das Programm einige Zeit, um die entsprechenden Schlüsselpaare zu erzeugen.
Host- und Domainnamen setzen
Nun setzen wir den Hostnamen für unsere NSLU2 neu (in unserem Fall boole):
# echo boole > /etc/hostname
Zudem ersetzen wir in der Konfigurationsdatei /etc/hosts die Zeile
127.0.1.1 foobar.example.org foobar
durch
127.0.1.1 boole.asconix.lan boole
Dabei ist asconix.lan durch den Namen der eigenen, zumeist lokalen, Domain zu ersetzen.
Zuletzt aktivieren wir den neuen Host- und Domainnamen mittels:
# /etc/init.d/hostname.sh stop && /etc/init.d/hostname.sh start
Die Konfiguration des Host- und des Domainnamens können wir überprüfen mittels:
- Hostnamen ermitteln:
# hostname
boole
- Hostnamen samt Domainnamen ermitteln:
# hostname -f
boole.asconix.lan
Debian Paket-Repository anpassen
Nun modifizieren wir die Konfigurationsdatei /etc/apt/sources.list, indem wir darin einen in der Nähe liegenden Debian-Mirror eintragen. Zum anderen wollen wir aber auch neben main die beiden Zweige contrib und non-free verwenden, so dass die Konfigurationsdatei schlußendlich folgendes Aussehen hat:
deb http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ lenny main contrib non-free deb-src http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ lenny main contrib non-free deb http://security.debian.org/ lenny/updates main contrib non-free deb-src http://security.debian.org/ lenny/updates main contrib non-free
Update des gesamten Systems
Zunächst einmal führen wir ein Update der dpkg Datenbank durch:
# aptitude update
Anschließend bringen wir das gesamte System auf den neuesten Stand:
# aptitude safe-upgrade
U.U. nehmen die beiden letzten Schritte einige Zeit in Anspruch, da je nach Aktualität des Systems viele Softwarepakete geupdatet werden müssen.
Synchronisation der CMOS Uhr
Um eine konsistene Zeit im gesamten Netzwerk zu erhalten, verwenden wir an dieser Stelle eine netzbasierte Zeitsynchronisation mit den NTP-Servern der Physikalisch-Technischen Bundesanstalt (PTB) in Braunschweig. Um die interne Uhr mit den entsprechenden Zeitservern zu synchronisieren, installieren wir zunächt das Paket ntp aus dem Debian-Repository:
# aptitude install ntp
Anschließend konfigurieren wir den NTP Daemon, indem wir die Konfigurationsdatei /etc/ntp.conf folgendermaßen modifizieren:
driftfile /var/lib/ntp/ntp.drift statsdir /var/log/ntpstats/ statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable server ptbtime1.ptb.de version 3 server ptbtime2.ptb.de version 3 server ntps1-0.cs.tu-berlin.de version 3 server ntps1-0.uni-erlangen.de version 3 server ntp0.fau.de version 3 restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery restrict 127.0.0.1 restrict ::1
Anschließend starten wir den NTP Daemon einmal neu, damit dieser die Zeit der NSLU2 zum ersten Mal synchronisiert:
# /etc/init.d/ntp restart
Zeitzone anpassen
Zuletzt passen wir die Zeitzone, in der wir uns befinden an. Dazu verwenden wir folgendes Kommando:
# dpkg-reconfigure tzdata
Daraufhin setzen wir die Zeitzone auf Europe => Berlin
Reboot
Nachdem wir nun unser System diesem Howto folgend installiert und konfiguriert haben, starten wir es neu mittels:
# reboot



Fehlendes Image
Thx Maddin