The 網路檔案系統 (NFS) 是一種分散式儲存解決方案。它是一種檔案系統協定,允許在本地伺服器上掛載遠端目錄,並像使用本地儲存一樣使用它。NFS 允許多個用戶端共享遠端儲存。它非常適合定期需要共享資源的環境。NFS 建立在 ONC RPC(Open Network Computing Remote Procedure Call,開放網路運算遠端程序呼叫)系統上。它是 RFC(Request for Comments,請求意見稿)中定義的開放標準。這允許任何人實作該協定。
在本指南中, 我們將介紹在 Ubuntu 20.04 上設定和配置 NFS 掛載的步驟。
先決條件
正如 NFS 的描述所暗示的,NFS 配置有兩個部分:
-
主機: 實際儲存資料並與「用戶端」系統共享儲存空間。
-
用戶端: 連接到「主機」並像使用本地儲存一樣使用遠端儲存的系統。
在我們的示範中,我們將使用兩台伺服器,均配置為 Ubuntu 20.04。這裡有一份簡單的指南,介紹 如何設定您的 Ubuntu 伺服器。在整個指南中,這些伺服器將被稱為 主機 和 用戶端。請注意,針對 用戶端 的操作,即使有多個用戶端也是相同的。
這些伺服器被分配了以下 IP 位址。這些伺服器由 CloudSigma 託管:
-
主機: 31.171.240.79
-
用戶端: 31.171.250.109
請確保將它們替換為適當的 IP 位址。
安裝 NFS
NFS 可以直接從 Ubuntu 官方套件庫中取得。針對 主機 和 用戶端 系統有不同的軟體套件。
-
在主機上安裝 NFS
在主機上,我們需要使機器能夠作為 NFS 主機 運作的元件。它以套件 nfs-kernel-server 的形式提供。Ubuntu 使用 APT 作為套件管理器。首先,啟動終端機,並更新 APT 套件資料庫:
|
1 |
host$ sudo apt update |

接下來,安裝 nfs-kernel-server 套件。如果需要, APT 將處理任何額外的相依性:
|
1 |
host$ sudo apt install nfs-kernel-server |

-
在用戶端上安裝 NFS
在 用戶端 系統上,我們需要透過網路連接到 主機 目錄的功能。它不需要 NFS 伺服器功能。在 Ubuntu 上,它隨附在套件 nfs-common 中。更新 APT 套件資料庫:
|
1 |
client$ sudo apt update |

然後,安裝 nfs-common 套件:
|
1 |
$ sudo apt install nfs-common |

主機上的共享目錄
接下來,我們將共享兩個獨立的目錄,每個目錄都有不同的配置。我們將展示 NFS 掛載在超級使用者存取方面的兩種主要運作方式。預設情況下,超級使用者有權在整個系統上執行任何操作。然而,NFS 掛載的目錄並不是它們所掛載系統的一部分。NFS 伺服器將拒絕執行任何需要超級使用者權限的操作。這種限制意味著用戶端無權在 NFS 掛載上進行寫入、重新分配所有權以及其他超級使用者任務。
可以允許某些受信任的使用者在掛載的檔案系統上執行這些任務。然而,這伴隨著一定的風險,因為這樣的 用戶端 可能會獲得對 主機 的完整存取權限。這可以透過適當的使用者權限管理來緩解。在 Linux 上,sudoers 檔案控制系統上的所有使用者權限。如需更多資訊,您可以參考我們關於 如何配置 Linux sudoers 檔案.
-
通用掛載
第一個範例將是具有預設 NFS 行為的通用 NFS 掛載。在這種方法中,用戶端極難在掛載上執行超級使用者操作。這種類型的 NFS 掛載通常用於檔案儲存、使用 CMS(內容管理系統)上傳或共享專案檔案等。
以下步驟將在 主機 系統上執行。首先,建立一個用於共享的目錄,命名為 nfs:
|
1 |
host$ sudo mkdir -pv /var/nfs/general |

