NFS

 

Linux-Dateisysteme im Netzwerk.

Installation: sudo apt-get install nfs-common nfs-kernel-server

NFS-Server

/etc/hosts

127.0.0.1       localhost
127.0.1.1       Arbeitszimmer.TuxNet    Arbeitszimmer
192.168.1.51    Laptop.TuxNet       Laptop

/etc/exports

# Der Ordner /exportdir wird mit den Schreibrechten (rw) synchron exportiert. 
# Der Rechner Laptop kann darauf zugreifen.
/exportdir Laptop(rw,sync)

# Der Ordner /exportdir wird mit den Schreibrechten (rw) synchron exportiert.
# Der Rechner Laptop kann darauf zugreifen.
# Es werden stets die Rechte des User mit der UID 1001 und der GID 100 vergeben.
/exportdir Laptop(rw,sync,all_squash,anonuid=1001,anongid=100,no_subtree_check)
Auf dem Rechner mit der IP 192.168.56.0 können über die Funktion crossmount auch Medien unter /media genutzt werden.
/media 192.168.56.0/24(rw,async,insecure,no_subtree_check,crossmnt)

Die IDs des Users und der Gruppe können mit dem Befehl id ermittelt werden.

Es können auch IP-Bereiche definiert werden. Siehe hierzu das Kapitel IP-Adressen.

Server neu starten

sudo /etc/init.d/nfs-kernel-server restart

exportierte Verzeichnisse kontrollieren
Die exportiereten Verzeichznisse können mit sudo exportfs oder showmount -e kontrolliert werden. Aktive Verbindungen zeigt showmount -a an.

NFS-Client

/etc/hosts

127.0.0.1       localhost
127.0.1.1       laptop.TuxNet       laptop
192.168.1.50    Arbeitszimmer.TuxNet    arbeitszimmer

/etc/fstab (Beispiele)

Arbeitszimmer:/home/petri/Documents /home/arbeitszimmer nfs user,noauto,rw 0 0
192.168.1.2:/data/ /mnt/nfs/data nfs _netdev,noauto,user 0 0

