NFS初探
-
NFS概述
-
NFS工作流程
-
NFS Server端設置
-
NFS工具與命令
-
NFS配置實例
NFS概述
NFS是什么?
NFS,network file system(網絡文件系統)的縮寫,是一種實現文件共享的實現方式。
NFS的功能是什么
NFS基于RPC協議,實現遠程系統調用,共享文件資源。
NFS工作流程
RPC,Remote Procedure Call Protocol,遠程過程調用協議,是實現本地調用遠程主機實現系統調用的協議。 portmapper:負責分配RPC服務器的端口,并在客戶端請求時,負責響應目的RPC服務器端口返回給客戶端,工作在tcp與udp的111端口上。 mountd:是nfs服務的認證服務的守護進程,客戶端在收到返回的真正端口時,就會去連接mountd,認證取得令牌。 nfsd:nfs的守護進程,負責接收到用戶的調用請求后與內核發出請求并得到調用結果響應給用戶。 idmapd:是NFS的一個程序,用來負責遠程客戶端創建文件后的權限問題。 nfs Server: nfsd:NFS的守護進程,工作在tcp與udp的2049端口上。 mountd:NFS用來驗證客戶端信息的守護進程,工作在隨機端口。 rquotad:磁盤限額進程。 lockd:文件鎖。 idmapd:權限映射。
NFS Server端
所需安裝包
rpcbind:提供rpc服務(mapping) nfs-utils:提供nfs,mountd與其他相關程序。
NFS服務器端配置
相關文件: /etc/exports:nfs的主要設定文件。 /var/lib/nfs/*tab:設定記錄文件。 etab:共享目錄的完整權限設定。 xtab:曾經連接的客戶端資料。 /usr/sbin/exportfs:NFS分享資源命令,可以用來重新獲取共享文件設定,掛載,卸載等。 /usr/sbin/showmount:用來查看遠程主機的共享信息。
exports文檔設定格式
/PATH/TO/NFS_DIR CLITNES_IP1(OPTION1,OPTION2...) CLITNES_IP2(OPTION1,OPTION2...) ... 例如: /tmp/nfs 192.168.1.1(rw,root_squash,anonuid=50,anongid=50) 192.168.1.2(ro) 指定了共享文件夾為/tmp/nfs,192.168.1.1有讀寫權限,禁止root用戶登錄,使用的賬戶身份為uid/gid為50的賬號。 192.168.1.2只有ro權限,并使用默認身份,nobady。 常用的OPTION: rw / ro 讀寫/只讀 sync / async 同步傳輸/異步傳輸 root_squash / no_root-squash 壓縮root用戶權限/不壓縮root用戶權限 all_squash 所有用戶都壓縮權限。 anonuid=# / anongid=# 指定使用的用戶或組
權限相關:
當遠程用戶訪問共享文件夾時是使用什么權限呢?如果創建文件那么屬主和屬組又是什么呢? nfs默認是使用你本地主機當前用戶UID與GID相對應的身份來使用,如果遠程服務端沒有此用戶或組就會以數字的形式呈現。 如果是root用戶,那么在遠程主機上肯定就是使用root了,因為root默認的uid gid都是0! 這樣就太危險了,所以如果使用了root訪問,NFS會自動壓縮權限為最小權限nfsnobady。 當本地用戶使用不一樣的名字,UID卻是相同的創建文件,會通過idmapd這個進程來映射,所以你在遠程看到的還會是你原來的name。 當你將權限都設定完成后記得去更改服務器端文件夾的權限,推薦使用acl來設定,因為你的權限其實為 "用戶權限與文件夾權限的交集"。
NFS工具與命令
showmount:查看服務器端共享文件夾狀態的。
showmount [-ae] [hostname|ip] -a:顯示目前服務端與用戶端的NFS連線狀態。 -e:顯示目標服務器端exports所分享的目錄資料。
expartfs:重新讀取expart配置,無需重啟服務。
expartfs [-aruv] -a:全部讀取或者取消/etc/export配置。 -r:重新讀取export并更新/etc/exports /var/libnfs/xtab -u:卸載目錄。 -v:顯示重讀或卸載詳細信息到屏幕
NFS配置實例:
配置:
host1(192.168.1.1): [root@host1 nfs]# service nfs start 啟動nfs服務。 Starting NFS services: [ OK ] 啟動exportfs Starting NFS quotas: [ OK ] 啟動quotas Starting NFS mountd: [ OK ] 啟動mountd Starting NFS daemon: [ OK ] 啟動nfsd Starting RPC idmapd: [ OK ] 啟動idmapd [root@host1 ~]# echo '/tmp/nfs 192.168.1.2(rw,no_root_squash)' >> /etc/exports 寫入配置,不使用root權限壓縮。 [root@host1 ~]# mkdir -pv /tmp/nfs 創建共享文件夾。 [root@host1 ~]# exportfs -arv 讀入配置。 exporting 192.168.1.2:/tmp/nfs host2(192.168.1.2): [root@host2 ~]# showmount -e 192.168.1.1 查看192.168.1.1的export信息。 Export list for 192.168.1.1: /tmp/nfs 192.168.1.2 192.168.1.1的內容。 [root@host2 ~]# mount -t nfs 192.168.1.1:/tmp/nfs /tmp 掛載共享文件夾。
測試:
[root@host2 tmp]# touch test root身份創建test [root@host2 tmp]# ll total 0 -rw-r--r--. 1 root root 0 Apr 25 2016 test 可以看到user group為root [root@host1 nfs]# ll total 0 -rw-r--r--. 1 root root 0 Apr 25 19:32 test 服務端查看也為root
[root@host1 tmp]# echo '/tmp/nfs 192.168.1.2(rw,root_squash)' > /etc/exports 覆蓋寫入配置,使用root權限壓縮。 [root@host1 tmp]# exportfs -ar 讀入配置 [root@host1 tmp]# setfacl -m u:nfsnobody:rwx nfs/ 設置nfs/的權限,添加acl [root@host2 tmp]# touch test2 客戶端創建文件test2 [root@host2 tmp]# ll total 0 -rw-r--r--. 1 root root 0 Apr 25 2016 test -rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 25 19:45 test2 可以看到user group為nfsnobody的默認屬主屬組。
[root@host1 ~]# echo '/tmp/nfs 192.168.1.2(rw,root_squash,anonuid=500)' > /etc/exports 覆蓋寫入配置,指定登陸uid。 [root@host1 ~]# setfacl -m u:xiao:rwx /tmp/nfs/ 設置權限,添加acl [root@host1 ~]# exportfs -ar 讀入配置。 [xiao@host2 tmp]$ touch test3 客戶端使用對應UID用戶創建文件。 [xiao@host2 tmp]$ ll total 0 -rw-r--r--. 1 root root 0 Apr 25 2016 test -rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 25 19:45 test2 -rw-rw-r--. 1 xiao xiao 0 Apr 25 2016 test3 user group 為 xiao
原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/15665
配置完成后 客戶端要怎樣訪問服務器端呢?
@tomshen:一般通過將共享的文件夾掛載到本地的方式 如:
mount -t nfs serverip:/dir mountpoint