由於該目錄是使用 建立的sudo 權限,因此擁有者將會是 root:
|
1 |
$ ls -la /var/nfs/general |

作為預設設定,NFS 會出於安全考量將來自用戶端的任何 root 操作轉換為 nobody:nogroup 憑證。為了保持一致性,請變更目錄擁有權以符合該憑證:
|
1 |
host$ sudo chown nobody:nogroup /var/nfs/general |
![]()
-
家目錄
第二個範例是讓 的家目錄host 使用者可供用戶端使用。來自所選用戶端的受信任管理員可以進行存取,以便方便地管理使用者。 /home 目錄預設已存在,因此無需建立任何目錄。至於目錄權限,則無需進行任何變更,因為這帶來的問題會多於好處。
設定 NFS 匯出
要分享的目錄現在已經建立。接下來,必須設定 NFS 以使其可供用戶端使用。NFS 使用設定檔來記錄要分享哪些目錄。在您選擇的文字編輯器中開啟以下 NFS 設定檔:
|
1 |
host$ sudo nano /etc/exports |

該檔案的註解部分說明了設定的一般語法結構。簡而言之,任何目錄都必須以以下格式宣告:
|
1 |
$ <directory> <client>(<option_1>,<option_2>,...,<option_N>) |
對於我們決定分享的這兩個目錄,設定將如下所示。這兩個目錄幾乎具有相同的設定選項:
|
1 2 3 |
host$/var/nfs/general 31.171.250.221(rw,sync,no_subtree_check) host$ /home 31.171.250.221(rw,sync,no_root_squash,no_subtree_check) |

以下是設定選項的快速說明:
-
rw:用戶端被授予對該磁碟區的讀取和寫入權限。
-
sync:強制 NFS 在回應之前將變更寫入磁碟。這提供了更穩定且一致的體驗。回應將反映遠端磁碟區的實際狀態。然而,檔案操作的速度會較慢。
-
no_subtree_check:防止子樹狀目錄檢查。如果不停用,主機將被迫針對來自用戶端的每個請求檢查該檔案是否存在於匯出的樹狀目錄中。這可能會導致許多問題,例如,在用戶端使用檔案時重新命名該檔案。在大多數情況下,停用子樹狀目錄檢查是最佳選擇。
-
no_root_squash:如前所述,NFS 會將來自遠端 root 使用者的任何請求轉換為非特權使用者。這是一項旨在防止對主機系統進行未授權存取的安全功能。然而,使用此選項將停用此行為。
儲存設定檔並結束編輯器。若要使變更生效,請重新啟動 NFS 伺服器:
|
1 |
host$ sudo systemctl restart nfs-kernel-server |
![]()
調整防火牆
對於任何伺服器,正確的防火牆設定都是必須的。假設您已經相應地設定了您的 Ubuntu 20.04 伺服器,UFW 防火牆應該是啟動狀態。這是一個簡單但功能強大的防火牆,大多數 Linux 發行版都隨附。對於初學者,這裡有一個快速指南解釋 UFW、其運作方式以及常見的 UFW 使用範例.
預設情況下,防火牆會封鎖任何傳入和傳出的流量。為了確保 NFS 伺服器能夠正常連線並交換流量,我們需要為 NFS 協定新增一個例外規則。首先,檢查防火牆的狀態。它也會列印出所有目前的規則:
|
1 |
host$ sudo ufw status |

如我們所見,系統僅允許 SSH 流量。我們需要新增一個例外規則以允許 NFS 流量。
在大多數情況下,強烈建議使用最嚴格的規則,同時仍允許必要的流量。因此,我們將僅允許特定的用戶端連線到主機:
|
1 |
host$ sudo ufw allow from 31.171.250.221 to any port nfs |

之後,再次檢查防火牆狀態:
|
1 |
host$ sudo ufw status |

