NFS概述
NFS 就是 Network FileSystem 的縮寫,最早之前是由Sun所發展出來的。他最大的功能就是可以透過網絡,讓不同的機器、不同的操作系統、可以彼此分享自己的文件 ( share file ),所以也可以簡單的將他看做是一個 file server。這個NFS Server可以讓你的PC來將網絡遠程的 NFS主機分享的目錄,掛載到本地端的機器當中,所以,在本地端的機器看起來,那個遠程主機的目錄就好象是自己的partition一樣。這裡遠程的那台給你共享的機器就是server,而你的pc就是client。
NFS協議從誕生到現在為止,已經有多個版本,如NFS V2(rfc1094),NFS V3(rfc1813),最新的版本是V4(rfc3010)。
V3相對V2的增加了很多功能,其中一個重要的功能就是增加了異步寫入特性功能,下面是它的介紹:
NFS V3 能否使用異步寫入,這是可選擇的一種特性。NFS V3客戶端發發送一個異步寫入請求到服務器,在給客戶端答復之前服務器並不是必須要將數據寫入到存儲器中(穩定的)。服務器能確定何時去寫入數據或者將多個寫入請求聚合到一起並加以處理,然後寫入。客戶端能保持一個數據的copy以防萬一服務器不能完整的將數據寫入。當客戶端希望釋放這個copy的時候,它會向服務器通過這個操作過程,以確保每個操作步驟的完整。異步寫入能夠使服務器去確定最好的同步數據的策略。使數據能盡可能的同步的提交何到達。與V2 比較來看,這樣的機制能更好的實現數據緩沖和更多的平行(平衡)。而NFS V2的SERVER在將數據寫入存儲器之前不能再相應任何的寫入請求。
那麼NFS到底是怎麼實現的?
RPC概述
雖然 NFS 有屬於自己的協議與使用的port number,但是在資料傳送或者其它相關訊息傳遞的時候,NFS使用的則是一個稱為遠程過程調用(Remote Procedure Call, RPC)的協議來協助 NFS 本身的運作。
當我們在使用某些服務來進行遠程聯機的時候,有些信息,例如主機的IP、服務的port number、與對應到的服務之PID等等,都需要管理與對應。這些管理 port的對應與服務相關性的工作,就是這個Remote Procedure Call, RPC的任務了。
NFS 本身的服務並沒有提供資料傳遞的協議,但是 NFS卻能讓我們進行檔案的分享,這其中的原因,就是NFS使用到一些其它相關的傳輸協議。而這些傳輸的協議,就是使用到這個所謂的RPC的功能。這也就是說,NFS本身就是使用RPC的一個program而已,說的更白話一點, NFS 也可以視作是一個 RPC server。
同時要注意到的是,在某些狀況中,不但跑NFS的Server需要激活RPC的服務,連帶的,要掛載NFS partition的Client機器,也需要同步激活RPC才行。原因就是這樣做才能使Server端與Client端能藉由RPC的協議來進行program port的對應。NFS主要在管理分享出來的目錄,而至於資料的傳遞,就直接將他丟給RPC的協議來運作就行了。
那麼要訪問Server端的文件,需要哪些後台程序,也就是Server端要提供NFS的服務,需要有哪些daemon程序支持?由前面的討論可以知道nfs server其實就是一個rpc server,因此提供nfs的daemon 就是rpc daemon。
NFS Server的RPC daemons
客戶端要訪問nfs server的文件,NFS Server端必須NFS的服務,NFS的服務是由以下兩個後台進程來完成的。
2、 rpc.mountd:這個daemon主要的功能,就是是管理NFS的文件系統。
當Client端順利的通過rpc.nfsd而登入主機之後,在他可以使用NFS server提供的檔案之前,還會經過檔案使用權限(就是那個 -rwxrwxrwx 與 owner, group 那幾個權限) 的認證程序。他會去讀NFS的設置文件/etc/exports來比對 Client 的權限,當通過這一關之後, Client就可以取得使用NFS文件的權限。(注:這個也是我們用來管理 NFS 分享之目錄的使用權限與安全設定的地方)。
要讓NFS運行起來,對外提供服務,一共需要兩個套件的支持。分別是:
1、 nfs-utils:就是提供rpc.nfsd及rpc.mountd這兩個NFS daemons與其它相關documents與說明文件、執行檔等的套件,這個就是NFS的主要套件。
2、 portmap:提高端口映射的功能。
就如同剛剛提的到,我們的NFS其實可以被視為一個RPC server program,而要激活任何一個RPC server program之前,我們都需要做好port的對應(mapping)的工作才行,這個工作其實就是『portmap』這個服務所負責的。也就是說,在激活任何一個RPC server之前,我們都需要激活portmap才行。
那麼這個portmap到底在干嘛呢?就如同這個服務的名稱,就是作port的mapping。舉個例子來說:當Client端嘗試來使用RPC server所提供的服務時,由於Client需要取得一個可以連接的port才能夠使用RPC server所提供的服務,因此,Client首先就會去跟 portmap講『可不可以通知一下,給我個port number,好讓我可以跟RPC聯絡吧!』,這個時候portmap就自動的將自己管理的port mapping告知 Client ,好讓他可以連接上server 來。
所以:『激活 NFS 之前,請先激活portmap』
NFS客戶端的設定
所謂客戶端的設定,其實就是說客戶端該如何掛載主機的目錄,當然是使用mount目錄,它的語法格式:
#mount -t nfs hostname(orIP):/directory /mountpoint
為了擔心會不小心將NFS端掛進來的具有SUID權限檔案的程序執行,root可以將NFS 所分享的目錄以較為安全的情況掛載進來,可以
#mount -t nfs -o nosuid,ro hostname:/directory /mountponit
有關mount nfs的其它可選參數:
1、HARD mount和SOFT MOUNT:
HARD:NFS CLIENT會不斷的嘗試與SERVER的連接(在後台,不會給出任何提示信息,在LINUX下有的版本仍然會給出一些提示),直到MOUNT上。
SOFT:會在前台嘗試與SERVER的連接,是默認的連接方式。當收到錯誤信息後終止mount嘗試,並給出相關信息。
例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs
對於到底是使用hard還是soft的問題,這主要取決於你訪問什麼信息有關。例如你是想通過NFS來運行X PROGRAM的話,你絕對不會希望由於一些意外的情況(如網絡速度一下子變的很慢,插拔了一下網卡插頭等)而使系統輸出大量的錯誤信息,如果此時你用的是HARD方式的話,系統就會等待,直到能夠重新與NFS SERVER建立連接傳輸信息。另外如果是非關鍵數據的話也可以使用SOFT方式,如FTP數據等,這樣在遠程機器暫時連接不上或關閉時就不會掛起你的會話過程。