Erklärung der Mountparameter:

  • _netdev: das Dateisystem wird erst eingebunden, sobald eine Netzwerkverbindung steht
  • user: auch normale Benutzer können das Dateisystem einhängen
  • noauto: das Dateisystem wird nicht automatisch eingebunden (wichtig, da ansonsten der Rechner beim booten ewig hängt, sofern die NFS-Freigabe nicht vorhanden ist
  • rw: das Dateisystem wird schreibbar eingehängt

Die fstab mit mount -a neu einlesen.

Bei Systemen mit systemd müssen die Einträge der fstab wie im entsprechenden Artikel beschrieben angepasst werden.

Unter Xfce werden die Freigaben bim Login automatisch eingebunden, wenn folgende Datei erstellt wird:
~/.config/autostart/mountnfs.desktop

[Desktop Entry]
Encoding=UTF-8
Name=NFS-Laufwerk einbinden
Exec=mount /mount-pfad-aus-fstab
Terminal=false

Anzeige der gemounteten Freigaben
showmount

NFS von Hand starten

Vorraussetzungen bei NFS von Hand: Die Datei /etc/exports wurde bereits editiert und die zu exportierenden Verzeichnisse freigegeben.

Portmapper starten /etc/init.d/portmap start

Nun den Mount-Daemon starten. Nun werden die exportierten Verzeichnisse („shares“) für die anderen sichtbar. rpc.mountd

Starten des NFS-Daemon für den eigentlichen Filezugriff rpc.nfsd

Mit rpcinfo kann jederzeit die Verfügbarkeit der NFS-Dienste überprüft werden:  rpcinfo -p server

NFS in einem Script mounten

Soll eine NFS-Freigabe in einem Script gemountet werden so hilft folgendes Script. Hierbei wird das Script nur fortgeführt, sofern die Einbindung erfolgreich war. Weiterhin bleibt dieses Script auch nicht ewig hängen, wenn die Freigabe nicht zur Verfügung steht. Es wird bei diesem Script davon ausgegangen, dass die Freigabe in der fstab (siehe oben) eingetragen ist.

#! /bin/bash
IP=192.168.1.
mountpoint[1]=/mnt/server/folder1
mountpoint[2]=/mnt/server/folder2
mountpoint[3]=/mnt/server/folder3

echo -n "Netzwerk suchen "
for ((i=1; i<=120; i++)) {
 [ $(ifconfig | grep -c $IP) -gt 0 ] && break
 echo -n "." 
 sleep 0.5 
}
echo
if [ $i -eq 121 ] ; then 
 echo "Netzwerk konnte nicht gefunden werden, Programm wird beendet."
 exit
fi

i=1
while [ "${mountpoint[i]}" != "" ] ; do
echo "Verzeichnis ${mountpoint[i]} wird eingebunden ..."
mount "${mountpoint[i]}" 2> /dev/null &
echo -n "Warte, bis Verzeichnis eingebunden ist "
for ((j=1; j<=200; j++)) {
 [ `mount | grep -c "${mountpoint[i]}"` -eq 1 ] && break
 echo -n "."
 sleep 0.1
}
echo
if [ $j -eq 201 ] ; then 
 echo "Verzeichnis konnte nicht eingebunden werden, Programm wird beendet."
 kill -9 `ps aux | grep "mount ${mountpoint[i]}" | awk '{print $2}'`
 exit
fi
let i++
done

NFS-Laufwerke vor dem Standbybetrieb (Suspend, Hibernate) ausbinden

Siehe auch: http://wiki.ubuntuusers.de/pm-utils

Unter Ubuntu werden die Skripte unter /etc/pm/sleep.d (so genannte Hooks) vor und nach dem Standby ausgeführt. (Achtung: Die Skripte müssen dem user root gehörten, sonst werden sie nicht ausgeführt!)
Hier ein Beispiel für das automatische mounten und unmounten von NFS-Laufwerken:

#!/bin/bash
logfile=/tmp/hook_nfsmount.txt
mountscript=/home/user/bin/mountnfs-datenserver
case "$1" in
  hibernate|suspend)
    echo `date +"%Y-%m-%d %k:%M"` "$1 - try unmount:" >> $logfile
    mount | cut -d" " -f3,5 | grep " nfs" | cut -d" " -f1 >> $logfile
    umount $(mount | cut -d" " -f3,5 | grep " nfs" | cut -d" " -f1) 
    echo `date +"%Y-%m-%d %k:%M"` "$1 - check unmount:" >> $logfile
    mount | cut -d" " -f3,5 | grep " nfs" | cut -d" " -f1 >> $logfile
    ;;
  thaw|resume) 
    echo `date +"%Y-%m-%d %k:%M"` "$1 - run $mountscript" >> $logfile
    "$mountscript" | xargs &
    ;;
  *)
    ;;
esac
exit $?

Hierbei wird das Einbinden der Laufwerke über das separate Skript „mountnfs“ ausgeführt. Dies hat folgende Vorteile:

  • Wenn die NFS-Laufwerke nicht verfügbar sind, bleibt das hook-Skript sonst an dieser Stelle hängen und das „Aufwachen“ bleibt ebenfalls hängen.
  • Der Networkmanager von Ubuntu startet die Netzwerkverbindung erst nach Abarbeiten dieser Skripte.
  • Getrennt werden prinzipiell alle NFS-Laufwerke (auch von Hand eingebundene), neu gemountet werden jedoch nur die notwendigen Standard-Laufwerke aus den Skript mountnfs. Somit reicht ein zentrales Skript in dem die NFS-Laufwerke eingetragen werden.

Das Skript mountnfs muss selber erstellt werden (siehe Beispiel oben).