建立掛載點
伺服器現在已準備好允許 client 系統連接到 NFS 協定。接下來,我們必須準備 client。要存取遠端磁碟區,必須將其本機掛載於 client。至於掛載點,建議使用專用的空目錄。
針對這兩個遠端磁碟區,建立兩個獨立的掛載點:
|
1 |
client$ sudo mkdir -pv /nfs/general |

|
1 |
client$ sudo mkdir -pv /nfs/home |

現在掛載點已準備就緒,您需要掛載遠端磁碟區:
|
1 |
client$ sudo mount 31.171.240.236:/var/nfs/general /nfs/general |
![]()
|
1 |
client$ sudo mount 31.171.240.236:/home /nfs/home |
![]()
我們可以驗證掛載是否成功。檢查所有已掛載磁碟區的清單:
|
1 |
client$ df -h |

太棒了!遠端磁碟區已成功掛載。我們也可以使用以下指令檢查空間使用情況:
|
1 |
client$ du -sh /nfs/home |

測試 NFS 存取
到目前為止,遠端磁碟區已正確掛載。然而,如果用戶端無法在遠端磁碟區上讀取/寫入資料,這將毫無用處。為了驗證,請在 NFS 掛載點上建立一個虛擬檔案。在這裡,將使用 root 權限建立檔案,以測試 root 特定的設定是否正常運作:
|
1 |
client$ sudo touch /nfs/general/write_test.txt |
![]()
接下來,檢查檔案的所有權:
|
1 |
client$ ls -l /nfs/general/write_test.txt |

如我們所見,NFS 正在將檔案擁有者轉換為 nobody:nogroup。 /var/nfs/ general 目錄的所有權為 nobody:nogroup,因此 NFS 正在轉換檔案所有權。是時候測試另一個 NFS 掛載了:
|
1 |
client$ sudo touch /nfs/home/test_home.txt |
![]()
檢查檔案是否存在以及其所有權:
|
1 |
Client $ ls -l /nfs/home/test_home.txt |

在這種情況下,NFS 並沒有轉換檔案的所有權。此用戶端已設定為能夠執行管理操作。此外,原始的 host 目錄 /home 並不擁有 nobody:nogroup.
附加技巧
-
開機時掛載
到目前為止,我們必須手動將 NFS 磁碟區掛載到本機目錄。如果未卸載,NFS 掛載將持續到系統重新啟動。如果定期使用 NFS 磁碟區,手動掛載會變得極其繁瑣。在有多個 NFS 掛載的情況下,逐一手動掛載是不切實際的。
使用 /etc/fstab 檔案,我們可以將此程序自動化。在開機期間,此指令碼將自動在目標掛載點上掛載 NFS 磁碟區。在文字編輯器中開啟該檔案:
|
1 |
client$ sudo nano /etc/fstab |

新增以下行以掛載主機系統的遠端磁碟區:
|
1 2 3 |
client$ 31.171.240.236:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 client$31.171.240.236:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 |

儲存指令碼並關閉文字編輯器。在下次開機時,Linux 將自動掛載遠端磁碟區。請注意,由於系統需要連接並掛載磁碟區,開機可能需要一些時間。
-
卸載 NFS 磁碟區
如果不再需要遠端磁碟區,則卸載磁碟區將會從用戶端系統中移除它們。然而,在卸載之前,請確保沒有應用程式/指令碼正在使用該遠端磁碟區。卸載 NFS 掛載與卸載任何其他掛載類似。在這種情況下,卸載 /nfs/home 和 /nfs/general:
|
1 2 3 |
client$ sudo umount /nfs/home client$ sudo umount /nfs/一般 |

接著,驗證此操作:
|
1 |
用戶端$ df -h |

結語
在本指南中,我們建立了一個 NFS 伺服器,並示範了 NFS 遠端分享的一些基本概念。如果您有興趣在生產環境中部署 NFS,請記住 NFS 協定並未加密。這可能會帶來一些安全性疑慮,例如中間人攻擊。
祝您使用愉快!
留言
目前尚無留言。成為第一個留言的人吧。