如何在Ubuntu 18.04上設置NFS掛載

介紹

NFS,或稱網路檔案系統,是一種分散式檔案系統協議,允許您在伺服器上掛載遠端目錄。這讓您可以在不同位置管理存儲空間並從多個客戶端寫入該空間。NFS 提供了一種相對標準且高效的方法,可通過網絡訪問遠程系統,在需要定期訪問共享資源的情況下運作良好。

在本指南中,您將學習如何在Ubuntu 18.04上安裝NFS功能所需的軟件,配置伺服器和客戶端上的NFS掛載,以及掛載和卸載遠程共享。

先決條件

在本教程中,我們將使用兩台伺服器,其中一台將其部分檔案系統與另一台共享。要完成本教程,您需要:

  • 兩台 Ubuntu 18.04 伺服器。每台都應該有一個具有 sudo 權限配置的非 root 用戶,設置了 UFW 的防火牆,如果可用的話,還應該設置私有網絡。

    • 如需協助設置具有 sudo 權限和防火牆的非 root 用戶,請參閱我們的《Ubuntu 18.04 初始伺服器設置》指南。

    • 如果您正在使用 DigitalOcean Droplets 作為您的伺服器和客戶端,請閱讀《如何創建 VPC》以設置私有網絡。

在本教程中,我们将共享其目录的服务器称为主机,将挂载这些目录的服务器称为客户端。我们将使用以下IP地址作为主机客户端值的代替:

  • 主机: 203.0.113.0
  • 客户端: 203.0.113.24

当这些IP地址出现在命令和配置文件中时,请用您自己的主机客户端 IP地址替换它们。

步骤1 — 下载和安装组件

首先,在每台服务器上安装必要的组件。

在主机上

主機伺服器上安裝nfs-kernel-server套件,這將允許您分享您的目錄。由於這是您在此會話中執行的第一個操作,請在安裝之前刷新本地套件索引:

  1. sudo apt update

接下來,安裝套件:

  1. sudo apt install nfs-kernel-server

安裝了這些套件後,切換到客戶端伺服器。

在客戶端

客戶端伺服器上,安裝一個名為nfs-common的套件,它提供了NFS功能,但不包括伺服器組件。同樣,在安裝之前刷新本地套件索引以確保您有最新的信息:

  1. sudo apt update

然後,安裝套件:

  1. sudo apt install nfs-common

現在,兩台伺服器都有了必要的套件,您可以開始配置它們。

步驟2 — 在主機上創建共享目錄

我們將共享兩個不同配置設置的獨立目錄,以演示NFS掛載在超級用戶訪問方面的兩個關鍵方式。

超级用户可以在其系统上的任何地方执行任何操作。但是,NFS 挂载的目录不属于其所挂载的系统的一部分,因此,默认情况下,NFS 服务器拒绝执行需要超级用户权限的操作。这个默认限制意味着客户端上的超级用户不能以root身份写入文件、重新分配所有权,或在 NFS 挂载上执行任何其他超级用户任务。

然而,有时在客户端系统上有受信任的用户需要在挂载的文件系统上执行这些操作,但他们在主机上没有超级用户访问权限。您可以配置 NFS 服务器以允许此操作,尽管这会引入一定的风险,因为这样的用户可能会获得对整个主机系统的root访问权限。

示例 1:导出通用挂载

在第一个示例中,您将创建一个通用的 NFS 挂载,使用默认的 NFS 行为使在客户端机器上具有root特权的用户难以使用那些客户端超级用户特权与主机进行交互。您可以使用类似以下方式存储使用内容管理系统上传的文件或为用户创建共享项目文件的空间。

首先,创建一个共享目录:

  1. sudo mkdir /var/nfs/general -p

由于您是使用sudo创建它,所以该目录由主机root用户拥有:

  1. ls -la /var/nfs/general
Output
total 8 drwxr-xr-x 2 root root 4096 Feb 7 23:21 . drwxr-xr-x 3 root root 4096 Feb 7 23:21 ..

NFS将任何root操作在客户端上转换为nobody:nogroup凭据,作为安全措施。因此,您需要更改目录所有权以匹配这些凭据:

  1. sudo chown nobody:nogroup /var/nfs/general

您现在可以导出此目录了。

示例2:导出主目录

在我们的第二个示例中,目标是使存储在主机上的用户主目录在客户端服务器上可用,同时允许这些客户端服务器的受信任管理员访问他们需要方便管理用户的权限。

