本文旨在複習NFS基本原理及其實現
知識儲備
1.NFS是將網絡上某臺主機的共享目錄映射到本地,直接對其進行操作,NFS也是NAS的一種解決方案
2.該共享目錄必須是已創建文件系統的,而無需格式化、創建文件系統等,這即是SAN和NAS的區別
3.NFS本質是通過RPC調用實現的
4.對於Linux而言,文件系統是在內核空間實現的,即文件系統比如ext3、ext4等是在Kernel啓動時,以內核模塊的身份加載運行的,當然了具體文件系統選擇可以在編譯和裁剪內核時修改。
什麼是RPC?
RPC:Remote Procedure Call Protocol,程序可以使用這個協議請求網絡中另一臺計算機上某程序的服務而不需知道網絡細節,甚至可以請求對方的系統調用。基於C/S模型的!
RPC工作流程:
Client端僅需要發起RPC Call,同時傳遞必要參數;
Server端的守護進程一方面監聽客戶端的RPC Call,另一方面引領這些RPC Call來調用本地的程序或者系統服務來執行,這些程序在執行時還是用客戶端傳遞來的參數。
參考文章
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
實驗步驟3.驗證root權限
這是因爲啓用了root_squash後,root會被映射爲NFS Server上的匿名用戶來進行操作,而又附加了參數anonuid、anongid即指定了匿名用戶的身份是UID=501 GID=501的nfsuser這個用戶。
而該用戶在/mageedu上是沒有權限寫入的,可以查看到!
那麼不妨在NFS Server上的/mageedu目錄下創建一個讓nfsuser用戶可讀可寫的目錄,再來測試!
mkdir /mageedu/read_write setfacl -m u:nfsuser:rwx /mageedu/read_write
此時再去服務器上看權限呢?
至此,已經搭建完畢!
補充說明
實現開機自動掛載可以編輯/etc/fstab,掛載選項建議加上 _netdev 這樣標識該掛載目錄爲網絡設備,如果找不到暫時不掛載,而不會阻塞下去;
掛載選項可以按照需求調節rsize和wsize,接收緩衝區、發送緩衝區大小,可改善性能;
客戶端常用命令showmount、mount
服務器端常用命令rpcinfo、exports、exportfs[可以在不重啓NFS服務的情況下重新導入導出共享目錄]