NFS(Network File System)即網絡檔案系統,是FreeBSD支援的檔案系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源
在NFS的應用中,本地NFS的用戶端應用可以透明地讀寫位于遠端NFS伺服器上的檔案,就像通路本地檔案一樣
nfs适用于Linux與Unix之間實作檔案共享,不能實作Linux與Windows間的檔案共享功能
nfs是運作在應用層的協定,其監聽于2049/tcp和2049/udp套接字上
nfs服務隻能基于IP進行認證
nfs有很多實際應用場景,以下是一些常用的場景:
多個機器共享一台CDROM或其他裝置。這對于在多台機器中安裝軟體來說更加便宜與友善
在大型網絡中,配置一台中心NFS伺服器用來放置所有使用者的home目錄可能會帶來便利。這些目錄能被輸出到網絡以便使用者不管在哪台工作站上登入,總能得到相同的home目錄
不同用戶端可在NFS上觀看影視檔案,節省本地空間
在用戶端完成的工作資料,可以備份儲存到NFS伺服器上使用者自己的路徑下
nfs體系至少有兩個主要部分:
一台nfs伺服器
若幹台客戶機
nfs體系的架構圖如下:

客戶機通過TCP/IP網絡遠端通路存放在NFS伺服器上的資料 在NFS伺服器正式啟用前,需要根據實際環境和需求,配置一些NFS參數
nfs是基于rpc來實作網絡檔案系統共享的。是以我們先來說說rpc。
RPC(Remote Procedure Call Protocol),遠端過程調用協定,它是一種通過網絡從遠端計算機程式上請求服務,而不需要了解底層網絡技術的協定。
RPC協定假定某些傳輸協定的存在,如TCP或UDP,為通信程式之間攜帶資訊資料。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。
RPC采用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。
rpc工作機制如上圖所示,下面來描述一下它:
用戶端程式發起一個RPC系統調用基于TCP協定發送給另一台主機(服務端)
服務端監聽在某個套接字上,當收到用戶端的系統調用請求以後,将收到的請求和其所傳遞的參數通過本地的系統調用執行一遍,并将結果傳回給本地的服務程序
服務端的服務程序收到傳回的執行結果後将其封裝成響應封包,再通過rpc協定傳回給用戶端
用戶端調用程序接收答複資訊,獲得程序結果,然後調用執行繼續進行
下面通過一個例子來說明NFS的簡單工作流程:
用戶端發起檢視file資訊的指令(ls file)給核心,核心通過NFS子產品得知此檔案并不是本地檔案系統中的檔案,而是在遠端NFS主機上的一個檔案
用戶端主機的核心通過RPC協定把檢視file資訊的指令(系統調用)封裝成rpc請求通過TCP的111端口發送給NFS服務端主機的portmapper
NFS服務端主機的portmapper(RPC服務程序)告訴用戶端說NFS服務端的mountd服務在某某端口上,你去找它驗證
因為mountd在提供服務時必須要向portmapper注冊一個端口号,是以portmapper是知道其工作于哪個端口的
用戶端得知服務端的mountd程序端口号後,通過已知的服務端mountd端口号請求驗證
mountd收到驗證請求後驗證發起請求的用戶端是否在允許通路此NFS檔案系統的用戶端清單中,在則允許通路(發放一個令牌,持令牌去找nfsd),否則拒絕通路
驗證通過後用戶端持mountd發放的令牌去找服務端的nfsd程序,請求檢視某檔案
服務端的nfsd程序發起本地系統調用,向核心請求檢視用戶端要檢視的檔案的資訊
服務端的核心執行nfsd請求的系統調用,并将結果傳回給nfsd服務
nfsd程序收到核心傳回的結果後将其封裝成rpc請求封包并通過tcp/ip協定傳回給用戶端
nfs的主配置檔案是/etc/exports,在此檔案中,可以定義NFS系統的輸出目錄(即共享目錄)、通路權限和允許通路的主機等參數。該檔案預設為空,沒有配置輸出任何共享目錄,這是基于安全性的考慮,如此即使系統啟動了NFS服務也不會輸出任何共享資源。
exports檔案中每一行提供了一個共享目錄的設定,其指令格式為:
其中,除輸出目錄是必選參數外,其他參數均是可選項。另外,格式中的輸出目錄和用戶端之間、用戶端與用戶端之間都使用空格分隔,但用戶端與選項之間不能有空格。
用戶端是指網絡中可以通路這個NFS共享目錄的計算機。用戶端的指定非常靈活,可為單個主機的IP或域名,亦可為某個子網或域中的主機等。
用戶端常用的指定方式:
用戶端
說明
172.16.12.129
指定IP位址的主機
172.16.12.0/24(或172.16.12.*)
指定子網中的所有主機
www.wangqing.com
指定域名的主機
*.wangqing.com
指定wangqing.com域中的所有主機
*(或預設)
所有主機
選項用來設定共享目錄的通路權限、使用者映射等。exports檔案中的選項比較多,一般可分為三類:
通路權限選項(用于控制共享目錄的通路權限)
使用者映射選項預設情況下,當用戶端通路NFS伺服器時,若遠端通路的使用者是root使用者,則NFS伺服器會将其映射成一個本地的匿名使用者(該使用者為nfsnobody),并将其所屬的使用者組也映射成匿名使用者組(該使用者組也為nfsnobody),如此有助于提高系統的安全性。
其他選項
通路權限選項:
通路權限選項
ro
設定輸出目錄隻讀
rw
設定輸出目錄可讀寫
使用者映射選項:
使用者映射選項
all_squash
将遠端通路的所有普通使用者及所屬組都映射為匿名使用者或使用者組(nfsnobody)
no_all_squash
不将遠端通路的所有普通使用者及所屬使用者組都映射為匿名使用者或使用者組(預設設定)
root_squash
将root使用者及所屬使用者組都映射為匿名使用者或使用者組(預設設定)
no_root_squash
不将root使用者及所屬使用者組都映射為匿名使用者或使用者組
anonuid=xxx
将遠端通路的所有使用者都映射為匿名使用者,并指定該匿名使用者為本地使用者帳戶(UID=xxx)
anongid=xxx
将遠端通路的所有使用者組都映射為匿名使用者組,并指定該匿名使用者組為本地使用者組(GID=xxx)
常用的其他選項:
secure
限制用戶端隻能從小于1024的TCP/IP端口連接配接NFS伺服器(預設設定)
insecure
允許用戶端從大于1024的TCP/IP端口連接配接NFS伺服器
sync
将資料同步寫入記憶體緩沖區或磁盤中,效率較低,但可保證資料一緻性
async
将資料先儲存在記憶體緩沖區中,必要時才寫入磁盤
wdelay
檢查是否有相關的寫操作,如果有則這些寫操作一起執行,可提高效率(預設設定)
no_wdelay
若有寫操作則立即執行,應與sync配置使用
subtree_check
若輸出目錄是一個子目錄,則NFS伺服器将檢查其父目錄的權限(預設設定)
no_subtree_check
即使輸出目錄是一個子目錄,NFS服務亦不檢查其父目錄的權限,可提高效率
nohide
若将一個目錄挂載到另一個目錄之上,則原來的目錄通常就被隐藏起來或看起來像空的一樣。要禁用這種行為,需啟用hide選項
nfs安裝:
使用shoumount指令測試NFS伺服器的輸出目錄狀态:
在用戶端挂載NFS檔案系統:
在用戶端設定開機自動挂載nfs:編輯/etc/fstab檔案,添加如下格式的内容
用戶端挂載時可以使用的特殊選項:
rsize:其值是從伺服器讀取的位元組數(緩沖)。預設為1024。若使用比較高的值,如8192,可以提高傳輸速度
wsize:其值是寫入到伺服器的位元組數(緩沖)。預設為1024。若使用比較高的值,如8192,可以提高傳輸速度
作業
在用戶端測試