File-Server einrichten (Samba)

Mit einem File-Server (oder auch Datei-Server) werden Dateien an einem zentralen Ort im Netzwerk bereitgestellt anstatt auf dem eigenem PC. Dies hat den Vorteil das andere Benutzer (mit Berechtigung) auf diese jederzeit zugreifen können (auch wenn der eigenen PC offline ist). Da die Daten zentral einmalig vorliegen ist auch ein Backup sehr einfach.

Ich benötige einen File-Server um Dateien zentral zu speichern die ich nicht oft benötige und die sich in der Regel nie ändern (z.b. Installer von Programmen oder fertige Versionen von Produkten). Hier verzichte ich bewusst auf eine Synchronisationsfunktion um Ressourcen zu schonen.

Dieser Artikel ist Bestandteil der Artikelserie "Home Server mit dem Raspberry Pi". Zum Inhaltsverzeichnis gelangt ihr hier.

Anforderung

Der zukünftige File-Server soll bequem von meinem Windows PC, aus dem Explorer, erreichbar sein und als virtuelles Netzlaufwerk eingebunden werden.

Es wird mehrere Netzlaufwerke geben die sich physikalisch alle auf der USB Platte befinden. Drei Netzlaufwerke sollen es werden. Je ein Netzlaufwerk für private Dinge und für geschäftliches (Ordnung ist das halbe Leben).
Das dritte Laufwerk ist für den Admin welcher Zugriff auf das Root-Verzeichnis des Laufwerks erhalten soll und damit indirekt Zugriff auf oben genannte hat (zusätzlich auch auf Programmdateien die neben dem FileServer auf der USB-Platte gespeichert werden).

Auf das Root-Laufwerk soll nur der Admin Zugriff haben. Die anderen beiden Laufwerke sollen auch mit unterschiedlichen Passwörtern geschützt werden.

Vorbereitung

Bevor wir mit Samba loslegen benötigen wir eine formatierte USB-Festplatte (Anleitung zur Formatierung). Auf dieser können wir bereits die fertige Ordnerstruktur erstellen (dies erleichtert eventuelle Fehlersuche).

Mein FileServer wird zwischen privaten (family) und geschäftlichen (rollnut) getrennt. Die Daten liegen zwar alle auf demselben Datenträger aber mit der passenden Rechtesteuerung lässt sich eine Trennung dennoch realisieren. Empfehlenswert ist es im Root-Verzeichnis der Festplatte den Ordner fileserver anzulegen (falls die Festplatte weitere Aufgaben erledigt). Folgend habe ich meinen Verzeichnisbaum aufgebaut:

fileserver
➥family (Lesen+Schreiben nur für Gruppe family)
...➥images
...➥music
➥rollnut (Lesen+Schreiben nur für Gruppe rollnut)
...➥releases (Schreibrechte nur für Benutzer/Gruppe admin)
...➥software

Es empfiehlt sich in jedem Unterverzeichnis eine neue Textdatei mit beliebigem Inhalt anzulegen. Damit könnt Ihr später Lese- und Schreibrechte testen.

Spätestens jetzt muss die Platte an eurem Pi angesteckt sein. Wie man eine Festplatte über Mounting einbindet hatte ich bereits erklärt: Mounting

Optional: Benutzerrechte

Wenn Ihr kein NTFS sondern ext4 als Format gewählt habt könnt Ihr geschickt mit Linux-Benutzerrechten die Zugriffe auf euren FileServer steuern (Linux-Benutzerrechte werden von NFTS nicht untersützt, daher können Anwender von NTFS direkt zum Absatz Samba springen). Folgend eine Anleitung wie ich meine Ordner konfiguriert habe:

Wechselt in das Verzeichnis fileserver:

cd /media/pidisk1/fileserver

Meine Ordner family und rollnut dürfen nur verwendet werden wenn man der passenden Benutzergruppe angehört. Mit folgenden Befehlen könnt Ihr die Ordner anlegen und passende Rechte vergeben (ersetzt [dir] mit dem passenden Verzeichnisnamen und [group] mit der passenden Benutzergruppe, bitte auch die eckigen Klammern entfernen):

sudo mkdir [dir]
sudo chown :[group] [dir]
sudo chmod 771 [dir]
sudo chmod g+s [dir]
sudo setfacl -Rdm g:[group]:rwx [dir]

