Mein erster Pi, ein Model B, hat ein Jahr wacker seinen Dienst als Medien- und Netzwerkserver verrichtet. Dann ist er leider von uns gegangen. Anscheinend mag er keine Stromausfälle.
Da sich mittlerweile das Modell B+ angekündigt hat, lag es nahe, einen Neuanfang zu wagen. Da ja nur die Platine hinüber war, sollte das Grundmodell mit einem Gehäuse genügen. Ich hatte die Rechnung ohne den Fortschritt gemacht. Mittlerweile ist der SD-Kartenschacht geschrumpft. Zum Glück war die alte Karte bereits in einem Adapter und liegt damit im richtigen Format vor. Weniger Glück hatte ich mit dem Netzteil. Das alte scheint mit 1500mA zu wenig Strom zu liefern, was ich aber nicht wusste. Ich sah nur die leuchtende Grüne Lampe und einen nicht bootenden Pi. Also hab ich auf die bereits fertige Installation die allerneueste Distribution gespielt, und erst danach mal ein anderes Netzteil probiert. Shit happens.
Wie dem auch sei – der Pi B+ läuft nun mit einem 2000mA Netzteil, und die Lampe leuchtet rot. Vielleicht bekomme ich irgendwann noch einmal heraus, warum die Farben hier vertauscht sind.
SD-Karte vorbereiten
Als Distribution habe ich die neueste Version von Debian Wheezy heruntergeladen. Dieses Mal habe ich sie mittels LiLi USB Creator unter Windows aufgespielt. Der vergangene Pi bekam die Karte mittels
dd if=img-file of=/dev/sdX & sync
bespielt, wobei img-file der Dateiname des entpackten Abbildes beschreibt, und sdX zu ersetzen ist durch den Mountpunkt der SD-Karte.
Danach kann bereits von der Karte gebootet werden und man sollte mit dem folgenden Screen begrüßt werden.
Erstes Einrichten
Wir beginnen mit dem Punkt 1 Expand Filesystem, damit auch der komplette Speicherplatz der Karte genutzt werden kann. Das Ändern der Größe wird erst beim nächsten Neustart erledigt, weshalb ein Reboot fällig ist.
Nach dem Reboot werden wir mit dem Login-Prompt begrüßt:
raspberrypi login: pi
Password:
Das zugehörige Passwort lautet raspberry. Zurück in die Konfiguration kommt man durch den Aufruf
pi@raspberrypi ~ $ sudo raspi-config
Unter den Advanced Options wähle ich Hostname aus und ändere ihn zu atuin.
Danach wird erstmal benötigte Software installiert:
pi@atuin ~ $ sudo apt-get install vim mc vim-addon-manager
Danach werden archivierte Logs gelöscht. Diesen Schritt kann man später immer wieder mal durchführen:
pi@atuin ~ $ sudo find /var/log -name *.gz -type f -print0 | sudo xargs -0 /bin/rm
Eigener Benutzer
Wem ein eigener Benutzer zu viel Paranoia bedeutet, der kann damit vorlieb nehmen, einfach das Passwort des Benutzers Pi zu ändern und dieses Kapitel überspringen.
Ein neuer Benutzer wird so angelegt:
pi@atuin ~ $ sudo adduser myuser
Danach werden jede Menge Informationen abgefragt. Wichtig ist der Aufruf nach dem Anlegen des Benutzers
pi@atuin ~ $ sudo EDITOR=vim visudo
um dort die Zeile mit dem neuen Benutzer hinzuzufügen oder die Zeile mit dem Benutzer pi durch den neuen Benutzer zu ersetzen:
myuser ALL=(ALL) NOPASSWD: ALL
Ansonsten schlagen alle zukünftigen Befehle fehl, die Rootrechte benötigen und mittels sudo aufgerufen werden. Wir loggen uns durch *exit* aus und melden uns als myuser mit entsprechendem Passwort an.
Von nun an wird der alte pi-Benutzer nicht mehr benötigt und kann vom System entfernt werden:
myuser@atuin ~ $ sudo deluser --remove-home pi
Wir können uns durch ls /home davon überzeugen, dass unser neuer Benutzer der einzige auf dem System ist. Jedenfalls der einzige mit eigenem Home-Verzeichnis.
Zugang per SSH
Wir ermitteln durch ifconfig die IP-Adresse unseres Pi, da wir die gleich brauchen. Bei mir ist es die 192.168.5.123.
Um uns nun von einem anderen Linux-System per SSH ohne weitere Passworteingabe auf dem Pi remote einloggen zu können, müssen wir den Public Key übertragen.
Wir befinden uns nun auf dem zweiten System (dem Nicht-Pi). Falls bislang noch Public Key angelegt wurde, kann dies nun mittels ssh-keygen nachgeholt werden. Wir installieren nun den lokalen SSH-Schlüssel auf dem Pi durch
myuser@ankh ~ $ cat ~/.ssh/id_rsa.pub | ssh 192.168.5.123 'umask 077; cat >> .ssh/authorized-keys'
Falls hierbei die Fehlermeldung kommt „No such file or directory“, einfach auf dem Pi ebenfalls ssh-keygen starten, das fehlende Verzeichnis wird dabei automatisch angelegt. Danach einfach den obigen Befehl noch einmal eingeben.
Jedes weitere Anmelden per
myuser@ankh ~ $ ssh 192.168.5.123
wird nun ohne Passwortabfrage erfolgen.
Netzwerk
Bislang bezog der Pi seine IP-Adresse per DHCP. Da er selbst die Rolle als DHCP-Sever übernehmen soll, ist das einigermaßen unbefriedigend. Wir ändern die Adresse also in eine statische:
myuser@atuin ~ $ sudo vi /etc/network/interfaces
Hinweis: falls in den nachfolgenden Kapiteln Konfigurationsdateien editiert werden sollen, muss das zwingend durch sudo vi erfolgen. Hierbei ist weniger der Editor vi als vielmehr die Anforderung von Root-Rechten durch sudo wichtig.
Hier gehe ich von einer Kabelverbindung aus. Wir ändern also die Zeile
iface eth0 inet dhcp
in
iface eth0 inet static
address 192.168.5.99
netmask 255.255.255.0
gateway 192.168.5.1
Die neue Konfiguration aktivieren wir durch Neustart des Netzwerkmoduls:
myuser@atuin ~ $ sudo /etc/init.d/networking stop
myuser@atuin ~ $ sudo /etc/init.d/networking start
Danach sollte ifconfig die neue IP-Adresse ausgeben.
Locale
Bei mir kam jedes Mal die lästige Fehlermeldung
locale: Cannot set LC_ALL to default locale: No such file or directory
Die Ausgabe von locale lieferte
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
Mittels
myuser@atuin ~ $ sudo vi /ec/locale.gen
füge ich *de_DE.UTF-8 UTF-8* und *en_US.UTF-8 UTF-8* hinzu und starte
myuser@atuin ~ $ sudo locale-gen
Danach habe ich zwar einen Mix aus Deutsch und Britisch, aber keine Fehlermeldung mehr:
myuser@atuin ~ $ locale
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
Hoffentlich werden meine russischen Lieder trotzdem richtig abgelegt…
Timeserver
Als einfachstes Mitglied der Serverfamilie installieren wir ntp sozusagen zum Warmwerden:
myuser@atuin ~ $ sudo apt-get install ntp ntpdate
Um dem Dienst die Zeitserver für den Abgleich bekannt zu machen, editieren wir als root die Datei /etc/ntp.conf und fügen an der entsprechenden Stelle ein:
# You do need to talk to an NTP server or two (or three).
server ptbtime1.ptb.de
server ptbtime2.ptb.de
server ptbtime3.ptb.de
Weiterhin sollen die Clients in unserem Subnetz darauf zugreifen können, deshalb fügen wir in der selben Datei noch ein:
# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust
restrict 192.168.5.0 mask 255.255.255.0
Nachdem wir unseren Server neu gestartet haben
myuser@atuin ~ $ sudo /etc/init.d/ntp restart
können wir uns die Liste der benutzen Zeitserver ausgeben lassen:
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ptbtime1.ptb.de .PTB. 1 u 2 64 1 50.789 -5.957 0.001
ptbtime2.ptb.de .PTB. 1 u 1 64 1 51.072 -6.020 0.001
ptbtime3.ptb.de .PTB. 1 u - 64 1 57.417 -1.334 0.001
Nameserver
Wir installieren als nächstes den Nameserver. Hierfür wird das Paket bind9 installiert:
myuser@atuin ~ $ sudo apt-get install bind9 host dnsutils
Danach richten wir bind so ein, dass es sowohl die Auflösung von IP-Adressen in Namen und Namensauflösung in IP-Adressen beherrscht. Wir müssen also in der Konfigurationsdatei zwei Zonenkonfigurationen definieren. Wir editieren die Datei /etc/bind/named.conf.local als root:
zone "discworld" {
type master;
file "/var/lib/bind/zone.discworld";
allow-update { localhost; };
};
zone „5.168.192.in-addr.arpa“ {
type master;
file „/varlib/bind/zone.5.168.192“;
allow-update { localhost; };
};
Die Datei zone.discworld übernimmt nun die Übersetzung von Namen in IP-Adressen:
@ IN SOA ns.discworld. atuin.discworld. (
2014112610 ; serial
28800 ; refresh (8 hours)
7200 ; retry (2 hours)
2419200 ; expire (4 weeks)
10800 ; minimum (3 hours)
)
IN NS ns.discworld.
; MX 10 mailserver.discworld.
ns A 192.168.5.8
atuin A 192.168.5.8
ankh A 192.168.5.10
wohingegen die Datei zone.5.168.192 die Übersetzung IP-Adressen in Namen übernimmt:
@ IN SOA ns.discworld. atuin.discworld. (
2014112610 ; serial
28800 ; refresh (8 hours)
7200 ; retry (2 hours)
2419200 ; expire (4 weeks)
172800 ; minimum (2 days)
)
IN NS atuin.discworld.
8 IN PTR atuin.discworld.
10 IN PTR ankh.discworld.
Jetzt startet man entweder den Nameserver, weil er noch nicht lief
myuser@atuin ~ $ sudo /etc/init.d/bind9 start
oder man lässt ihn die neue Konfiguration laden
myuser@atuin ~ $ sudo rndc reload
Ob das Laden erfolgreich war bzw wo es Fehler gab, steht in der syslog-Datei
myuser@atuin ~ $ sudo tail /var/log/syslog
Man kann auch die Konfigurationsdateien prüfen lassen
myuser@atuin ~ $ sudo named-checkconf /etc/bind/named.conf.local
oder die Zonendefinitionsdatei
myuser@atuin ~ $ sudo named-checkzone /var/lib/bind/zone.discworld
Damit der Nameserver auch verwendet wird, ist noch die resolv.conf anzupassen:
myuser@atuin ~ $ sudo /etc/resolv.conf
wir registrieren hier unsere lokale Domäne und setzen die zu benutzenden Nameserver:
domain discworld
search discworld
nameserver 192.168.5.8
nameserver 192.168.5.1
Die letzte Zeile ist natürlich nur nötig, wenn auf ankh auch tatsächlich ein Backup-Nameserver läuft.
Sofern die Konfiguration gültig ist, sollten wir korrekte Namensauflösungen erhalten:
myuser@atuin ~ $ nslookup atuin
Server: 192.168.5.8
Address: 192.168.5.8#53
Name: atuin.discworld
Address: 192.168.5.8
myuser@atuin ~ $ nslookup ankh
Server: 192.168.5.8
Address: 192.168.5.8#53
Name: ankh.discworld
Address: 192.168.5.10
DHCP Server
Neben der Namensauflösung soll unser Pi auch die IP-Vergabe übernehmen. Wir installieren deshalb
myuser@atuin ~ $ sudo apt-get install isc-dhcp-server
und editieren dessen Konfigurationsdatei /etc/dhcp/dhcpd.conf:
ddns-update-style interim;
option domain-name „discworld“;
default-lease-time 3600;
max-lease-time 14400;
authoritative;
ignore client-updates;
subnet 192.168.5.0 netmask 255.255.255.0 {
range 192.168.5.230 192.168.5.250;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.5.1;
option domain-name-servers 192.168.5.8, 192.168.5.1;
option ntp-servers 192.168.5.8;
ddns-domainname „guest.discworld“;
}
Schön zu sehen, wie durch die automatische IP-Vergabe die übrigen Server die DNS und NTP im Netz bekannt gemacht werden.
Externe Platte
Die streambaren Musikdateien lediglich auf der SD-Karte zu halten, ist wenig hilfreich. Wir binden deshalb eine externe USB-Platte an. Am besten schließt man die an einen aktiven USB-Hub an, das Netzteil des Pi wird dazu nicht ausreichen.
Wir schließen die Platte an den USB-Port an und initialisieren sie:
myuser@atuin ~ $ sudo cfdisk /dev/sda
(Add Primary Partition)
myuser@atuin ~ $ sudo mkfs.ext4 /def/sda1
und fügen sie als neue Festplatte in die /etc/fstab hinzu:
/dev/sda1 /extern ext4 rw,user,errors=remount-ro 0 1
Wir legen jetzt die benötigten Verzeichnisse an. Vorgabe bei den streambaren Ressourcen sind die Verzeichnisse des UPNP- bzw DLNA-Servers, wie ihn etwa ein Samsung-Fernseher sieht. Daneben soll es noch ein Backup-Verzeichnis für Windows-Rechner geben.
myuser@atuin ~ $ mount /extern
myuser@atuin ~ $ sudo mkdir /extern/share
myuser@atuin ~ $ sudo chmod g+w -R /extern/share
myuser@atuin ~ $ sudo chown root.users -R /extern/share
myuser@atuin ~ $ mkdir /extern/share/Audio
myuser@atuin ~ $ mkdir /extern/share/Video
myuser@atuin ~ $ mkdir /extern/share/Pictures
myuser@atuin ~ $ mkdir /extern/share/Playlists
myuser@atuin ~ $ mkdir /extern/share/TV-Shows
myuser@atuin ~ $ sudo chmod g+w -R /extern/share
myuser@atuin ~ $ sudo chown root.users -R /extern/share
myuser@atuin ~ $ sudo mkdir /extern/backup
myuser@atuin ~ $ sudo chmod g+w -R /extern/backup
myuser@atuin ~ $ sudo chown root.users -R /extern/backup
Der aktuelle User muss natürlich noch zur Gruppe der user hinzugefügt werden, damit die Zugriffsrechte greifen:
myuser@atuin ~ $ sudo adduser myuser users
DLNA/UPNP Server
Wir erlauben Streaming-Zugriff auf unseren Pi in der Nicht-Apple-Variante. Hierfür brauchen wir das entsprechende Serverpaket:
myuser@atuin ~ $ sudo apt-get install minidlna
und passen die zugehörige Konfigurationsdatei /etc/minidlna.conf an. Das dort vorgegebene Medien-Verzeichnis wird auskommentiert, wir setzen
# media_dir=/var/lib/minidlna
media_dir=A,/extern/share/Audio
media_dir=A,/extern/share/Playlists
media_dir=V,/extern/share/Video
media_dir=V,/extern/share/TV-Shows
media_dir=P,/extern/share/Pictures
und ändern noch die Werte
friendly_name=Streamer
inotify=yes
Nun können wir unsere Musiksammlung bequem per *rsync* von einem anderen Rechner auf unseren Pi synchronisieren, z.B. von einer iTunes-Sammlung:
rsync -rtv /Users/Ich/Music/iTunes/iTunes\ Music/ atuin:/extern/share/Audio/
Voraussetzung hierfür ist natürlich, dass der externe Rechner unseren Nameserver benutzt.
DAAP-Server
Das Protokoll ist wahrscheinlich besser bekannt als AirPlay. Wir installieren den Server:
myuser@atuin ~ $ sudo apt-get install forked-daapd
Nach der Vorarbeit durch den DLNA-Server reicht hier das Anpassen von 2 Zeilen in der /etc/forked-daapd.conf:
directories = { "/extern/share" }
nickname = Streamer
Um die Änderungen zu übernehmen, wird der Server neu gestartet:
myuser@atuin ~ $ sudo /etc/init.d/forked-daapd stop
myuser@atuin ~ $ sudo /etc/init.d/forked-daapd start
Samba-Server
Um als Linux-Rechner von Windows-Rechnern erkannt zu werden, benötigt es den Samba-Server. Der spricht das entsprechende Protokoll und kann Laufwerke, Drucker und dergleichen mehr im Netz zur Verfügung stellen. Vor der Benutzung liegt wie immer die Installation:
myuser@atuin ~ $ sudo apt-get install samba samba-common-bin
Danach erfolgt die Anpassung der Konfiguration /etc/samba/smb.conf.
Wir definieren unsere eigene Arbeitsgruppe Discworld, mappen unbekannte Benutzer auf guest und setzten im Allgemeinen die Sicherheit auf bekannte Benutzer:
...
workgroup = Discworld
...
map to guest = guest
...
security = user
...
Wir fügen am Ende der Konfigurationsdatei unsere eigenen freigegebenen Verzeichnisse an:
[Share]
create mask = 0770
directory mask = 0770
path = /extern/share
browseable = yes
writeable = yes
guest ok = yes
[Backup]
create mask = 0770
directory mask = 0770
path = /extern/backup
browseable = yes
writeable = yes
guest ok = yes
admin users = everyone
Da wir dir Zugriffssicherheit auf bekannte Benutzer gesetzt haben, fügen wir nun noch unseren bekannten Benutzer hinzu:
myuser@atuin ~ $ sudo smbpasswd -a myuser
New password: _
Nun können wir von einem anderen Rechner per Smb-Protokoll (also auch mit Hilfe der Windows-Netzwerkansicht) auf die freigegebenen Ordner zugreifen.
Fazit
Mit seinem minimalen Stromverbrauch ist der Pi die beste 24h-Servervariante für zu Hause. Und wenn er sowieso läuft, kann er auch gleich die Aufgaben eines kleinen NAS übernehmen und die Musikdaten zur Verfügung stellen. Für die Zukunft wäre vielleicht noch die Anbindung an ein Sonos-System zu überlegen.
Und hoffentlich hält die B+-Variante des Raspberry Pi länger als sein Vorgänger…