1.NFS基於RPC機制
RPC: Remote Procedure Call 遠程過程調用
其機制爲:本地用戶基於本地接口訪問某一個對應目錄的時候,可以將目錄中的內容通過內核中的某些機制封裝以後,並通過RPC將用戶請求完整的傳遞給另外一臺主機的內核,並由另一臺主機的內核解析爲本地子系統的一種服務請求,這樣就能實現客戶端像使用本地的某種機制一樣來調用遠程服務器上所提供的某種功能。
其重要功能在於文件數據在主機之間傳輸的時候,完全可以基於二進制的格式實現,此效率遠遠優於基於應用層的TCP/IP的封裝機制。能夠彌補客戶端服務器端的數據差異性
NFS起源:
NFS有Sun公司研發,版本有
NFSv1(Sun公司內部使用)
NFSv2(公開使用),linux引入了NFSv2
NFSv3:支持異步傳輸,支持tcp協議,支持64位的文件
NFSv4:針對NFSv3而言,RPC的某些功能整合到了NFS當中去
2.NFS工作原理
RPC的主要功能就是在指定每個NFS功能所對應的端口號,並且回報給客戶端,讓客戶端連接到正確的端口號。RPC 是使用固定端口號111來工作的。
nfs server端的端口是tcp/2049和udp/2049
當客戶端發出請求時,先到達一個能幫助server認證的地方,rpc.mounted
NFS的會話建立過程
客戶端先去連接服務器端的RPC,在RPC上是由一個叫做portmap的程序提供的,他監聽在111/TCP和111/UDP,RPC根據客戶端的請求,將本地主機上對應的NFS來驗證身份的rpc.Mounted端口返回給客戶端;客戶端就向rpc.mountd發起連接請求(主要驗證來源的IP地址是否是我們允許的客戶端,其次驗證客戶端的UID和GID並檢查其合法性),然後會給客戶端一個令牌,客戶端就可以拿着令牌跟服務器的NFS進行通信,接下來客戶端可能就要對其文件進行讀寫等操作,那麼就必須通過服務器的locked()服務進行鎖的申請,爲了保證在操作過程中通信中斷後鎖丟失的情況,服務器端會通過rc.statd輸出鎖狀態,保證客戶端持有鎖信息。
3.nfs實在內核中實現的 grep -I nfs /boot/config-2.6.18-308.e15
nfs 的輔助性進程由兩個服務腳本來實現的,而這是由一個叫做nfs-utils的rpm包生成的。腳本位於/etc/rc.d/init.d/nfs /etc/rc.d/init.d/nfslock
定義nfs的文件系統共享定義配置文件:/etc/eports
啓動nfs服務:service nfs start
Nfs是基於本地的RPC服務的,那麼在啓動nfs服務之前要查看此服務是否啓動:service portmap status ,一般而言本地的RPC服務都是啓動的。
查看本地主機都啓動了那些RPC進程:rpcinfo -p localhost
4.配置共享文件系統
Nfs的所有定義都是在/etc/exports當中定義實現的,此文件中每一行定義一個共享的文件系統,並且包含了使用空格隔開的能夠訪問這個共享文件系統的客戶端列表以及其訪問權限(客戶端列表主要是主機名稱或IP地址)
eg: /data 172.16.0.0/16(訪問屬性) 10.0.0.0/8(訪問屬性)
註釋:/data可以被上面的兩個網段訪問
客戶端列表間用空格分割
多個屬性間用逗號分割
客戶端和其屬性之間不能有其他任意字符而是直接跟上用小括號括起來的屬性列表
客戶端的表示方法:
可以是單個主機:IP或主機名
可以使用通配符:用於通配主機名,*, ?
Eg: *.yang.com 表示此域內所有主機
可以是網絡地址:
可以使用掩碼格式:eg:172.16.0.0/255.255.0.0
也可以使用CIDR格式:172.16.0.0/16
常用屬性:
ro:只讀
rw:讀寫
sync:同步寫入,爲了效率考慮一般不使用,除非爲了數據安全
async:異步寫入
root_squash: 使用者的權限將被壓縮成爲匿名使用者,通常他的 UID 與 GID 都會變成 nobody 那個系統賬號的身份,默認都爲此項
all_squash
no_root_squash:不擠壓root用戶,此項極不安全,一定要慎用!!!
eg:現在要把/mydata共享,要求如下:給172.16.0.0這個網段讀寫訪問,而192.168.0.0這個網段只讀訪問,操作如下:編輯/etc/exports
vim /etc/exports
/mydata 172.16.0.0/16(rw,no_root_squash) 192.168.0.0/24(ro)
//保存退出,要想其生效,重啓服務:service nfs restart
如果此前已經定義了一個或幾個文件系統而且服務一起開啓,此時再定義一個的話,那麼爲了不影響前面定義的文件系統,則需要重新導出。。。。
重新導出的命令:exportfs
常用選項: -a:導出所有目錄
-r:重新導出所有目錄
-u:取消導出一個或多個目錄
-v:表示顯示詳細過程
其組合用法:-rav:重新導出所有目錄,並詳細顯示其過程
-uav:取消導出所有目錄
關閉導出的用法:exportfs -u CLIENT:DIRECTORY
當導出完畢後,那麼我們需要查看的話,還有一個查看導出的命令
showmount 查看導出
-a server_ip: 顯示某服務器導出文件系統中所有任何客戶所使用的文件系統的情況列表
-e server-ip: 用於顯示某server上所有導出的文件系統eg:showmount -e 172.16.7.1
-d server_ip: 用於顯示某服務器導出的所有文件系統中至少被掛載使用的文件系統
實例:驗證客戶端是如何訪問服務器端的文件系統的
客戶端IP:172.16.7.2
服務器端IP:172.16.7.1
服務器端共享的目錄爲:/mydata
如果把服務器端的/mydata放到客戶端來使用的話,步驟如下:
1. 先掛載,如果掛載到客戶端的/web/discuz目錄下,則:
mount -t nfs 172.16.7.1:/mydata /web/discuz
2. 共享文件系統最終權限取決於文件的共享權限和文件系統權限的交集
如果客戶端有hive這個用戶,那麼在服務器端要修改文件的權限:setfacl -m u:hive:rwx /mydata/
3. 在客戶端:切換到hive用戶就可以執行相應的權限
註釋:對NFS自動掛載的說明:
關於mount,如果是一個網絡設備的話,要實現開機自動掛載:那麼在/etc/fstab中編輯,指定其爲網絡設備:
172.16.7.1:/mydata /web/discuz nfs defaults,_netdev 0 0