Ich erkläre nun kurz was oben geschieht.

  • Zuerst wird das neue Verzeichnis erstellt
  • Anschließend wird die Gruppe des Verzeichnis geändert (der Owner ist egal)
  • Danach werden die Rechte gesetzt. Ich habe mich dafür entschieden das der Owner und jeder Benutzer der Gruppe Vollzugriff hat.
  • Mit g+s wird jede neu erstellte Datei unterhalb dieses Ordners die Gruppe von [group] erhalten. Damit möchte ich gewährleisten das alle Dateien jedem Gruppenmitglied zur Verfügung stehen.
  • Die Aufgabe des letzten Commands ist ähnlich zu dem vorherigen, nur das diesmal die Dateirechte vererbt werden.

Der Ordner "rollnut->releases" ist nun ein Spezialfall. Ich möchte das jeder Benutzer der Gruppe rollnut den Inhalt lesen darf. Aber nur ich soll Schreibrechte erhalten. Dies habe ich folgend gelöst:

cd rollnut
sudo mkdir releases
sudo chown [username] releases
sudo chmod 751 releases
sudo setfacl -Rdm g:rollnut:rx releases

Zuerst ändere ich den Owner von dem Ordner releases. Anschließend entziehe ich der Guppe rollnut die Schreibrechte (der Befehl unterscheidet sich nur darin das das w bei rwx fehlt).

Übrigens, wenn Ihr die Konfiguration von ACL sehen möchtet könnt Ihr dies mit diesem Kommando machen:

getfacl [dir]

Samba

SambaTeaser

Mit dem Programm Samba werden alle Anforderungen an den File-Server erfüllt. Samba bringt meinem Raspberry das SMB-Protokoll bei, womit es mit Windows im Netzwerk kompatibel wird.

Samba installieren

Mit folgendem Befehl wird es installiert:

sudo apt-get install samba samba-common-bin

Wenn Ihr Samba anschließend neu startet wird das Raspberry sogar schon im Windows Explorer gefunden (in der Netzwerk-Kategorie). Allerdings ohne Ordnerfreigaben.

sudo /etc/init.d/samba restart

oder 

sudo service nmbd restart
sudo service smbd restart

Samba ist bereits vorkonfiguriert (unter /etc/samba/smb.conf). In der Config stehen sehr viele Zeilen und auch Kommentare als Hinweis was alles möglich ist. Im Praxis-Einsatz empfinde ich diese Datei allerdings als sehr unübersichtlich. Deswegen erstelle ich davon eine Sicherheitskopie und erzeuge eine Neue die noch leer ist und anschließend von mir beschrieben wird (die Kopie dient lediglich als Nachschlagewerk).

// Rename the existing file.
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.bak

// Create a new empty samba config file.
sudo touch /etc/samba/smb.conf

Samba einrichten - ext4

Samba kann wunderbar mit ext4 formatierten Datenträgern umgehen. Um Samba zu konfigurieren muss die smb.conf Datei mit einem Text-Editor geöffnet werden. Ich verwende dafür Nano:

sudo nano /etc/samba/smb.conf

Nun wird folgender Text eingefügt:

[global]
security = user
encrypt passwords = yes

[Root]
comment = root of external pidisk1 drive
path = /media/pidisk1
read only = no
valid users = [adminuser]
force user = root
force group = root

[Family]
comment = files to share with family
path = /media/pidisk1/fileserver/family
read only = no

[RollNut]
comment = contains business related files
path = /media/pidisk1/fileserver/rollnut
read only = no

Bitte ersetzt [adminuser] mit einem Benutzer welcher, mit Root-Rechten, Zugriff auf die komplette Festplatte erhalten soll. Folgend eine Erklärung der einzelnen Punkte:

[global]: Allgemeine Konfiguration von Samba
security: Setzt die Art der Anmeldung fest
encrypt passwords: Verschlüsselt euer Passwort. Es macht immer Sinn yes zu verwenden außer ihr habt noch Windows 95 im Einsatz.

[Root], [Family], [RollNut]: Der Name unter welcher eure Netzwerkfreigabe später zu finden ist.
comment: Eine Beschreibung der betroffenen Freigabe (kann in Windows als Tooltip gelesen werden).
path: Der physikalische Pfad zum Ordner welcher Freigegeben wird.
read only: Nur Leserechte oder auch Schreib-/Löschrechte.
valid users: Nur bestimmte User dürfen sich an diesem Laufwerk anmelden.
force user/force group: Das Laufwerk Root gibt Zugriff auf die komplette Festplatte. Da neben dem FileServer auch mySQL und anderen Programmdaten liegen werden (welche spezielle Benutzerrechte haben) wird Samba als Benutzer root auf diese zugreifen (die Logindaten werden ignoriert). Wenn eine Datei angelegt wird, wird dessen Owner root sein.