为此,您将导出/home目录。由于它已经存在,您不需要创建它。您也不会更改权限。如果您这样做,可能会导致主机机器上具有主目录的任何人遇到各种问题。

第3步 — 在主机服务器上配置NFS导出

接下來,我們將深入研究NFS配置文件,以設置這些資源的共享。

主機上,使用您首選的文本編輯器以root權限打開/etc/exports文件。這裡我們將使用nano

  1. sudo nano /etc/exports

文件中有註釋顯示每個配置行的一般結構。語法如下:

/etc/exports
directory_to_share    client(share_option1,...,share_optionN)

您需要為計劃共享的每個目錄創建一行。由於我們的示例客戶端的IP是203.0.113.24,我們的行將如下所示。請務必將IP地址更改為您的客戶端的IP:

/etc/exports
/var/nfs/general    203.0.113.24(rw,sync,no_subtree_check)
/home       203.0.113.24(rw,sync,no_root_squash,no_subtree_check)

在這裡,我們對兩個目錄使用相同的配置選項,只有no_root_squash例外。讓我們來看看每個選項的含義:

  • rw:此選項為客戶端計算機提供了對卷的讀寫訪問權限。
  • sync:此選項強制NFS在回覆之前將更改寫入磁盤。這導致環境更加穩定和一致,因為回覆反映了遠程卷的實際狀態。但是,這也會降低文件操作的速度。
  • no_subtree_check:此選項防止子樹檢查,這是一個過程,在此過程中,主機必須檢查文件對於每個請求是否仍然存在於導出樹中。當客戶端打開文件時,如果文件被重命名,這可能會導致許多問題。幾乎在所有情況下,最好禁用子樹檢查。
  • no_root_squash:預設情況下,NFS 將遠程來自 root 使用者的請求轉換為伺服器上的非特權使用者。這是一項安全功能,旨在防止 客戶端 上的 root 帳戶使用 主機 的文件系統作為 rootno_root_squash 禁用了某些共享的此行為。

完成更改後,保存並關閉文件。如果使用 nano,可以按 CTRL + X,然後按 YENTER 進行此操作。然後,為了使您配置的共享可供客戶端使用,請使用以下命令重新啟動 NFS 伺服器:

  1. sudo systemctl restart nfs-kernel-server

但是,在實際使用新共享之前,您需要確保防火牆規則允許對共享的流量。

步驟 4 — 調整主機上的防火牆

首先,檢查防火牆狀態以確認是否已啟用,如果是,請查看目前允許的內容:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

在我們的系統上,只允許 SSH 流量通過,因此我們需要添加 NFS 流量的規則。

有很多應用程式可以使用 sudo ufw app list 來進行啟用,但 nfs 不是其中之一。不過,因為 ufw 也會檢查服務的端口和協議,所以你仍然可以按名稱添加 NFS。最佳實踐建議您啟用最具限制性的規則,以允許您想要允許的流量,因此,您應該具體指定而不是從任何地方啟用流量。

使用以下命令在 主機 上打開端口 2049,請確保替換為您的 客戶端 IP 地址:

  1. sudo ufw allow from 203.0.113.24 to any port nfs

您可以通過運行以下命令來驗證更改:

  1. sudo ufw status

您應該會收到在輸出中允許從端口 2049 的流量列表:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 2049 ALLOW 203.0.113.24 OpenSSH (v6) ALLOW Anywhere (v6)

這確認了 UFW 只會允許來自您的 客戶端 機器的端口 2049 的 NFS 流量。

步驟 5 —— 在客戶端上創建掛載點並掛載目錄

現在,主機 伺服器已配置並提供其共享,您將準備好您的 客戶端

為了在 客戶端 上提供遠程共享,您需要在 主機 上掛載您想要共享到 客戶端 上的空目錄。

注意:如果在您的挂载点中有文件和目录,它们将在您挂载NFS共享后变为隐藏。为避免丢失重要文件,请确保如果您在已存在的目录中挂载,则该目录为空。

为您的挂载创建两个目录。运行以下命令以创建第一个:

  1. sudo mkdir -p /nfs/general

然后运行此命令以创建第二个:

  1. sudo mkdir -p /nfs/home

现在,您已经有了一个放置远程共享的位置,并且已经打开了防火墙,您可以通过使用您主机服务器的IP地址来挂载共享,在本指南中为203.0.113.0

  1. sudo mount 203.0.113.0:/var/nfs/general /nfs/general
  2. sudo mount 203.0.113.0:/home /nfs/home

