|
一、概念介紹 NFS 是Network File System的縮寫,即網(wǎng)絡(luò)文件系統(tǒng)。一種使用于分散式文件系統(tǒng)的協(xié)定,由Sun公司開發(fā),于1984年向外公布。功能是通過網(wǎng)絡(luò)讓不同的機(jī)器、不同的操作系統(tǒng)能夠彼此分享個(gè)別的數(shù)據(jù),讓應(yīng)用程序在客戶端通過網(wǎng)絡(luò)訪問位于服務(wù)器磁盤中的數(shù)據(jù),是在類Unix系統(tǒng)間實(shí)現(xiàn)磁盤文件共享的一種方法。
NFS 的基本原則是“容許不同的客戶端及服務(wù)端通過一組RPC分享相同的文件系統(tǒng)”,它是獨(dú)立于操作系統(tǒng),容許不同硬件及操作系統(tǒng)的系統(tǒng)共同進(jìn)行文件的分享。
NFS在文件傳送或信息傳送過程中依賴于RPC協(xié)議。RPC,遠(yuǎn)程過程調(diào)用 (Remote Procedure Call) 是能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機(jī)制。NFS本身是沒有提供信息傳輸?shù)膮f(xié)議和功能的,但NFS卻能讓我們通過網(wǎng)絡(luò)進(jìn)行資料的分享,這是因?yàn)镹FS使用了一些其它的傳輸協(xié)議。而這些傳輸協(xié)議用到這個(gè)RPC功能的。可以說NFS本身就是使用RPC的一個(gè)程序。或者說NFS也是一個(gè)RPC SERVER。所以只要用到NFS的地方都要啟動(dòng)RPC服務(wù),不論是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能通過RPC來實(shí)現(xiàn)PROGRAM PORT的對應(yīng)??梢赃@么理解RPC和NFS的關(guān)系:NFS是一個(gè)文件系統(tǒng),而RPC是負(fù)責(zé)負(fù)責(zé)信息的傳輸。
NFS服務(wù)端、RPC協(xié)議、客戶端三者可以理解為房源、中介、租客之間的關(guān)系:

