基礎知識篇node
NFS是Network File System的簡稱,它的目的想讓不一樣的機器,不一樣的操做系統能夠彼此共享數據文件。web
一、它須要啓動PRC+NFS服務,需首先啓動RPC,而後啓動NFSvim
二、RPC的做用是將服務器中註冊的NFS的port number通知給clientbash
三、NFS的端口號通常爲2049,但不肯定,緣由是文件系統較爲複雜。它用來傳輸的端口是隨機選擇且小於1024服務器
1、NFS的文件訪問權限
app
一、NFS Server/NFS Client恰好有相同的帳號與用戶async
此時用戶能夠直接以zj(假定爲客戶端的普通帳號)的身份訪問服務器所提供的共享文件系統tcp
二、NFS Server的501這個UID帳號對應爲yf(假定爲服務端的一個普通帳號)ide
若是客戶端的ql(假定爲客戶端的另外一個普通帳號)剛好對應服務器端的yf,則客戶端的ql能夠訪問服務器端的yf,只由於二者擁有相同的UID。但用戶名不相同,因此ql只會以匿名的方式訪問yf(可參考補充部分的內容)。提到了這裏你可能會想到,那root的UID不都爲0嗎?這樣一來客戶端的權限不是很大。然而結果不是這樣的。服務器端默認會將客戶端的root用戶壓縮爲匿名用戶ui
三、若是用戶身份是root
在默認的狀況下,root的身份會被主動壓縮成爲匿名用戶
四、NFS Server並無501這個UID
此種狀況的後果是服務器端將UID爲501的這個用戶壓縮爲匿名用戶,以匿名用戶的身份訪問服務器
具有了以上四種條件後,還應該具有如下二種條件
一、NFS服務器已經開放可寫入的權限(與/etc/exports文件有關)
二、實際的文件權限具備可寫入(w)的權限
總結下來無非此三句話
一、UID與帳戶的相關性
二、NFS服務器容許寫入的權限
三、文件系統確實具備w的權限,此時你才具備該文件的寫入權限
2、/etc/exports配置文件的語法與參數
值得一提的是NFS會直接使用到內核功能,因此內核必需要支持NFS才行。使用uname -r查看其版本
配置文件權限參數
sync 表明數據會同步寫入到內存與硬盤中,此種方式速度過慢
async 表明數據會先暫時存放在內存中而後保存在硬盤上,此種方式速度較快
no_root_squash 不將客戶端中的root用戶壓縮爲nfsnobody(匿名用戶)
root_squash 將客戶端中的root用戶壓縮爲nfsnobody(匿名用戶)
all_squash 不管是什麼用戶都將被壓縮成爲nfsnobody(匿名用戶)
anonuid 指的是UID,能夠自行指定該值,但必須存在
anongid 指的是UID,能夠自行指定該值,但必須存在
3、mount命令主要參數
suid/nosuid 當掛載的分區上面有任何SUID的二進制程序時,只要使用nosuid就可以取消其功能
rw/ro 提供客戶端可寫/可讀的權限
dev/nodev 是否能夠保留設備文件的特殊功能
exec/noexec 是否具備執行二進制文件的權限,視具體的狀況而定
user/nouser 是否容許用戶進行文件的掛載與卸載操做,最好不容許
auto/noauto 指的是mount -a時,會不會被掛載到項目
注:加粗爲默認值
4、額外的NFS掛載功能
fg/bg:指定掛載的行爲爲fg(前臺)仍是bg(後臺)
soft/hard :當某臺主機脫機時RPC的呼叫方式soft(重複呼叫)、hard(持續呼叫)
intr:它與上面的hard連用,加此參數,當RPC持續呼叫時,該次呼叫是能夠被中斷的
rsize/wsize :rsize(讀出)與wsize(寫入)的區塊大小,它影響着C/S傳輸數據的緩衝記憶容易(二者的值均爲1024)
注:加粗爲默認值
5、沒法掛載的緣由分析
一、客戶端的主機名或IP網段不容許被使用
二、服務器或客戶端某些服務未啓動
三、被防火牆攔截
實驗配置篇
基本配置:
一、服務端的配置 [root@web1 ~]#mkdir /shared [root@web1 ~]#vim /etc/exports /shared 172.16.0.11(rw) [root@web1 ~]#service nfs restart [root@web1 ~]#service iptables stop [root@web1 ~]#setenforce 0
二、客戶端的配置 [root@web2 ~]#mkdir /mnt/nfs [root@web2 ~]#service iptables stop [root@web2 ~]#setenforce 0 [root@web2 ~]#mount -t nfs 172.16.0.10:/shared /mnt/nfs [root@web2 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on 172.16.0.10:/shared 10190208 470144 9195776 5% /mnt/nfs
三、結果驗證 [root@web1 ~]#cp /etc/inittab /shared [root@web2 ~]#ls /mnt/nfs inittab
匿名訪問的狀況:
gnnt.web1.com:服務器 gnnt.web2.com:客戶端 一、開放匿名訪問的狀況 [root@web1 ~]#groupadd -g 45 nfsanon [root@web1 ~]#useradd -u 45 -g nfsanon nfsanon [root@web1 ~]#mkdir /public [root@web1 ~]#setfacl -m u:nfsanon:rwx /public [root@web1 ~]#getfacl /public getfacl: Removing leading '/' from absolute path names # file: public # owner: root # group: root user::rwx user:nfsanon:rwx group::r-x mask::rwx other::r-x [root@web1 ~]#vim /etc/exports /public *.gnnt.com(rw,all_squash,anonuid=45,anongid=45) [root@web1 ~]#exportfs -arv #保存配置文件,不用重啓也可生效 #-a:所有掛載或卸載/etc/exports文件中的設置 #-r:從新掛載/etc/exports裏面的設置,此外,也同步更新/etc/exports及/var/lib/nfs/xtab內容 #-v:在export的時候,將共享的目錄顯示到屏幕上 #-u:卸載某一目錄
二、顯示exports共享信息 [root@web1 ~]# showmount -e localhost #顯示exports所共享的目錄數據,經常使用於客戶端 Export list for localhost: /public *.gnnt.com /tmp 172.16.0.11 /shared 172.16.0.11
三、查看etab文件 [root@web1 ~]# cat /var/lib/nfs/etab /tmp172.16.0.11(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534) /shared172.16.0.11(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534) /public*.gnnt.com(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=45,anongid=45)
四、查看NFS開啓哪些端口 [root@web1 ~]# netstat -tulnp|grep -E '(rpc|nfs)'
五、查看本機rpc服務註冊狀況 [root@web1 ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 53456 status 100024 1 tcp 51270 status 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad 100005 1 udp 60789 mountd 100005 1 tcp 52694 mountd 100005 2 udp 48954 mountd 100005 2 tcp 53781 mountd 100005 3 udp 40201 mountd 100005 3 tcp 34867 mountd 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 2 tcp 2049 nfs_acl 100227 3 tcp 2049 nfs_acl 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 2 udp 2049 nfs_acl 100227 3 udp 2049 nfs_acl 100021 1 udp 35388 nlockmgr 100021 3 udp 35388 nlockmgr 100021 4 udp 35388 nlockmgr 100021 1 tcp 58204 nlockmgr 100021 3 tcp 58204 nlockmgr 100021 4 tcp 58204 nlockmgr
六、檢查相關軟件版本信息(僅查看TCP數據包) [root@web1 ~]# rpcinfo -t localhost nfs program 100003 version 2 ready and waiting program 100003 version 3 ready and waiting program 100003 version 4 ready and waiting
補充
服務器端與客戶端UID不一致時的結果:
[root@web1 ~]# cat /etc/passwd|grep yf yf:x:500:500:yf:/home/yf:/bin/bash [root@web2 ~]# cat /etc/passwd|grep ql ql:x:500:500::/home/ql:/bin/bash [root@web2 ~]# ll /mnt/nfs1 total 8 -rwxr-xr-x. 1 nobody nobody 6878 Aug 15 16:54 nfs #由於使用的root用戶,默認狀況下將客戶端的root用戶壓縮爲匿名用戶 [root@web2 ~]# su - ql [ql@web2 ~]$ ll /mnt/nfs1 total 8 -rwxr-xr-x. 1 nobody nobody 6878 Aug 15 16:54 nfs #UID同爲500的不是同一個用戶,因此將ql壓縮爲匿名用戶
至此,本文檔已經結束,文檔中不免有不盡人意之處,但願各位可以給出寶貴的建議,謝謝!
紫禁之巔
2015年8月28日 17:50