Einrichten eines NFS-Servers und -Clients unter Debian 9 (Stretch)
Dieses Handbuch erklärt, wie man unter Debian 9 einen NFS-Server und einen NFS-Client einrichtet. NFS steht für Network File System; über NFS kann ein Client auf eine entfernte Freigabe auf einem NFS-Server zugreifen (lesen, schreiben), als wäre sie auf der lokalen Festplatte. In diesem Tutorial zeige ich Ihnen zwei verschiedene NFS-Exporte, den Export eines Client-Verzeichnisses, das Dateien als Benutzer nobody/nogroup speichert, ohne Dateisystemberechtigungen zu erhalten, und einen Export des Verzeichnisses /var/wwww, das Berechtigungen und das Eigentum an Dateien bewahrt, wie es bei einem Hosting-Server-Setup erforderlich ist.
1 Vorbemerkung
Ich benutze hier zwei Debian Wheezy-Systeme:
- NFS-Server: server.example.com, IP-Adresse: 192.168.1.100
- NFS-Client: client.example.com, IP-Adresse: 192.168.1.101
2 Installation von NFS
Stellen Sie sicher, dass der Server auf dem neuesten Stand ist, indem Sie die Paketlisten aktualisieren und ausstehende Updates auf beiden Servern installieren.
apt-get update
apt-get upgrade
Fahren Sie dann mit der Installation des NFS-Servers und des Clients fort.
Server:
Auf dem NFS-Server, den wir betreiben:
apt-get install nfs-kernel-server nfs-common
Dann erstellen wir die Systemstartup-Links für den NFS-Server und starten ihn:
Kunde:
Auf dem Client können wir NFS wie folgt installieren (dies ist eigentlich dasselbe wie auf dem Server):
apt-get install nfs-common
3 Verzeichnisse auf dem Server exportieren
Server:
Ich möchte die Verzeichnisse /home/client1 und /var/wwww für den Client zugänglich machen, um die beiden verschiedenen Zugriffsarten des NFS-Servers anzuzeigen. Das Verzeichnis /home/client1 ist im Standardmodus freigegeben, so dass alle in dieses Verzeichnis geschriebenen Dateien als user nobody und group nogroup gespeichert werden. Für das Verzeichnis /var/www verwende ich die Option no_root_squash, die den NFS-Server anweist, die Berechtigungen und das Eigentum an den Dateien zu erhalten. Dies ist z.B. erforderlich, wenn Sie das Verzeichnis /var/wwww eines mit ISPConfig 3 verwalteten Webservers exportieren möchten.
Zuerst erstelle ich das Verzeichnis /home/client1.
mkdir /home/client1 chown nobody:nogroup /home/client1 chmod 755 /home/client1
Das Verzeichnis /var/wwww existiert höchstwahrscheinlich auf deinem Server. Wenn nicht, dann erstellen Sie es:
mkdir /var/www chown root:root /var/www chmod 755 /var/www
Jetzt müssen wir /etc/exports ändern, wo wir unsere NFS-Freigaben „exportieren“. Wir spezifizieren /home/client1 und /var/wwww als NFS-Freigaben und weisen NFS an, Zugriffe auf /home/client1 als Benutzer nobody zu machen (um mehr über /etc/exports, sein Format und die verfügbaren Optionen zu erfahren, werfen Sie einen Blick auf
man 5 exports
)
nano /etc/exports
/home/client1 192.168.1.101(rw,sync,no_subtree_check) /var/www 192.168.1.101(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash)
(Die Option no_root_squash bewirkt, dass /var/wwww als root aufgerufen wird.)
Um die Änderungen in /etc/exports anzuwenden, starten wir den Kernel nfs-Server neu.
service nfs-kernel-server restart
4 Mounten der NFS-Freigaben auf dem Client
Kunde:
Zuerst erstellen wir die Verzeichnisse, in die wir die NFS-Freigaben einbinden wollen, z.B:
mkdir -p /mnt/nfs/home/client1 mkdir -p /var/www
Wenn das Verzeichnis /var/wwww bereits auf Ihrem Server existiert, dann stoppen Sie den Apache, benennen Sie das Verzeichnis um und erstellen Sie ein neues leeres Verzeichnis als Mountpunkt.
service apache2 stop mv /var/www /var/www_bak mkdir -p /var/www
Danach können wir sie wie folgt montieren:
mount 192.168.1.100:/home/client1 /mnt/nfs/home/client1 mount 192.168.1.100:/var/www /var/www
Sie sollten nun die beiden NFS-Freigaben in den Ausgaben von
df -h
root@server1:/tmp# df -h Filesystem Size Used Avail Use% Mounted on udev 990M 0 990M 0% /dev tmpfs 201M 6.0M 195M 3% /run /dev/sda1 28G 1.2G 25G 5% / tmpfs 1001M 0 1001M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 1001M 0 1001M 0% /sys/fs/cgroup tmpfs 200M 0 200M 0% /run/user/1000 192.168.1.100:/home/client1 28G 1.2G 25G 5% /mnt/nfs/home/client1 192.168.1.100:/var/www 28G 1.2G 25G 5% /var/www root@server1:/tmp#
und
mount
root@server1:/tmp# mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,nosuid,relatime,size=1012912k,nr_inodes=253228,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204804k,mode=755) /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd) pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=33,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=9848) mqueue on /dev/mqueue type mqueue (rw,relatime) debugfs on /sys/kernel/debug type debugfs (rw,relatime) hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime) tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=204800k,mode=700,uid=1000,gid=1000) fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) 192.168.1.100:/home/client1 on /mnt/nfs/home/client1 type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.100,mountvers=3,mountport=57821,mountproto=udp,local_lock=none,addr=192.168.1.100) 192.168.1.100:/var/www on /var/www type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.100,mountvers=3,mountport=57821,mountproto=udp,local_lock=none,addr=192.168.1.100) root@server1:/tmp#
5 Prüfung
Auf dem Client können Sie nun versuchen, Testdateien auf den NFS-Freigaben zu erstellen:
Kunde:
touch /mnt/nfs/home/client1/test.txt touch /var/www/test.txt
Gehen Sie nun auf den Server und prüfen Sie, ob Sie beide Testdateien sehen können:
Server:
ls -l /home/client1/
root@server1:/tmp# ls -l /home/client1/ total 0 -rw-r--r-- 1 nobody nogroup 0 Nov 16 10:52 test.txt root@server1:/tmp#
ls -l /var/www
root@server1:/tmp# ls -l /var/www total 0 -rw-r--r-- 1 root root 0 Nov 16 10:52 test.txt root@server1:/tmp#
(Bitte beachten Sie die verschiedenen Eigentümer der Testdateien: die NFS-Freigabe /home/client1 wird als nobody / nogroup angesprochen und ist im Besitz von nobody / nogroup; die Freigabe /var/wwww wird als root aufgerufen, daher ist /var/wwww/test.txt im Besitz von user und group root.)
6 NFS-Freigaben beim Booten einbinden
Anstatt die NFS-Freigaben manuell auf dem Client zu mounten, können Sie /etc/fstab so ändern, dass die NFS-Freigaben beim Booten des Clients automatisch gemountet werden.
Kunde:
Öffnen Sie /etc/fstab und fügen Sie die folgenden Zeilen hinzu:
nano /etc/fstab
[...] 192.168.1.100:/home/client1 /mnt/nfs/home/client1 nfs rw,sync,hard,intr 0 0 192.168.1.100:/var/www /var/www nfs rw,sync,hard,intr 0 0
Anstelle von rw,sync,hard,intr können Sie verschiedene Aktivierungsoptionen verwenden. Um mehr über die verfügbaren Optionen zu erfahren, werfen Sie einen Blick auf
man nfs
Um zu testen, ob Ihre modifizierte /etc/fstab funktioniert, deinstallieren Sie die Freigaben und führen Sie mount -a aus:
umount /mnt/nfs/home/client1 umount /var/www mount -a
Sie sollten nun die beiden NFS-Freigaben in den Ausgaben von
df -h
root@server1:/# df -h Filesystem Size Used Avail Use% Mounted on udev 990M 0 990M 0% /dev tmpfs 201M 6.0M 195M 3% /run /dev/sda1 28G 1.2G 25G 5% / tmpfs 1001M 0 1001M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 1001M 0 1001M 0% /sys/fs/cgroup tmpfs 200M 0 200M 0% /run/user/1000 192.168.1.100:/home/client1 28G 1.2G 25G 5% /mnt/nfs/home/client1 192.168.1.100:/var/www 28G 1.2G 25G 5% /var/www root@server1:/#
und
mount
root@server1:/# mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,nosuid,relatime,size=1012912k,nr_inodes=253228,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204804k,mode=755) /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd) pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=33,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=9848) mqueue on /dev/mqueue type mqueue (rw,relatime) debugfs on /sys/kernel/debug type debugfs (rw,relatime) hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime) tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=204800k,mode=700,uid=1000,gid=1000) fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) 192.168.1.100:/home/client1 on /mnt/nfs/home/client1 type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.100,mountvers=3,mountport=57821,mountproto=udp,local_lock=none,addr=192.168.1.100) 192.168.1.100:/var/www on /var/www type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.100,mountvers=3,mountport=57821,mountproto=udp,local_lock=none,addr=192.168.1.100) root@server1:/#
7 Credits
Dieses Tutorial basiert auf dem Centos NFS Server Tutorial von Falko Timme.
8 Links
- Linux NFS: http://nfs.sourceforge.net/
- Debian: http://www.debian.org/