Einführung
NFS (Network File System) ist ein verteiltes Dateisystemprotokoll, mit dem Sie Remoteverzeichnisse auf Ihrem Server bereitstellen können. Auf diese Weise können Sie Speicherplatz an einem anderen Speicherort verwalten und von mehreren Clients auf diesen Speicherplatz schreiben. NFS bietet eine relativ schnelle und einfache Möglichkeit, über ein Netzwerk auf Remote-Systeme zuzugreifen, und funktioniert auch in Situationen, in denen regelmäßig auf die freigegebenen Ressourcen zugegriffen wird.
In diesem Handbuch erfahren Sie, wie Sie NFS-Bereitstellungen konfigurieren.
Voraussetzungen
In diesem Tutorial werden zwei Server verwendet: Einer teilt einen Teil seines Dateisystems mit dem anderen.
Um mitzumachen, benötigen Sie:
-
Two Ubuntu 16.04 servers, each with a non-root user with
sudo
privileges und privates Netzwerk aktiviert.-
Befolgen Sie unsere Anleitung zuInitial Server Setup with Ubuntu 16.04, um Unterstützung beim Einrichten eines Benutzers mit diesen Berechtigungen zu erhalten.
-
Hilfe zum Einrichten eines privaten Netzwerks finden Sie unterHow To Set Up And Use DigitalOcean Private Networking.
-
Im gesamten Lernprogramm wird der Server, der seine Verzeichnisse gemeinsam nutzt, alshost und der Server, der diese Verzeichnisse bereitstellt, alsclient bezeichnet. Um sie klar zu halten, verwenden wir die folgenden IP-Adressen als Ersatz für die Host- und Client-Werte:
-
Host: 203,0,113,0
-
Client: 203,0,113,256
Sie sollten diese Werte durch Ihre eigenen Host- und Client-IP-Adressen ersetzen.
[[Schritt-1 - Herunterladen und Installieren der Komponenten]] == Schritt 1 - Herunterladen und Installieren der Komponenten
Wir beginnen mit der Installation der erforderlichen Komponenten auf jedem Server.
Auf dem Host
Auf dem Host-Server installieren wir das Paketnfs-kernel-server
, mit dem wir unsere Verzeichnisse freigeben können. Da dies der erste Vorgang ist, den wir in dieser Sitzung mitapt
ausführen, aktualisieren wir unseren lokalen Paketindex vor der Installation:
sudo apt-get update
sudo apt-get install nfs-kernel-server
Wechseln Sie nach der Installation dieser Pakete zum Client-Server.
Auf dem Client
Auf dem Client-Server müssen wir ein Paket namensnfs-common
installieren, das NFS-Funktionalität bietet, ohne nicht benötigte Serverkomponenten einzuschließen. Auch hier aktualisieren wir den lokalen Paketindex vor der Installation, um sicherzustellen, dass wir über aktuelle Informationen verfügen:
sudo apt-get update
sudo apt-get install nfs-common
Nachdem beide Server über die erforderlichen Pakete verfügen, können Sie mit der Konfiguration beginnen.
[[Schritt-2 - Erstellen der Freigabeverzeichnisse auf dem Host]] == Schritt 2 - Erstellen der Freigabeverzeichnisse auf dem Host
Wir werden zwei separate Verzeichnisse mit unterschiedlichen Konfigurationseinstellungen gemeinsam nutzen, um zwei wichtige Möglichkeiten zu veranschaulichen, wie NFS-Bereitstellungen in Bezug auf den Superuser-Zugriff konfiguriert werden können.
Superuser können überall auf ihrem System arbeiten. Von NFS gemountete Verzeichnisse sind jedoch nicht Teil des Systems, auf dem sie gemountet werden. Daher lehnt der NFS-Server standardmäßig die Ausführung von Vorgängen ab, für die Superuser-Berechtigungen erforderlich sind. Diese Standardeinschränkung bedeutet, dass Superuser auf dem Client keine Dateien als Root schreiben, den Besitz nicht neu zuweisen oder keine anderen Superuser-Aufgaben auf dem NFS-Mount ausführen können.
Manchmal gibt es jedoch vertrauenswürdige Benutzer auf dem Client-System, die in der Lage sein müssen, diese Aufgaben auf dem bereitgestellten Dateisystem auszuführen, aber keinen Superuser-Zugriff auf dem Host benötigen. Der NFS-Server kann so konfiguriert werden, dass dies möglich ist, obwohl dies ein Risikoelement darstellt, da ein solcher BenutzercouldRoot-Zugriff auf das gesamte Hostsystem erhält.
Beispiel 1: Exportieren einer Universalhalterung
Im ersten Beispiel erstellen wir einen universellen NFS-Mount, der das Standard-NFS-Verhalten verwendet, um einem Benutzer mit Root-Rechten auf dem Client-Computer die Interaktion mit dem Host mit diesen Client-Superuser-Rechten zu erschweren. Sie können so etwas verwenden, um die mit einem Content-Management-System hochgeladenen Dateien zu speichern oder um Speicherplatz für Benutzer zu schaffen, damit diese Projektdateien problemlos gemeinsam nutzen können.
Erstellen Sie zunächst ein Freigabeverzeichnis mit dem Namennfs
:
sudo mkdir /var/nfs/general -p
Da wir es mitsudo
erstellen, gehört das Verzeichnis root hier auf dem Host.
ls -la /var/nfs/general
Output4 drwxr-xr-x 2 root root 4096 Jul 25 15:26 .
NFS übersetzt aus Sicherheitsgründen alleroot
-Operationen auf dem Client in dienobody:nogroup
-Anmeldeinformationen. Daher müssen wir den Verzeichnisbesitz ändern, um diesen Anmeldeinformationen zu entsprechen.
sudo chown nobody:nogroup /var/nfs/general
Dieses Verzeichnis kann jetzt exportiert werden.
Beispiel 2: Exportieren des Basisverzeichnisses
In unserem zweiten Beispiel besteht das Ziel darin, die auf dem Host gespeicherten Home-Verzeichnisse der Benutzer auf Client-Servern verfügbar zu machen und vertrauenswürdigen Administratoren dieser Client-Server den Zugriff zu ermöglichen, den sie zur bequemen Verwaltung von Benutzern benötigen.
Dazu exportieren wir das Verzeichnis/home
. Da es bereits vorhanden ist, müssen wir es nicht erstellen. Auch die Berechtigungen werden nicht geändert. Wenn wirdid, würde dies alle möglichen Probleme für jeden verursachen, der ein Home-Verzeichnis auf dem Host-Computer hat.
[[Schritt 3 - Konfigurieren der NFS-Exporte auf dem Host-Server]] == Schritt 3 - Konfigurieren der NFS-Exporte auf dem Host-Server
Als Nächstes gehen wir in die NFS-Konfigurationsdatei ein, um die gemeinsame Nutzung dieser Ressourcen einzurichten.
Öffnen Sie die Datei/etc/exports
in Ihrem Texteditor mit Root-Rechten:
sudo nano /etc/exports
Die Datei enthält Kommentare zum allgemeinen Aufbau der einzelnen Konfigurationszeilen. Die Syntax lautet grundsätzlich:
/etc/exports
directory_to_share client(share_option1,...,share_optionN)
Für jedes Verzeichnis, das wir freigeben möchten, müssen wir eine Zeile erstellen. Da unser Beispielclient eine IP von203.0.113.256
hat, sehen unsere Zeilen wie folgt aus. Stellen Sie sicher, dass Sie die IP-Adressen an Ihren Kunden anpassen:
/etc/exports
/var/nfs/general 203.0.113.256(rw,sync,no_subtree_check)
/home 203.0.113.256(rw,sync,no_root_squash,no_subtree_check)
Wir verwenden für beide Verzeichnisse dieselben Konfigurationsoptionen mit Ausnahme vonno_root_squash
. Werfen wir einen Blick auf die jeweiligen Bedeutungen.
-
rw: Mit dieser Option erhält der Client-Computer Lese- und Schreibzugriff auf das Volume.
-
sync: Diese Option zwingt NFS, vor dem Antworten Änderungen auf die Festplatte zu schreiben. Dies führt zu einer stabileren und konsistenteren Umgebung, da die Antwort den tatsächlichen Status des Remote-Volumes widerspiegelt. Es verringert jedoch auch die Geschwindigkeit der Dateivorgänge.
-
no_subtree_check: Diese Option verhindert die Überprüfung von Teilbäumen. Hierbei muss der Host für jede Anforderung prüfen, ob die Datei tatsächlich noch im exportierten Baum verfügbar ist. Dies kann viele Probleme verursachen, wenn eine Datei umbenannt wird, während der Client sie geöffnet hat. In fast allen Fällen ist es besser, die Teilbaumprüfung zu deaktivieren.
-
no_root_squash: Standardmäßig übersetzt NFS Anforderungen von einem Root-Benutzer remote in einen nicht privilegierten Benutzer auf dem Server. Dies war als Sicherheitsfunktion gedacht, um zu verhindern, dass ein Root-Konto auf dem Client das Dateisystem des Hosts als Root verwendet.
no_root_squash
deaktiviert dieses Verhalten für bestimmte Freigaben.
Wenn Sie mit den Änderungen fertig sind, speichern und schließen Sie die Datei. Starten Sie anschließend den NFS-Server mit dem folgenden Befehl neu, um die Freigaben für die von Ihnen konfigurierten Clients verfügbar zu machen:
sudo systemctl restart nfs-kernel-server
Bevor Sie die neuen Freigaben jedoch tatsächlich verwenden können, müssen Sie sicherstellen, dass der Datenverkehr zu den Freigaben von den Firewall-Regeln zugelassen wird
[[Schritt 4 - Anpassen der Firewall auf dem Host]] == Schritt 4 - Anpassen der Firewall auf dem Host
Überprüfen Sie zunächst den Firewall-Status, um festzustellen, ob er aktiviert ist, und falls ja, um festzustellen, was derzeit zulässig ist:
sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Auf unserem System ist nur SSH-Datenverkehr zulässig. Daher müssen wir eine Regel für NFS-Datenverkehr hinzufügen.
Bei vielen Anwendungen können Siesudo ufw app list
verwenden und sie nach Namen aktivieren, abernfs
gehört nicht dazu. Daufw
auch/etc/services
auf den Port und das Protokoll eines Dienstes überprüft, können wir NFS weiterhin nach Namen hinzufügen. Es wird empfohlen, die restriktivste Regel zu aktivieren, die weiterhin den von Ihnen gewünschten Datenverkehr zulässt. Anstatt den Datenverkehr von jedem beliebigen Ort aus zuzulassen, werden wir uns darauf beschränken.
Verwenden Sie den folgenden Befehl, um Port 2049 auf dem Host zu öffnen, wobei Sie die IP-Adresse Ihres Clients ersetzen müssen:
sudo ufw allow from 203.0.113.256 to any port nfs
Sie können die Änderung überprüfen, indem Sie Folgendes eingeben:
sudo ufw status
In der Ausgabe sollte der Verkehr von Port 2049 zugelassen sein:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.256
OpenSSH (v6) ALLOW Anywhere (v6)
Dies bestätigt, dass UFW nur NFS-Datenverkehr auf Port 2049 von unserem Client-Computer zulässt.
[[Schritt 5 - Erstellen der Mount-Punkte auf dem Client] == Schritt 5 - Erstellen der Mount-Punkte auf dem Client
Nachdem der Hostserver konfiguriert ist und seine Freigaben bereitstellt, bereiten wir unseren Client vor.
Um die Remote-Freigaben auf dem Client verfügbar zu machen, müssen Sie das Host-Verzeichnis in einem leeren Client-Verzeichnis bereitstellen.
[.note] #Note: Wenn sich in Ihrem Bereitstellungspunkt Dateien und Verzeichnisse befinden, werden diese ausgeblendet, sobald Sie die NFS-Freigabe bereitstellen. Stellen Sie sicher, dass das Verzeichnis leer ist, wenn Sie in ein bereits vorhandenes Verzeichnis mounten.
#
Wir erstellen zwei Verzeichnisse für unsere Reittiere:
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
[[Schritt 6 - Bereitstellen der Verzeichnisse auf dem Client]] == Schritt 6 - Bereitstellen der Verzeichnisse auf dem Client
Nachdem wir einen Platz für die Remote-Freigaben haben und die Firewall geöffnet haben, können wir die Freigaben bereitstellen, indem wir uns an unseren Host-Server wenden, der in diesem Handbuch203.0.113.0
lautet:
sudo mount 203.0.113.0:/var/nfs/general /nfs/general
sudo mount 203.0.113.0:/home /nfs/home
Diese Befehle sollten die Freigaben vom Host-Computer auf dem Client-Computer bereitstellen. Sie können auf verschiedene Arten überprüfen, ob die Bereitstellung erfolgreich war. Sie können dies mit einem einfachen Befehlmount
oderfindmnt
überprüfen. Mitdf -h
erhalten Sie jedoch eine besser lesbare Ausgabe, die zeigt, wie die Festplattennutzung für die nfs-Freigaben unterschiedlich angezeigt wird:
df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 238M 0 238M 0% /dev
tmpfs 49M 628K 49M 2% /run
/dev/vda1 20G 1.2G 18G 7% /
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
203.0.113.0:/home 20G 1.2G 18G 7% /nfs/home
203.0.113.0:/var/nfs/general 20G 1.2G 18G 7% /nfs/general
Die beiden von uns gemounteten Shares werden unten angezeigt. Da sie über dasselbe Dateisystem bereitgestellt wurden, weisen sie dieselbe Datenträgerverwendung auf. Verwenden Sie den Festplattenverwendungsbefehldu
und den Pfad der Bereitstellung, um zu sehen, wie viel Speicherplatz tatsächlich unter jedem Bereitstellungspunkt verwendet wird. Das-s
-Flag bietet eine Zusammenfassung der Verwendung, anstatt die Verwendung für jede Datei anzuzeigen. Mit-h
wird eine vom Menschen lesbare Ausgabe gedruckt.
Zum Beispiel:
du -sh /nfs/home
Output36K /nfs/home
Dies zeigt uns, dass der Inhalt des gesamten Basisverzeichnisses nur 20 KB des verfügbaren Speicherplatzes belegt.
[[Schritt-7 - Testen des NFS-Zugriffs]] == Schritt 7 - Testen des NFS-Zugriffs
Als Nächstes testen wir den Zugriff auf die Freigaben, indem wir jeweils etwas in die Freigaben schreiben.
Beispiel 1: Die General Purpose Share
Schreiben Sie zunächst eine Testdatei in die/var/nfs/general
-Freigabe.
sudo touch /nfs/general/general.test
Überprüfen Sie dann seinen Besitz:
ls -l /nfs/general/general.test
Output-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
Da wir dieses Volume gemountet haben, ohne das Standardverhalten von NFS zu ändern, und die Datei über den Befehlsudo
als Root-Benutzer des Clientcomputers erstellt haben, ist der Besitz der Datei standardmäßig niemandem: nogroup. Client-Superuser können auf dieser über NFS bereitgestellten Freigabe keine typischen Verwaltungsaktionen ausführen, z. B. den Eigentümer einer Datei ändern oder ein neues Verzeichnis für eine Gruppe von Benutzern erstellen.
Beispiel 2: Die Freigabe des Basisverzeichnisses
Um die Berechtigungen der Allzweckfreigabe mit der Basisverzeichnisfreigabe zu vergleichen, erstellen Sie auf die gleiche Weise ein Basisverzeichnis:
sudo touch /nfs/home/home.test
Dann schauen Sie sich den Besitz der Datei an:
ls -l /nfs/home/home.test
Output-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test
Wir habenhome.test
als root über den Befehlsudo
erstellt, genauso wie wir die Dateigeneral.test
erstellt haben. In diesem Fall gehört es jedoch root, da wir das Standardverhalten überschrieben haben, als wir die Optionno_root_squash
auf diesem Mount angegeben haben. Dies ermöglicht unseren Root-Benutzern auf dem Client-Computer, als Root zu fungieren, und erleichtert die Verwaltung von Benutzerkonten erheblich. Gleichzeitig müssen wir diesen Benutzern keinen Root-Zugriff auf dem Host gewähren.
[[Schritt-8 - Bereitstellen der Remote-NFS-Verzeichnisse beim Booten]] == Schritt 8 - Mounten der Remote-NFS-Verzeichnisse beim Booten
Wir können die Remote-NFS-Freigaben beim Booten automatisch bereitstellen, indem wir sie der Datei/etc/fstab
auf dem Client hinzufügen.
Öffnen Sie diese Datei mit Root-Rechten in Ihrem Texteditor:
sudo nano /etc/fstab
Am Ende der Datei wird für jede unserer Freigaben eine Zeile hinzugefügt. Sie werden so aussehen:
/etc/fstab
. . .
203.0.113.0:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
203.0.113.0:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
[.note] #Note: Weitere Informationen zu den hier angegebenen Optionen finden Sie in der Manpage, in der die NFS-Bereitstellung infstab
mit dem Befehlman nfs
beschrieben wird.
#
Der Client-Server stellt die Remote-Partitionen beim Booten automatisch bereit. Es kann jedoch einen Moment dauern, bis die Verbindung hergestellt ist und die Freigaben verfügbar sind.
[[Schritt 9 - Aufheben der Bereitstellung einer NFS-Remote-Freigabe]] == Schritt 9 - Aufheben der Bereitstellung einer NFS-Remote-Freigabe
Wenn Sie nicht mehr möchten, dass das Remote-Verzeichnis auf Ihrem System bereitgestellt wird, können Sie die Bereitstellung aufheben, indem Sie die Verzeichnisstruktur der Freigabe verlassen und die Bereitstellung wie folgt aufheben:
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
Dadurch werden die Remotefreigaben entfernt, sodass nur auf Ihren lokalen Speicher zugegriffen werden kann:
df -h
Output
Filesystem Size Used Avail Use% Mounted on
/dev/vda 59G 1.3G 55G 3% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 2.0G 12K 2.0G 1% /dev
tmpfs 396M 320K 396M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
none 100M 0 100M 0% /run/user
Wenn Sie auch verhindern möchten, dass sie beim nächsten Neustart erneut bereitgestellt werden, bearbeiten Sie/etc/fstab
und löschen Sie die Zeile oder kommentieren Sie sie aus, indem Sie am Anfang der Zeile ein # -Symbol platzieren. Sie können das automatische Mounten auch verhindern, indem Sie die Optionauto
entfernen, mit der Sie es manuell mounten können.
Fazit
In diesem Lernprogramm haben wir einen NFS-Host erstellt und einige wichtige NFS-Verhaltensweisen veranschaulicht, indem wir zwei verschiedene NFS-Bereitstellungen erstellt haben, die wir mit unserem NFS-Client geteilt haben. Wenn Sie NFS in der Produktion implementieren möchten, ist es wichtig zu beachten, dass das Protokoll selbst nicht verschlüsselt ist. In Fällen, in denen Sie öffentlich zugängliche Dateien freigeben, verursacht dies keine ernsthaften Probleme.
Wenn Sie jedoch NFS für private Daten verwenden, müssen Sie entscheiden, wie Sie diese Daten schützen möchten. Möglicherweise können Sie NFS über SSH oder eine VPN-Verbindung weiterleiten, um eine sicherere Umgebung zu schaffen. Dies führt jedoch häufig zu erheblichen Leistungseinbußen. Wenn die Leistung ein Problem darstellt, berücksichtigen SieSSHFS. Es ist etwas langsamer als unverschlüsselter NFS-Verkehr, aber in der Regel viel schneller als getunnelter NFS. Kerberos-authentifizierte Verschlüsselung für NFS ist eine weitere zu untersuchende Option.