14. NFS - Network File System
=============================
|
| next | back | 14. NFS | WS 2013/14 - 1 |
1. RPC - Remote Procedure Call
Protokoll der Kommunikationssteuerungsschicht speziell
für NFS entwickelt, wird aber auch von anderen Systemen
benutzt, z.B. NIS.
Standard: RFC 1050
Funktionsprinzip:
Rechner A Rechner B
Client Server
| :
| :
Client | RPC-Aufruf : Server wartet
arbeitet +---------------------->+
: Nachricht | Server startet
: +-->+ Prozeduraufruf
Client : : | Server arbeitet
wartet : : | Prozedur ab
: |<--+ Prozedure-Rückkehr
: RPC-Rückgabe- | Aufruf beenden
+<----------------------+
Client | Nachricht : Server wartet
arbeitet | :
Identifizierung:
Programmnummer
Versionsnummer
Transportprotokoll
Prozedurnummer
z.B.: NIS ypserv
100004, 1 oder 2, udp oder tcp
|
| next | back | 14. NFS | WS 2013/14 - 2 |
2. Portmapper
dient zur dynamischen Zuordnung von Programmnummern von
RPC-Programmen und Ports, d.h. muß vor den Servern gestartet
werden, die RPC benutzen (NIS,NFS)
Programme:
portmap - SUNOS, DEC-UNIX, HP-UX, LINUX,...
portmap [-d] [-v]
rpcbind - Solaris
rpcbind [-d] [-w]
Optionen:
-v verbose
-d debug
-w warm-start
Datenfile:
/etc/rpc
#
# rpc
#
rpcbind 100000 portmap sunrpc rpcbind
rstatd 100001 rstat rup perfmeter
rusersd 100002 rusers
nfs 100003 nfsprog
ypserv 100004 ypprog
mountd 100005 mount showmount
ypbind 100007
walld 100008 rwall shutdown
yppasswdd 100009 yppasswd
etherstatd 100010 etherstat
rquotad 100011 rquotaprog quota rquota
sprayd 100012 spray
|
| next | back | 14. NFS | WS 2013/14 - 3 |
3. Sicherheit
1. NIS
neuere NIS-Server haben eigenes Sicherheitsfile
Informationen werden nur an Netze bzw. Hosts gegeben,
die im Sicherheitsfile spezifiziert sind.
/var/yp/securenets
<Netzwerkmaske> <Netzwerkadresse>
z.B.:
255.255.0.0 141.20.0.0
255.255.255.0 141.21.10.0
255.255.255.255 141.11.5.6
2. Sicherheitsportmapper
Alte Portmapper haben auf alle Anfragen reagiert.
Dadurch leichte Einbrüche.
Neue Portmapper benutzen tcpd_library.
Zugriffsberechtigung wird in zwei Files beschrieben:
erlaubte Zugriffe in:
/etc/hosts.allow
<deamon-name>:<host-list> | <network-list>
z.B.:
portmap: 141.20.20.0/255.255.255.0
portmap: 141.20.21.0/255.255.255.0
....
portmap: 141.20.36.0/255.255.255.0
portmap: 141.20.39.0/255.255.255.0
ALL: LOCAL .informatik.hu-berlin.de
|
| next | back | 14. NFS | WS 2013/14 - 4 |
verbotene Zugriffe in:
/etc/hosts.deny
<daemon-name>: <host-liste> : <action>
z.B.:
portmap: ALL :( /usr/etc/safe_finger -l @%h |\
/usr/ucb/mail -s "bellus-%d-%h-%a" bell ) &
ALL: ALL: (/usr/etc/safe_finger -l @%h |\
/usr/ucb/mail -s "bellus-%d-%h-%a" bell) &
%d - Daemon-Name
%h(%H) - Client(Server)-Name(Adresse)
%a(%A) - Client(Server)-Adresse
Achtung!!!!
Portmapper niemals mit kill -9 beenden.
Vorher aktuellen Inhalt retten!!
BSD:
pmap_dump >ports.save
kill
portmap
pmap_set <ports.save
Solaris:
kill SIGHUP <rpcbind> # erzeugt /tmp/portmap.file, /tmp/rpcbind.file
rpcbind -w # restart
Abfragen des Portmappers: rpcinfo
rpcinfo rpcinfo -p [ host ] - akuelle Programme
rpcinfo [ -n portnum ] -u host program [ version ]
- Aufruf der Procdure 0 (UDP)
rpcinfo [ -n portnum ] -t host program [ version ]
- Aufruf Procdure 0 (TCP)
rpcinfo -b program version - broadcast für alle Hosts
rpcinfo -d program version - steichen eines Programms, lokal
|
| next | back | 14. NFS | WS 2013/14 - 5 |
4. NFS
Ziel: Der Nutzer soll keinen Unterschied zwischen lokalen
und entfernten Filesystemen sehen.
Ablauf des Zugriffs (mount,read,write)
Client Server
mount -----------> mountd
<-----------
open -----------> nfsd
| <-----------
|
v Filehandle
read -> biod -----------> nfsd
<----------
oder
write -> biod -----------> nfsd
<----------
File-Locking
rpc.lockd <----------> rpc.lockd
|
V
rpc.statd <----------> rpc.statd
NFS: mountd: rpc: 10005 , Version: 1,2,3, Prot: UDP, TCP
nfsd: rpc: 10003, Version: 1,2,3,4 Prot: UDP, TCP
NFS Version 4 nur TCP und immer Port 2049 (Firewall fähig)
|
| next | back | 14. NFS | WS 2013/14 - 6 |
5. NFS-Server
Mount-Daemon
Mount-Daemon ist ein RPC-Server, der NFS-Requests eines
Clienten an einen NFS-Server bearbeitet. Er prüft
die Zulässigkeit der Mount-Forderung an Hand entsprechender
Files: /etc/exports oder /etc/dfs/sharetab
Ist die Operation zulässig, wird eine entsprechende
Verbindung hergestellt, sonst abgewiesen
Kommando: mountd [-v] [-r]
-v - verbose
-r - Mount-Daemon für weitere mounts
sperren
nfsd -Daemon
Dient zur Realisierung der verschiedenen Filezugriffe
eines Clienten auf dem NFS-Server. Pro Zugriffsaktion
wird eine Instanz von nfsd benötigt.
Kommando: nfsd <Zahl der Instanzen>
Die Zahl der Instanzen wird durch die Zahl der Interface
und deren Geschwindigkeit bestimmt.
1 10 MBit/s-Interface - nfsd 8
1 100 MBit/s-Interface - nfsd 16
z.B.: fob (4 100 MBit-Interface) - nfsd 64
|
| next | back | 14. NFS | WS 2013/14 - 7 |
Files:
/etc/exports (BSD)
Eintrag: <directory> -<option>[,<option>] ...
option> - ro - nur zum Lesen exportieren
rw=host[:host].. - exportieren
zum Lesen und Schreiben an die
angegebenen Hosts
anon=<UID> - unbekannte Nutzer werden
als <UID> abgebildet
root=host[:host]... - root-Zugriff für
angegebene Hosts
access=client[:client]... - Mount Zugriff
für angegebene Clienten.
Client: Host oder Netzgruppe
default: alle
Beispiele:
/usr -access=clients
# export to my clients
/usr/local
# export to the world
/usr2 -access=hermes:zip:tutorial
# export to only these machines
/usr/sun -root=hermes:zip
# give root access only to these
/usr/new -anon=0
# give all machines root access
/usr/bin -ro
# export read-only to everyone
/usr/stuff -access=zip,anon=-3,ro
# several options on one line
|
| next | back | 14. NFS | WS 2013/14 - 8 |
Wird /etc/exports nach dem Start von mountd geändert, so
muß das Kommando "exportfs -a" abgesetzt werden.
"exportfs" liefert eine Liste der momenetan exportierten
Direcories.
/etc/dfs/dfstab (Solaris) Quelle für /etc/dfs/sharetab
Umwandlung erfolgt durch das Kommando "shareall"
Das File enthält eine Reihe von "share"-Kommandos.
share [ -F <FSType> ] [ -o <option>[,<option>... ]
[ -d <description> ] [ <pathname> ]
FSType - nfs
options - rw - Lesen und Schreiben für alle
rw=client[:client]....
Lesen und Schreiben für Clienten,
sonst niemand
ro - Lesen für alle
ro=client[:client]....
Lesen für Clienten, sonst niemand
root=client[:client]...
Rootzugriff für Clienten
anon=<UID>
UID für Unbekannte
Beispiel:
share -F nfs -o ro /export/exec/Solaris_2.6_sparc.all/usr
share -F nfs -o ro=allfb /opt/SUNWspro
share -F nfs -o rw=allfb -d "" /usr/local
share -F nfs -o ro,anon=0 /opt/Install
share -F nfs -o ro,anon=0 /cdrom/patches_3_0_7_d1
share -F nfs -o rw=star,root=star /export/root/star
share -F nfs -o ro /usr
|
| next | back | 14. NFS | WS 2013/14 - 9 |
Solaris: ZFS
/etc/dfs/dfstab nicht mehr notwendig, aber möglich.
NFS-Export wird über Properties von ZFS für das jeweilige Filesystem
aktiviert.
zfs set sharenfs= on|off|<Option-List> <Filesystem>
on - export an alle
off - keins export
<Option-List> := <Option> [,<Option-List> ]
<Option> := <Recht>=<Hostspezifikation>
<Recht> := rw | ro | root
<Hostspezifikation>:=<Hostname>[:<Hostspezifikation>] |
<Netzgruppe>[:<Hostspezifikation>]
Beispiele:
zfs set sharenfs=rw=allfb DATEN/data-lst1
zfs set sharenfs=rw=allfb DATEN/data-lst1
zfs set sharenfs=root=bellus:master,rw=allfb DATEN/data-lst1
zfs set sharenfs=rw=hpetri:hpetriq:bellus:bellus1 DATEN/li
Kommandos:
zfs share -a|<Filesystem>
zfs unshare -a|<Filesystem>
|
| next | back | 14. NFS | WS 2013/14 - 10 |
6. NFS-Clients
Mittels normalem "mount" wird die Verbindung zum Server
hergestellt. Spezielle Optionen für NFS!!!
mount -t nfs -o <option>[,<option>...] <host>:<r-dir> <l-dir>
Optionen für mount auf der Client-Seite:
rw/ro - gewünschte Zugriffsrechte
bg - mount-Operation im Hintergrund ausführen
rsize=<nn> - Blocklänge lesen
wsize=<nn> - Blocklänge schreiben
timeo=<n> - Timeount in Sekunden
retrans=<n>- Zahl der Wiederholungen - transport
retry=<n> - Zahl der Wiederholungen
port=<n> - Port-nummer
vers=<n> - NFS-Version
soft - Soft-Mounten
hard - Hard-Mounten
intr - Übertragung unterbrechbar
biod - Daemon für asynchrone Block I/O bei NFS.
dient der Beschleunigung der NFS-Zugriffe
biod <Anzahl der Daemonen>
Anzahl der Daemonen - siehe nfsd (8..16)
|
| next | back | 14. NFS | WS 2013/14 - 11 |
7. Locking
Über NFS ist auch ein File-Locking möglich.
Dazu werden auf der Serverseite und auf der Client-
seite jeweils eins Lock-Daemon (rpc.lockd) und ein
Status-Daemon (rpc.statd) benötigt.
Wirkungsweise:
lock (client) --> rpc.lockd (client)
rpc.lockd(client) --> rpc.lockd(server)
rpc.lockd(server) --> rpc.statd(server)
Eintrag in /etc/sm (host)
Eintrag in /etc/sm.bak (host+lock)
rpc.statd(server) <--> rpc.statd(client)
Solaris: /var/statmon/sm und /var/statmon/sm.bak
Error-Recovery bei einem Crash
Server rpc.statd kontaktiert die rpc.statd der Clienten
entsprechend den Eintragungen in /etc/sm.bak
Maßnahmen bei Fehler: rpc.statd cannot talk to statd at xxxx
ps -aux
kill -9 <rpc.statd>
rm /etc/sm.bak/*
rpc.statd
|
| next | back | 14. NFS | WS 2013/14 - 12 |
8. Automounter
Automounter dient zum automatischen mounten über NFS
bei Bedarf. Das entlastet wesentlich das Netz und die
Server, da nicht ständig alles gemountet sein muß.
Der Automounter wird über Maps gesteuert:
indirekte Maps: Alle gemounteten Filesysteme werden in
in einem Directory untergebracht. Die
zu mountenden Filesysteme sind nicht
sichtbar, wenn sie nicht gemountet sind
Beispiel:
fob-vol1 -rw,soft fob:/export/volume1
fob-vol2 -rw,soft fob:/export/volume2
fob-vol3 -rw,soft fob:/export/volume3
fob-vol4 -rw,soft fob:/export/volume4
fob-vol5 -rw,soft fob:/export/volume5
direkte Maps: Die gemounteten Filesysteme werden einzeln
in den Directory-Baum eingehängt. Sie
sind immer sichtbar.
Beispiel:
/usr/local -rw,soft knecht:/usr/local
/opt/SUNWspro -rw,soft knecht:/opt/SUNWspro
/cdrom -ro,soft knecht:/mnt/cdrom
Der Automounter kann über die Kommandozeile oder über die
Mastermap gesteuert werden. Wird der Name einer Map ohne
führenden "/" angegeben, wird die Map über das NIS/LDAP geladen.
|
| next | back | 14. NFS | WS 2013/14 - 13 |
Master-Map:
<Mount-directory> <indirect Map> <Mount-Optionen>
/- <direct Map> <Mount-Optionen>
automount [-mnTv] [-D name=value] [-f master-file]
[-M mount-directory] [-tl duration] [-tm interval]
[-tw interval] [directory map [-mount-options]] ...
Defaults:
/etc/auto.master
/etc/auto.home
Beispiele:
automount /vol auto.home # indirekt
automount /- /etc/auto.home # direkt
Um eine einfache Verwaltung der Maps zu erreichen, sollte auf
jeden Fall NIS oder LDAP für die Verwaltung der Maps eingesetzt werden.
Anzeigen der mit NIS verwalteteten Maps:
ypcat -k auto.home
ypcat -k auto.master
ldapcat auto.home # nur bei Informatik
ldapcat auto.master #
|
| next | back | 14. NFS | WS 2013/14 - 14 |
9. Starten von NFS-Server, NFS-Clienten und Automounter
Linux
NFS-Server:
/etc/init.d/nfsserver
/etc/sysconfig/autofs
/etc/sysconfig/nfs
/etc/exports
/etc/autofs_ldap_aut.conf (wenn LDAP benutzt)
NFS-Client:
/etc/init.d/nfs
/etc/sysconfig/nfs
Automounter:
/etc/init.d/autofs
/etc/sysconfig/autofs
/etc/autofs_ldap_aut.conf (wenn LDAP benutzt)
/etc/auto.master
/etc/auto.home
|
| next | back | 14. NFS | WS 2013/14 - 15 |
Solaris bis 2.9
/etc/init.d/nfs.server
/etc/dfs/dfstab
/etc/init.d/nfs.client
/etc/init.d/autofs
/etc/auto_master
/etc/auto_home
Solaris ab 2.10
UFS
/etc/dfs/dfstab
/etc/default/nfs
/etc/auto_master
/etc/auto_home
svcadm enable svc:/network/nfs/server:default
svcadm enable svc:/network/nfs/client:default
svcadm enable svc:/system/filesystem/autofs:default
ZFS
zfs set sharenfs="rw=host1:host2:netzgruppe" DATEN/export
|
| next | back | 14. NFS | WS 2013/14 - 16 |
10. Fehlersuche
rpcinfo - siehe oben
showmount - Anzeigen von gemounteten Filesystemen
/usr/sbin/showmount [-adehv] [--all] [--directories]
[--exports] [--help] [--version] [host]
-a or --all Ausgabe von Host und Directoy
-d or --directories Ausgabe von Directory
-e or --exports Ausgabe der Export-Liste
-h or --help Hilfe
-v or --version Version
nfsstat - Anzeigen des Zustands von NFS (Server und Client)
/usr/sbin/nfsstat [-anrcsz] [-o facility] ... (Linux)
-s Server
-c Client
-n Statistik
-r RPC-Statistik
-z setze Kernelstatistik auf 0
-o facility Ausgabe von speziellen Statistiken
nfs, rpc, net, fh, rc (nicht bei Solaris)
netstat - Anzeigen des Zustands der Interfacekarten
Optionen (Linux):
-i Statistik der Interfacekarten
-r Routen anzeigen
-n keine Übersetzung der IP-Adressen in Namen
-a alles
-t aktive TCP-Verbindungen (Solaris: -P tcp)
-u aktive UDP-Verbindungen (Solaris: -P udp)
|
| next | back | 14. NFS | WS 2013/14 - 17 |
Firewall
Die notwendigen Ports können durch Firewall gesperrt sein.
Bis NFS 3 werden die Ports dynamisch verteilt, d.h. sie stehen
erst nach dem Starten des NFS-Servers fest und müssen dann im
Firewall für die entsprechenden Clienten frei geschaltet werden.
Ab NFS 4 erfolgt der Austausch nicht mehr über RPC sondern über
den festen Port 2049 (nfsd)!!
Solaris:
rpcinfo -p
# interessante Ports: rpcbind, status, nlockmgr rstatd,
# rquotad, nfs, mountd
ipfstat -i | egrep "rpc|nfs"
Linux:
rpcinfo -p
# interessante Ports: portmapper, mountd, status, nfs, nlockmgr
iptables -L -n | egrep "111|2049"
|
| back | 14. NFS | WS 2013/14 - 18 |