这些命令将从主机计算机上的共享挂载到客户端机器上。您可以通过多种方式双重检查它们是否成功挂载。您可以使用mountfindmnt命令检查,但df -h提供了更可读的输出,说明了NFS共享的磁盘使用情况显示方式不同:

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.6M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000 203.0.113.0:/var/nfs/general 25G 1.3G 23G 6% /nfs/general 203.0.113.0:/home 25G 1.3G 23G 6% /nfs/home

您挂载的两个共享都显示在底部。因为它们是从同一文件系统挂载的,所以它们显示相同的磁盘使用情况。要检查每个挂载点实际使用了多少空间,请使用磁盘使用命令du和挂载的路径。-s标志提供了使用摘要,而不是为每个文件显示使用情况。-h打印人类可读的输出:

  1. du -sh /nfs/home
Output
44K /nfs/home

这向您显示整个主目录的内容仅使用了可用空间的44K。

步驟 6 — 測試 NFS 存取

接下來,通過對每個共享目錄寫入內容來測試存取。

範例 1:一般用途共享

首先,在 /var/nfs/general 共享目錄寫入測試檔案:

  1. sudo touch /nfs/general/general.test

然後,檢查其擁有權:

  1. ls -l /nfs/general/general.test
Output
-rw-r--r-- 1 nobody nogroup 0 Feb 7 23:53 /nfs/general/general.test

因為您掛載此卷時未更改 NFS 的預設行為,並且通過 sudo 命令以 客戶端 機器的 root 用戶創建了該檔案,所以該檔案的擁有權默認為 nobody:nogroup客戶端 超級使用者將無法執行典型的管理操作,例如更改檔案的所有者或為使用者組創建新目錄,這些操作均在此 NFS 掛載的共享中。

範例 2:家目錄共享

為了比較一般用途共享與家目錄共享的權限,以相同方式在 /nfs/home 中創建一個檔案:

  1. sudo touch /nfs/home/home.test

然後檢查文件的所有權:

  1. ls -l /nfs/home/home.test
Output
-rw-r--r-- 1 root root 0 Feb 7 23:56 /nfs/home/home.test

您使用sudo命令創建了home.test作為root,就像您創建general.test文件的方式一樣。但是,在這種情況下,它由root所有,因為您在此掛載上指定no_root_squash選項時覆蓋了默認行為。這允許您的客戶端機器上的root用戶扮演root,並使用戶帳戶的管理更加方便。同時,這意味著您不必在主機上給予這些用戶root訪問權限。

步驟7 — 在啟動時掛載遠程NFS目錄

您可以通過將它們添加到客戶端/etc/fstab文件中,在啟動時自動掛載遠程NFS共享。

以root權限使用您喜歡的文本編輯器打開以下文件:

  1. sudo nano /etc/fstab

在文件末尾添加每個共享的一行,如下所示:

/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

注意:您可以在NFS的man頁面中找到有關這裡指定的選項的更多信息。您可以運行以下命令來訪問它:

  1. man nfs

客戶端伺服器將在開機時自動掛載遠端分區,儘管建立連接並使共享可用可能需要一些時間。

第8步 — 卸載 NFS 遠端共享

如果您不再希望將遠端目錄掛載到系統上,您可以通過離開共享的目錄結構並卸載來取消掛載。

首先進入主目錄:

  1. cd ~

然後卸載/nfs/home。請注意,命令的名稱是umount而不是您可能期望的unmount

  1. sudo umount /nfs/home

接下來,卸載/nfs/general

  1. sudo umount /nfs/general

這將刪除遠端共享,僅使您的本地存儲可訪問:

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.5M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000

如果您還想防止它們在下次重啟時重新掛載,請編輯/etc/fstab,並刪除該行或在該行開頭放置#字符將其註釋掉。您也可以通過刪除auto選項來防止自動掛載,這將允許您手動掛載它。

結論

在這個教程中,你創建了一個 NFS 主機並通過創建兩個不同的 NFS 掛載來說明一些關鍵的 NFS 行為,然後與你的 NFS 客戶端分享了它們。如果你打算在生產環境中實施 NFS,需要注意的是該協議本身並不加密。在您通過私有網路分享文件的情況下,這可能不是一個問題。在其他情況下,將需要使用 VPN 或某種其他類型的加密隧道來保護您的數據。請注意,這通常會導致性能顯著下降。如果性能是一個問題,考慮使用 SSHFS

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-18-04