Raspberry Pi als Server

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.

raspberry_config

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…

Advertisements
Dieser Beitrag wurde unter Bash, Hardware, RaspberryPi abgelegt und mit , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s