介紹
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
套件,這將允許您分享您的目錄。由於這是您在此會話中執行的第一個操作,請在安裝之前刷新本地套件索引:
接下來,安裝套件:
安裝了這些套件後,切換到客戶端伺服器。
在客戶端
在客戶端伺服器上,安裝一個名為nfs-common
的套件,它提供了NFS功能,但不包括伺服器組件。同樣,在安裝之前刷新本地套件索引以確保您有最新的信息:
然後,安裝套件:
現在,兩台伺服器都有了必要的套件,您可以開始配置它們。
步驟2 — 在主機上創建共享目錄
我們將共享兩個不同配置設置的獨立目錄,以演示NFS掛載在超級用戶訪問方面的兩個關鍵方式。
超级用户可以在其系统上的任何地方执行任何操作。但是,NFS 挂载的目录不属于其所挂载的系统的一部分,因此,默认情况下,NFS 服务器拒绝执行需要超级用户权限的操作。这个默认限制意味着客户端上的超级用户不能以root身份写入文件、重新分配所有权,或在 NFS 挂载上执行任何其他超级用户任务。
然而,有时在客户端系统上有受信任的用户需要在挂载的文件系统上执行这些操作,但他们在主机上没有超级用户访问权限。您可以配置 NFS 服务器以允许此操作,尽管这会引入一定的风险,因为这样的用户可能会获得对整个主机系统的root访问权限。
示例 1:导出通用挂载
在第一个示例中,您将创建一个通用的 NFS 挂载,使用默认的 NFS 行为使在客户端机器上具有root特权的用户难以使用那些客户端超级用户特权与主机进行交互。您可以使用类似以下方式存储使用内容管理系统上传的文件或为用户创建共享项目文件的空间。
首先,创建一个共享目录:
由于您是使用sudo
创建它,所以该目录由主机的root用户拥有:
Outputtotal 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
凭据,作为安全措施。因此,您需要更改目录所有权以匹配这些凭据:
您现在可以导出此目录了。
示例2:导出主目录
在我们的第二个示例中,目标是使存储在主机上的用户主目录在客户端服务器上可用,同时允许这些客户端服务器的受信任管理员访问他们需要方便管理用户的权限。
为此,您将导出/home
目录。由于它已经存在,您不需要创建它。您也不会更改权限。如果您这样做,可能会导致主机机器上具有主目录的任何人遇到各种问题。
第3步 — 在主机服务器上配置NFS导出
接下來,我們將深入研究NFS配置文件,以設置這些資源的共享。
在主機上,使用您首選的文本編輯器以root權限打開/etc/exports
文件。這裡我們將使用nano
:
文件中有註釋顯示每個配置行的一般結構。語法如下:
directory_to_share client(share_option1,...,share_optionN)
您需要為計劃共享的每個目錄創建一行。由於我們的示例客戶端的IP是203.0.113.24
,我們的行將如下所示。請務必將IP地址更改為您的客戶端的IP:
/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 帳戶使用 主機 的文件系統作為 root。no_root_squash
禁用了某些共享的此行為。
完成更改後,保存並關閉文件。如果使用 nano
,可以按 CTRL + X
,然後按 Y
和 ENTER
進行此操作。然後,為了使您配置的共享可供客戶端使用,請使用以下命令重新啟動 NFS 伺服器:
但是,在實際使用新共享之前,您需要確保防火牆規則允許對共享的流量。
步驟 4 — 調整主機上的防火牆
首先,檢查防火牆狀態以確認是否已啟用,如果是,請查看目前允許的內容:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
在我們的系統上,只允許 SSH 流量通過,因此我們需要添加 NFS 流量的規則。
有很多應用程式可以使用 sudo ufw app list
來進行啟用,但 nfs
不是其中之一。不過,因為 ufw
也會檢查服務的端口和協議,所以你仍然可以按名稱添加 NFS。最佳實踐建議您啟用最具限制性的規則,以允許您想要允許的流量,因此,您應該具體指定而不是從任何地方啟用流量。
使用以下命令在 主機 上打開端口 2049
,請確保替換為您的 客戶端 IP 地址:
您可以通過運行以下命令來驗證更改:
您應該會收到在輸出中允許從端口 2049
的流量列表:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.24
OpenSSH (v6) ALLOW Anywhere (v6)
這確認了 UFW 只會允許來自您的 客戶端 機器的端口 2049
的 NFS 流量。
步驟 5 —— 在客戶端上創建掛載點並掛載目錄
現在,主機 伺服器已配置並提供其共享,您將準備好您的 客戶端。
為了在 客戶端 上提供遠程共享,您需要在 主機 上掛載您想要共享到 客戶端 上的空目錄。
注意:如果在您的挂载点中有文件和目录,它们将在您挂载NFS共享后变为隐藏。为避免丢失重要文件,请确保如果您在已存在的目录中挂载,则该目录为空。
为您的挂载创建两个目录。运行以下命令以创建第一个:
然后运行此命令以创建第二个:
现在,您已经有了一个放置远程共享的位置,并且已经打开了防火墙,您可以通过使用您主机服务器的IP地址来挂载共享,在本指南中为203.0.113.0
:
这些命令将从主机计算机上的共享挂载到客户端机器上。您可以通过多种方式双重检查它们是否成功挂载。您可以使用mount
或findmnt
命令检查,但df -h
提供了更可读的输出,说明了NFS共享的磁盘使用情况显示方式不同:
OutputFilesystem 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
打印人类可读的输出:
Output44K /nfs/home
这向您显示整个主目录的内容仅使用了可用空间的44K。
步驟 6 — 測試 NFS 存取
接下來,通過對每個共享目錄寫入內容來測試存取。
範例 1:一般用途共享
首先,在 /var/nfs/general
共享目錄寫入測試檔案:
然後,檢查其擁有權:
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
中創建一個檔案:
然後檢查文件的所有權:
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權限使用您喜歡的文本編輯器打開以下文件:
在文件末尾添加每個共享的一行,如下所示:
. . .
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
頁面中找到有關這裡指定的選項的更多信息。您可以運行以下命令來訪問它:
客戶端伺服器將在開機時自動掛載遠端分區,儘管建立連接並使共享可用可能需要一些時間。
第8步 — 卸載 NFS 遠端共享
如果您不再希望將遠端目錄掛載到系統上,您可以通過離開共享的目錄結構並卸載來取消掛載。
首先進入主目錄:
然後卸載/nfs/home
。請注意,命令的名稱是umount
而不是您可能期望的unmount
:
接下來,卸載/nfs/general
:
這將刪除遠端共享,僅使您的本地存儲可訪問:
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