二、部署說明 1)軟件安裝 NFS只需要安裝下面兩個(gè)軟件,在通常情況下是作為系統(tǒng)默認(rèn)軟件安裝的 rpcbind:centos 下面RPC主程序 (centos5系統(tǒng)之前該軟件叫portmap) nfs-utils:NFS服務(wù)主程序,包括NFS的基本命令和監(jiān)控程序
[root@dev-huanqiu ~]# yum install rpcbind nfs-utils
2)環(huán)境部署說明 將本機(jī)(192.168.1.6)的/usr/local/nginx/html/ssapp.test/weiloushu/video目錄共享給192.168.1.19的/data/video 將本機(jī)(192.168.1.6)的/usr/local/nginx/html/ssapp.beta/weiloushu/video目錄共享給192.168.1.16的/data/video
服務(wù)端的操作:
首先關(guān)閉nfs服務(wù)端的防火墻,這個(gè)很關(guān)鍵,否則客戶機(jī)掛載nfs時(shí)會(huì)失?。。ɑ蛘卟魂P(guān)閉防火墻,需要在iptables中開放nfs相關(guān)端口) [root@dev-huanqiu ~]# /etc/init.d/iptables stop
接著進(jìn)行nfs共享設(shè)置 [root@dev-huanqiu ~]# vim /etc/exports /usr/local/nginx/html/ssapp.test/weiloushu/video 192.168.1.19(rw,sync,no_root_squash) /usr/local/nginx/html/ssapp.beta/weiloushu/video 192.168.1.16(rw,sync,no_root_squash)
配置說明: rw:可讀寫的權(quán)限; ro: 只讀的權(quán)限; no_root_squash:客戶機(jī)用root訪問nfs共享文件夾時(shí),保持root權(quán)限,root_squash 是把root映射成nobody,no_all_squash 不讓所有用戶保持在掛載目錄中的權(quán)限。 sync: 資料同步寫入存儲器中。 async:資料會(huì)先暫時(shí)存放在內(nèi)存中,不會(huì)直接寫入硬盤。
其中: 客戶端常用的指定方式 指定ip地址的主機(jī):192.168.1.19,如果是一個(gè)目錄共享給多臺客戶機(jī),那么就配置多行 指定子網(wǎng)中的所有主機(jī):192.168.0.0/24 指定域名的主機(jī):a.liusuping.com 指定域中的所有主機(jī):*.liusuping.com 所有主機(jī):*
訪問權(quán)限選項(xiàng) 設(shè)置輸出目錄只讀:ro 設(shè)置輸出目錄讀寫:rw
用戶映射選項(xiàng) all_squash:將遠(yuǎn)程訪問的所有普通用戶及所屬組都映射為匿名用戶或用戶組,通常也就是nobody(nfsnobody); no_all_squash:與all_squash取反(默認(rèn)設(shè)置); root_squash:將root用戶及所屬組都映射為匿名用戶或用戶組(默認(rèn)設(shè)置); no_root_squash:與rootsquash取反; anonuid=xxx:將遠(yuǎn)程訪問的所有用戶都映射為匿名用戶,并指定該用戶為本地用戶(UID=xxx);比如(rw,sync,all_squash,anonuid=65534,anongid=65534) anongid=xxx:將遠(yuǎn)程訪問的所有用戶組都映射為匿名用 戶組賬戶,并指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx);
其它選項(xiàng) secure:限制客戶端只能從小于1024的tcp/ip端口連接nfs服務(wù)器(默認(rèn)設(shè)置); insecure:允許客戶端從大于1024的tcp/ip端口連接服務(wù)器; sync:將數(shù)據(jù)同步寫入內(nèi)存緩沖區(qū)與磁盤中,效率低,但可以保證數(shù)據(jù)的一致性; async:將數(shù)據(jù)先保存在內(nèi)存緩沖區(qū)中,必要時(shí)才寫入磁盤; wdelay:檢查是否有相關(guān)的寫操作,如果有則將這些寫操作 一起執(zhí)行,這樣可以提高效率(默認(rèn)設(shè)置); no_wdelay:若有寫操作則立即執(zhí)行,應(yīng)與sync配合使用; subtree:若輸出目錄是一個(gè)子目錄,則nfs服務(wù)器將檢查其父目錄的權(quán)限(默認(rèn)設(shè)置); no_subtree:即使輸出目錄是一個(gè)子目錄,nfs服務(wù)器也不檢查其父目錄的權(quán)限,這樣可以提高效率;
可以使用showmount命令查看遠(yuǎn)程客戶機(jī)上的共享目錄情況,這個(gè)命令需要root權(quán)限。 它有三個(gè)選項(xiàng),記住這三個(gè)選項(xiàng)代表的含義: showmount –a IP :顯示指定NFS服務(wù)器的客戶端以及服務(wù)器端在客戶端的掛載點(diǎn) showmount –d IP :顯示指定NFS服務(wù)器在客戶端的掛載點(diǎn) showmount –e IP :顯示指定NFS服務(wù)器上的共享目錄列表(或者叫輸出列表)
[root@dev-huanqiu ~]# showmount -e Export list for ctl: /usr/local/nginx/html/ssapp.beta/weiloushu/video 192.168.1.16 /usr/local/nginx/html/ssapp.test/weiloushu/video 192.168.1.19
查看系統(tǒng)加載的配置 [root@dev-huanqiu ~]# cat /var/lib/nfs/etab /usr/local/nginx/html/ssapp.beta/weiloushu/video 192.168.1.16(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,no_root_squash,no_all_squash) /usr/local/nginx/html/ssapp.test/weiloushu/video 192.168.1.19(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,no_root_squash,no_all_squash)
開啟nfs的RCP服務(wù)和查看rpcbind服務(wù)端口 [root@dev-huanqiu ~]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] [root@dev-huanqiu ~]# netstat -antlp|grep rpcbind tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 25416/rpcbind tcp 0 0 :::111 :::* LISTEN 25416/rpcbind
開啟nfs服務(wù) [root@dev-huanqiu ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ]
設(shè)置兩個(gè)服務(wù)開機(jī)自啟動(dòng) [root@dev-huanqiu ~]# chkconfig rpcbind on [root@dev-huanqiu ~]# chkconfig nfs on
客戶端的操作(這里列舉其中一臺客戶機(jī)操作,另外一臺客戶端操作類似): 客戶端只需要安裝rpcbind程序,并確認(rèn)服務(wù)正常 [root@dev-new-test ~]# /etc/init.d/rpcbind start 正在啟動(dòng) rpcbind: [確定] [root@dev-new-test ~]# /etc/init.d/rpcbind status rpcbind (pid 28904) 正在運(yùn)行...
掛載nfs服務(wù)端的共享目錄 [root@dev-new-test ~]# mount -t nfs 192.168.1.6:/usr/local/nginx/html/ssapp.test/weiloushu/video /data/video/
查看,發(fā)現(xiàn)已經(jīng)共享成功了 [root@dev-new-test ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 12G 36G 26% / tmpfs 32G 72K 32G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot /dev/mapper/VolGroup-lv_home 844G 69G 733G 9% /home 192.168.1.6:/usr/local/nginx/html/ssapp.test/weiloushu/video 97G 64G 28G 70% /data/video
[root@dev-new-test ~]# showmount -a 192.168.1.6 All mount points on 192.168.1.6:
卸載(注意不能切換到掛載目錄里狀態(tài)下卸載,否則會(huì)報(bào)錯(cuò):umount.nfs:...: device is busy) [root@dev-new-test ~]# umount /data/video [root@dev-new-test ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 12G 36G 26% / tmpfs 32G 72K 32G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot /dev/mapper/VolGroup-lv_home 844G 69G 733G 9% /home
如果nfs在umount卸載時(shí)報(bào)錯(cuò)如下: [root@dev-new-test ~]# umount /data/video /data/video was not found in /proc/mounts
解決:umount卸載時(shí)使用-l參數(shù) [root@dev-new-test ~]# umount -l /data/video umount.nfs: /data/video: not mounted [root@dev-new-test ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 12G 36G 26% / tmpfs 32G 72K 32G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot /dev/mapper/VolGroup-lv_home 844G 69G 733G 9% /home
================================================================================= 遇到的一個(gè)問題: 目標(biāo)機(jī)器通過nfs掛載后,在共享目錄下寫入文件時(shí),權(quán)限強(qiáng)制變成nobod!(本來共享目錄的權(quán)限設(shè)置是app賬號) 經(jīng)排查,是因?yàn)閍pp賬號在原機(jī)器和目標(biāo)機(jī)器的uid和gid不一致導(dǎo)致的! 解決辦法:將兩臺機(jī)器的uid和gid設(shè)置成一樣的即可! # usermod -u uid app # groupmod -g gid app
------------------------------------------------------------------------------------------------------------------------------ 補(bǔ)充一點(diǎn):nfs服務(wù)端的防火墻問題
上面記錄中,已經(jīng)提前在nfs的服務(wù)端將iptables防火墻關(guān)閉了。 如果不關(guān)閉服務(wù)端的iptables防火墻,那么要想讓客戶端成功掛載上nfs,就需要在服務(wù)端的iptables里開通nfs相關(guān)端口.
操作記錄:(centos6x系統(tǒng)下nfs服務(wù)照此配置均可,已經(jīng)過實(shí)驗(yàn)) portmapp在nfs服務(wù)啟動(dòng)的時(shí)候給每一個(gè)NFS服務(wù)分配了一個(gè)動(dòng)態(tài)的端口,如這些服務(wù)MOUNTD_PORT、 STATD_PORT、 LOCKD_TCPPORT、 LOCKD_UDPPORT。 由于這些端口是動(dòng)態(tài)隨機(jī)分配的,所以導(dǎo)致在iptables防火墻無法設(shè)置。 那么如何才能讓nfs client在使用iptables時(shí)可以正常使用NFS服務(wù)呢? 辦法就是指定將上述服務(wù)的運(yùn)行端口,然后在iptables中發(fā)布。
相關(guān)的配置文件為 /etc/sysconfig/nfs 。 要使用iptables來控制nfs,需靜態(tài)指定端口號讓portmap調(diào)用。 nfs服務(wù)啟用時(shí)會(huì)檢查/etc/sysconfig/nfs文件。 在此文件下來指定mountd,statd,lockd,rquotad端口號,修改默認(rèn)的端口號,這里我用的不是默認(rèn)的端口號,而是自定義的端口號。如下: [root@dev-huanqiu ~]# cat /etc/sysconfig/nfs|grep -v "^#" RQUOTAD_PORT=10001 LOCKD_TCPPORT=10002 LOCKD_UDPPORT=10002 MOUNTD_PORT=10003 STATD_PORT=10004
重啟nfs服務(wù) [root@dev-huanqiu ~]# /etc/init.d/nfs restart Shutting down NFS daemon: [ OK ] Shutting down NFS mountd: [ OK ] Shutting down NFS services: [ OK ] Shutting down RPC idmapd: [ OK ] Starting NFS services: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ]
再次通過下面命令查看nfs使用的端口,其中2049是nfs服務(wù)的固定端口 [root@dev-huanqiu ~]# rpcinfo -p 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 100011 1 udp 10001 rquotad 100011 2 udp 10001 rquotad 100011 1 tcp 10001 rquotad 100011 2 tcp 10001 rquotad 100005 1 udp 10003 mountd 100005 1 tcp 10003 mountd 100005 2 udp 10003 mountd 100005 2 tcp 10003 mountd 100005 3 udp 10003 mountd 100005 3 tcp 10003 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 100024 1 udp 10004 status 100024 1 tcp 10004 status 100021 1 udp 10002 nlockmgr 100021 3 udp 10002 nlockmgr 100021 4 udp 10002 nlockmgr 100021 1 tcp 10002 nlockmgr 100021 3 tcp 10002 nlockmgr 100021 4 tcp 10002 nlockmgr
端口111和2049分別是rpcbind和nfs服務(wù)端口 將上面命令結(jié)果中的端口分別在iptables里開通,注意tcp和udp均要開通! [root@dev-huanqiu ~]# vim /etc/sysconfig/iptables # Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -s 192.168.1.19/24 -p tcp --dport 111 -j ACCEPT -A INPUT -s 192.168.1.19/24 -p udp --dport 111 -j ACCEPT -A INPUT -s 192.168.1.19/24 -p tcp --dport 2049 -j ACCEPT -A INPUT -s 192.168.1.19/24 -p udp --dport 2049 -j ACCEPT -A INPUT -s 192.168.1.19/24 -p tcp --dport 10001:10004 -j ACCEPT -A INPUT -s 192.168.1.19/24 -p udp --dport 10001:10004 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
重啟防火墻服務(wù) [root@dev-huanqiu ~]# /etc/init.d/iptables restart iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] iptables: Applying firewall rules: [ OK ]
[root@ctl ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh ACCEPT tcp -- bogon/24 anywhere tcp dpt:nfs ACCEPT udp -- bogon/24 anywhere udp dpt:nfs ACCEPT tcp -- bogon/24 anywhere tcp dpts:scp-config:emcrmirccd ACCEPT udp -- bogon/24 anywhere udp dpts:scp-config:10004 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) target prot opt source destination
這樣,如上設(shè)置后,nfs在開啟iptables防火墻的情況下,也可以正常掛載使用了!
------------------------------------------------------------ 如果客戶端在nfs掛載時(shí)報(bào)權(quán)限錯(cuò)誤,如下: mount.nfs: access denied by server while mounting.....
則可能原因有以下幾種: 1)防火墻原因 解決:關(guān)閉防火墻;如果防火墻開啟,需要打開相應(yīng)的端口,并對相關(guān)客戶機(jī)開放;另確保/etc/hosts.allow和/etc/hosts.deny文件中有沒有nfs相關(guān)規(guī)則。 2)nfs服務(wù)端掛載的目標(biāo)目錄權(quán)限 解決:嘗試設(shè)置777權(quán)限 3)insecure標(biāo)識功能關(guān)閉 解決:insecure標(biāo)識如果端口號大于1024,則需要將insecure 選項(xiàng)加入到配置文件(/etc/exports)相關(guān)選項(xiàng)中mount客戶端才能正常工作,默認(rèn)情況下這個(gè)功能都是開啟的! 如果系統(tǒng)要是默認(rèn)禁止這個(gè)選項(xiàng),那么客戶端使用大于1024端口進(jìn)行nfs掛載時(shí)就會(huì)報(bào)權(quán)限錯(cuò)誤,則需要通過修改配置文件/etc/exports,加入insecure選項(xiàng)才能解決,如下: /usr/local/nginx/html/ssapp.test/weiloushu/video 192.168.1.19(insecure,rw,sync,no_root_squash)
|