NFS基本原理及實現

本文旨在複習NFS基本原理及其實現
html


知識儲備centos


1.NFS是將網絡上某臺主機的共享目錄映射到本地,直接對其進行操做,NFS也是NAS的一種解決方案安全

2.該共享目錄必須是已建立文件系統的,而無需格式化、建立文件系統等,這便是SAN和NAS的區別bash

3.NFS本質是經過RPC調用實現的服務器

4.對於Linux而言,文件系統是在內核空間實現的,即文件系統好比ext三、ext4等是在Kernel啓動時,之內核模塊的身份加載運行的,固然了具體文件系統選擇能夠在編譯和裁剪內核時修改。網絡


什麼是RPC?併發


RPC:Remote Procedure Call Protocol,程序可使用這個協議請求網絡中另外一臺計算機上某程序的服務而不需知道網絡細節,甚至能夠請求對方的系統調用。基於C/S模型的!異步


RPC工做流程:async

  Client端僅須要發起RPC Call,同時傳遞必要參數;ide

  Server端的守護進程一方面監聽客戶端的RPC Call,另外一方面引領這些RPC Call來調用本地的程序或者系統服務來執行,這些程序在執行時仍是用客戶端傳遞來的參數。

wKioL1YxgrmBN4q_ABOGOKAqo84764.bmp

參考文章

    http://blog.csdn.net/mindfloating/article/details/39474123

    http://wiki.dzsc.com/info/8466.html


NFS實現原理


對於客戶端而言,直接使用mount掛載遠程的NFS,而後像操做本地目錄同樣操做便可;

對於服務器,實現NFS有幾個關鍵組件:

NFS quotas

  用於實現磁盤配額的高級功能,當客戶端掛載NFS後能夠限制使用磁盤空間大小;    

NFS mountd

  NFS藉助於RPC,僅支持基於IP的認證,由於這是一種遠程過程的調用,而不是請求/響應服務,沒有認證能力。那麼如何實現認證呢?是經過輔助進程mountd來實現的,mountd負責發放令牌!多個mountd進程能夠監聽在不一樣的端口號上,前提這些端口號都事先在RPC統一調度管理器rpcbind中註冊過,從而實現多個用戶併發訪問;

  1.客戶端想要掛載NFS時,去問Server端的rpcbind;

  2.rpcbind查詢本身的註冊表,選擇一個已經註冊的mountd進程和端口號;

  3.mountd完成對客戶端的身份認證,發放令牌給客戶端;

  4.客戶端接着訪問nfsd TCP/UDP 2049進行掛載後的正常操做

  因此,mountd進進程實際上是輔助進程,是爲了加強nfsd完成用戶身份認證的能力的!

NFS idmapd

  用戶掛載了遠端的NFS,那麼建立的文件的屬主屬組是誰呢?若是客戶端A用用戶名test建立了文件,而NFS Server上又沒有test用戶,那該咋辦?

 idmapd很好地解決了這個問題,是客戶端和服務器端帳號映射關係的解決工具。


NFS配置文件


NFS Server配置文件/etc/exports,只須要遵循格式,附加參數便可!這個文件可能不存在,建立便可。格式爲:

文件系統      客戶端1(選項)    客戶端2(選項)  ...

客戶端:

只容許某個IP 10.134.140.64
只容許某個網段 10.134.140.64/24,10.134.140.64/255.255.255.0
只容許某個FQDN www.centos.org 前提能解析
只容許某個Domain *.centos.org 前提能解析


經常使用選項:

secure
缺省選項,使用1024如下的TCP端口實現 NFS 的鏈接。指定 insecure 可禁用;
async 異步,即全部數據變更不直接寫到磁盤,先放內存,達到提交點再寫入,可改善性能;
no_wdelay 關閉寫延時;
nohide 若是將一個目錄掛載到另一個目錄上,原來目錄一般就被隱藏。要禁用這種行爲,需啓用 hide 選項。
no_subtree_check 關閉子樹檢查,子樹檢查會執行一些不想忽略的安全性檢查。缺省選項是啓用子樹檢查。
no_auth_nlm 不對加鎖請求進行認證。若是關心安全性,避免使用該選項。缺省選項是 auth_nlm 或 secure_locks。
mp 顯式地聲明這個選項,NFS 要求掛載所導出的目錄
fsid=num NFS 故障恢復的狀況中使用。如但願實現 NFS 的故障恢復,請參考 NFS 文檔。

用戶映射選項:

root_squash 不容許 root 用戶訪問掛載上來的 NFS 卷
no_root_squash 容許 root 用戶訪問掛載上來的 NFS 卷
all_squash 限制全部的 UID 和 GID,只使用匿名用戶。缺省設置是 no_all_squash。
anonuid、anongid 將匿名 UID 和 GID 修改爲特定用戶和組賬號。

用戶映射選項本質是經過idmapd這個輔助進程來實現的,還記得嗎?


NFS實驗


實驗要求:

 1.NFS服務器共享目錄/mageedu給10.134.140.63/24訪問;

 2.以讀寫方式應用,要求異步;

 3.客戶端上存在,而服務器端不存在的用戶,所有映射爲服務器端的nfsuser用戶;

實驗步驟1.編輯NFS配置文件

useradd nfsuser
mkdir /mageedu && touch hello.txt
vi /etc/exports
/mageedu 10.134.140.63/24(rw,async,root_squash,anonuid=501,anongid=501)

實驗步驟2.客戶端查看並掛載NFS

showmount -e 10.134.140.63
mount -t nfs 10.134.140.63:/mageedu /mnt

wKioL1Yxq2WQINyoAAT5yJfbFE8763.bmp


實驗步驟3.驗證root權限

wKioL1Yxq4Cw8LeYAAPiOBToZRc394.bmp

這是由於啓用了root_squash後,root會被映射爲NFS Server上的匿名用戶來進行操做,而又附加了參數anonuid、anongid即指定了匿名用戶的身份是UID=501 GID=501的nfsuser這個用戶。

而該用戶在/mageedu上是沒有權限寫入的,能夠查看到!

wKiom1Yxrk7AwUAyAAD0dCeMnzU611.jpg


那麼不妨在NFS Server上的/mageedu目錄下建立一個讓nfsuser用戶可讀可寫的目錄,再來測試!

mkdir /mageedu/read_write
setfacl -m u:nfsuser:rwx /mageedu/read_write

wKioL1Yxr1Kg6sDWAAVV2O4JXJc653.bmp

此時再去服務器上看權限呢?

wKioL1Yxr9mC6Tk2AACt7lTpDP0969.jpg

至此,已經搭建完畢!


補充說明


  1. 實現開機自動掛載能夠編輯/etc/fstab,掛載選項建議加上 _netdev 這樣標識該掛載目錄爲網絡設備,若是找不到暫時不掛載,而不會阻塞下去;

  2. 掛載選項能夠按照需求調節rsize和wsize,接收緩衝區、發送緩衝區大小,可改善性能;

  3. 客戶端經常使用命令showmount、mount

  4. 服務器端經常使用命令rpcinfo、exports、exportfs[能夠在不重啓NFS服務的狀況下從新導入導出共享目錄]

相關文章
相關標籤/搜索