因為NFS是基於網絡的應用,屬於套接字程序,所以NFS服務端必須綁定端口,NFS服務端常用的端口為2049;
但是文件系統十分復雜,NFS有很多功能,每個不同的功能都需要不同的程序來完成,而每個程序都需要啟動端口傳輸數據,這些端口都是隨機產生並且小於1024的;
那麽問題來了,既然是隨機產生的端口,客戶端該如何得知呢?
答案是引入了RPC服務。
RPC(remote procedure call):遠程過程調用。
RPC最主要的功能就是指定每個NFS功能所對應的端口,並返回給客戶端,使客戶端可以連接到正確的端口上。
工作流程如下:
1、服務端:RPC要先於NFS啟動,RPC對外的端口是111,隨後NFS啟動,NFS會像操作系統申請壹些隨機端口分配給各個功能,並向RPC去註冊這些端口,RPC便將這些端口和所對應的功能記錄下來;
2、客戶端:當NFS客戶端需要連接到服務器上時,先啟動客戶端的RPC服務,客戶端的RPC向服務端的RPC 111端口索要功能對應的端口號;索要到端口號後,便連接到NFS服務對應功能的端口,隨後傳輸數據。
3、註意:即使客戶端已經獲取了端口號,客戶端仍會借助rpc做為中間人進行通信。也就是說,無論何時,客戶端和rpc所管理的服務的通信都必須通過rpc來完成。之所以如此,是因為只有rpc才能封裝和解封裝數據。
由於 NFS 的各項功能都必須要向 RPC 來註冊,如此壹來 RPC 才能了解 NFS 這個服務的各項功能之 port number, PID, NFS 在服務器所監聽的 IP 等等,而客戶端才能夠透過 RPC 的詢問找到正確對應的端口。 也就是說,NFS 必須要有 RPC 存在時才能成功的提供服務,因此我們稱 NFS 為 RPC server 的壹種。
事實上,有很多這樣的服務都是向 RPC 註冊的,舉例來說,NIS (Network Information Service) 也是 RPC server 的壹種。 妳也會知道,不論是客戶端還是服務器端,要使用 NFS 時,兩者都需要啟動 RPC 才行!
我們現在知道 NFS 服務器在啟動的時候就得要向 RPC 註冊,所以 NFS 服務器也被稱為 RPC server 之壹。
那麽 NFS 服務器主要的任務是進行文件系統的分享,文件系統的分享則與權限有關。
所以 NFS 服務器啟動時至少需要兩個 daemons ,壹個管理客戶端是否能夠登入的問題, 壹個管理客戶端能夠取得的權限。如果妳還想要管理 quota 的話,那麽 NFS 還得要再加載其他的 RPC 程序就是了。
我們以較單純的 NFS 服務來說:
最主要的 NFS 服務提供商。這個 daemon 主要的功能就是在管理客戶端是否能夠使用服務器文件系統掛載信息等, 其中還包含這個登入者的 ID 的判別。
這個 daemon 主要的功能,則是在管理 NFS 的文件系統。 當客戶端順利的通過 rpc.nfsd 而登入服務器之後,在他可以使用 NFS 服務提供的檔案之前,還會經過檔案權限 (就是那個 -rwxrwxrwx 與 owner, group 那幾個權限) 的認證程序。
他會去讀 NFS 的配置文件 /etc/exports 來比對客戶端的權限,當通過這壹關之後客戶端就可以取得使用 NFS 檔案的權限。(註:這個也是我們用來管理 NFS 分享之目錄的權限與安全設定的地方)
這個玩意兒可以用在管理檔案的鎖定 (lock) 用途。為何檔案需要『鎖定』呢? 因為既然分享的 NFS 檔案可以讓客戶端使用,那麽當多個客戶端同時嘗試寫入某個檔案時, 就可能對於該檔案造成壹些問題。
這個 rpc.lockd 則可以用來克服這個問題, 但 rpc.lockd 必須要同時在客戶端與服務器端都開啟才行。此外, rpc.lockd 也常與 rpc.statd 同時啟用。
可以用來檢查檔案的壹致性,與 rpc.lockd 有關。
若發生因為客戶端同時使用同壹檔案造成檔案可能有所損毀時, rpc.statd 可以用來檢測並嘗試回復該檔案。與 rpc.lockd 同樣的,這個功能必須要在服務器端與客戶端都啟動才會生效。
上述這幾個 RPC 所需要的程序,其實都已經寫入到兩個基本的服務啟動腳本中了。
***享存儲之NFS
.linux.vbird.org/linux_server/0330nfs.php
NFS設置固定端口,添加防火墻規則
/p/9fb004b30f1e
How to share home directory to client by NFS?
/p/f5dfb111a8e4