Im Anschluss kann die Datei smb.conf mit folgenden Befehl auf Validität geprüft werden.

testparm

Samba Benutzer anlegen

Nun müsst Ihr noch einen Linux-Benutzer mit einem Samba-Passwort ausstatten. Ohne diesem Schritt kann Samba nicht verwendet werden da es keinen Standardbenutzer für Samba gibt. Wenn ein Windows-Teilnehmer sich mit diesem Benutzer über Samba anmeldet wird Samba mit dessen Rechten auf Dateien zugreifen (das Root-Laufwerk ist hier eine Ausnahme).
Hinweis: Hat euer Linux-User bereits ein Passwort, kann es empfehlenswert sein dasselbe Passwort auch in Samba wieder zu verwenden.

sudo smbpasswd -a [username]

Das -a bedeutet das der User in Samba nach dem anlegen direkt aktiviert wird.

Alternativ: Samba einrichten - NTFS

Wie schon mehrfach angesprochen funktionieren Linux-Benutzerrechte auf NTFS-Geräten nicht. Um einen vergleichbaren Effekt zu haben kann man dennoch folgende Lösung anwenden:

Öffnet die Samba-Config.

sudo nano /etc/samba/smb.conf

Als Inhalt fügt folgenden Text ein:

[global]
security = user
encrypt passwords = yes

[Root]
comment = root of external pidisk1 drive
path = /media/pidisk1
read only = no
valid users = smb-pi

[Private]
comment = files to share with family
path = /media/pidisk1/fileserver/private
read only = no
valid users = smb-pi,smb-private

[RollNut]
comment = contains business related files
path = /media/pidisk1/fileserver/rollnut
read only = no
valid users = smb-pi,smb-rollnut

Der Unterschied zu der Konfig von ext4 ist das valid users bei jedem Laufwerk verwendet wird.

Samba Benutzer anlegen

Zugriffsrechte auf Samba-Laufwerke erfolgen mittels speziellen Samba-Usern. Samba-User können mit smbpasswd angelegt werden, allerdings nur wenn bereits ein Linux-User mit demselben Namen besteht (Samba-User werden nicht automatisch erstellt!).

In meinem Fall möchte ich allerdings eher Samba-Gruppen anstatt User. Daher muss ich 'dummy'-User in Linux anlegen damit ich diese in Samba verwenden kann.

sudo  adduser --no-create-home --disabled-login --shell /bin/false <username>

Das obere Kommando erstellt einen Linux-User der sich nicht einloggen kann, kein Home-Verzeichnis besitzt und sonst nix darf (außer eben als Samba-User zu fungieren).

Da ich drei Samba-User benötige erzeuge ich diese nun, smb-pi, smb-family und smb-rollnut. Anlegen kann man diese ganz einfach mit folgenden Kommando:

sudo smbpasswd -a smb-rollnut

Das -a bedeutet das der User in Samba nach dem anlegen direkt aktiviert wird.

Tipps & Tricks

Netzwerk-Cache löschen (Windows)

Wenn im Windows Client bereits erfolgreich eine SMB-Verbindung zum Raspberry aufgebaut wurde, sich das Passwort aber später ändert, hat Windows ein Problem (zumindest bei mir). Windows speichert Netzwerkpasswörter (anscheinend auch wenn der Hacken nicht aktiv war) und macht eine erneute Verbindung mit einem anderen Passwort unmöglich.

Bei mir hat es funktioniert in der Windows-Kommandozeile folgenden Befehl zu feuern (der Stern bedeutet das alle gespeicherten Verbindungen gelöscht werden):

net use * /DELETE

Mit folgendem Tool kann man bestehende Netz-Passwörter auslesen sollte mal eines verlegt worden sein nirsoft.net/utils/network_password_recovery.html.

Remote Differential Compression (RDC)

Bei meiner Recherche hatte ich ab und zu den Hinweis gelesen das RDC (ab Windows 7 enthalten) zu Problemen mit Samba führen kann, was sich dadurch äußert das ein einfacher Kopiervorgang ungewöhnlich lange dauert.

Sollte dies der Fall sein kann testweise der Hacken bei RDC deaktiviert werden:
"Programme -> Windows Features aktivieren/deaktivieren -> Remote Differential Compression API Support"

Weiter geht's ...

Die Artikelserie „Home Server mit dem Raspberry Pi“ geht jetzt mit dem Thema File-Server mit Seafile weiter.