NFS(Network File System),它的目的就是想讓不一樣的機器,不一樣的操做系統能夠彼此共享數據文件,目前在Unix like當中用來做爲文件服務器是一個至關不錯的解決方案,基本上Unix like主機鏈接到另外一臺Unix like主機來共享彼此的文件時,使用NFS要比SAMBA服務器快速且方便的多。此外,NFS的配置很簡單,只要記得啓動Remote Procedure Call(rpc,就是rpcbind這個軟件)就可以搭建起來。大公司或門戶除了使用NFS外,還可能會使用更爲複雜的分佈式文件系統,好比FastDFS、Moosefs(mfs)、GlusterFS等。html
NFS共享文件系統的搭建很簡單,不過最大的問題就是權限。由於在服務器端和客戶端必須具有相同的帳號纔可以訪問某些目錄或文件,另外NFS啓動須要經過遠程調用RPC,也就是說並非只啓動NFS,還要啓動rpc這個服務才行。node
NFS就是Network File System的縮寫,最初由sun公司發展出來。它最大的功能就是能夠經過網絡,讓不一樣的機器、不一樣的操做系統能夠共享彼此的文件(share files)。因此也能夠簡單的將它看作是一個文件服務器(file server).NFS服務器可讓PC將網絡中的NFS服務器共享的目錄掛載到本地端的文件中,並且在本地段的系統看來,遠程主機的目錄就好像是本身的一個磁盤分區(partition)同樣,在使用上至關便利。其結構圖以下圖所示:linux
就如同上面的圖示同樣,當NFS服務器配置好共享出來的/home/sharefile這個目錄後,其餘的NFS客戶端就能夠將這個目錄掛載到本身的文件系統的某個掛載點(掛載點能夠自定義)上,例如上圖中的NFS Client1與NFS Client2掛載的目錄就不一樣。只要在NFS Client1系統中進入/home/data/sharefile內,就能夠看到NFS服務器系統內的/home/sharefile目錄下的全部數據(固然要有足夠的權限)。這個/home/data/sharefile就好像NFS Client1機器裏面的一個partition,只要權限足夠,那麼就可使用cp、cd、mv、rm等磁盤或文件相關的命令。vim
既然NFS是經過網絡來進行數據傳輸的,那麼NFS使用哪一個端口來進行數據傳輸呢?基本上這個服務的端口開在2049,可是因爲文件系統很是複雜,所以NFS還須要其餘程序去啓動額外端口,但這些額外端口啓動的端口是什麼呢?答案「不知道」。由於默認NFS用來傳輸的端口是隨機選擇的,小於1024的端口,那客戶端怎麼知道服務器端使用哪一個端口呢?此時就須要用遠程過程調用(Remote Procedure Call,RPC)協議來輔助了。centos
RPC最主要的功能就是指定每一個NFS功能所對應的port number,而且通知客戶端,讓客戶端能夠鏈接到正確的端口上去,那rpc又是如何知道每一個NFS的端口的呢?這是由於當服務器在啓動NFS時會隨機選取數個端口,並主動向RPC註冊,所以RPC能夠知道每一個端口對應的NFS功能。而後RPC又是固定使用port 111來監聽客戶端的需求並向客戶端相應正確的端口。所以使NFS得啓動更爲便捷。安全
注意:在啓動NFS以前要先啓動RPC,不然NFS沒法向rpc註冊,另外RPC若從新啓動,原來註冊的數據會不見,所以RPC從新啓動後,它管理的全部服務都須要從新啓動以從新向RPC註冊。服務器
咱們如今知道NFS服務器在啓動的時候須要向rpc註冊,因此NFS服務器也稱爲RPC server之一。那麼NFS服務器主要的任務是進行文件系統的共享,而文件系統的共享是與權限有關的,因此NFS服務器至少須要兩個daemons,一個管理客戶端是否可以登陸的問題,一個管理客戶端可以取得的權限。若是須要quota的話,那麼NFS還須要加載其餘的RPC程序,NFS服務器有一下幾個daemon。網絡
rpc.nfsdapp
最主要的NFS服務提供程序,這個daemon主要的功能是管理客戶端是否可以使用服務器文件系統的掛載信息等,其中還包含判斷這個登陸用戶的ID。socket
rpc.mountd
這個daemon主要功能,則是在於管理NFS的文件系統。當客戶端順利經過rpc.nfsd登陸服務器以後,在它可使用NFS服務器提供的文件以前,還會通過文件權限的熱證程序。它會去讀NFS的配置文件/etc/exports來對比客戶端的權限,當經過這一關以後客戶端就能夠取得使用NFS文件的權限了。
rpc.lockd(非必要)
這個daemon能夠用來管理文件鎖定(lock)方面。文件爲什麼要鎖定呢?由於既然共享的NFS文件可讓客戶端使用,那麼當多個客戶端同時嘗試寫入某個文件時,就可能對文件形成必定的問題。rpc.lockd則能夠用來客服這些問題。但rpc.lockd必需要同時在客戶端和服務器端都開啓才行,此外,roc.lockd也常與rpc.statd同時啓動。
rpc.statd(非必要)
這個daemon能夠用來檢查文件的一致性,與rpc.lockd有關。若發生由於客戶端同時使用同一文件形成可能有所損壞時,rpc.statd能夠用來檢測並嘗試回覆該文件,與rpc.lockd同樣,這個功能必要要在服務端和客戶端同時啓動纔會生效。
上述的幾個RPC 所須要的程序,其實都已經寫入兩個基本的服務器啓動腳本中了,那就是bfs和nfslock,也就是/etc/init.d/nfs和/etc/init.d/nfslock,與服務器相關的寫入nfs服務中,而與客戶端的rpc.lockd相關,就設置於nfslock服務中。
不知道你們想沒想過一個問題,假如在NFS Client1上面以dmtsai這個用戶身份去訪問/home/data/sharefile/這個來自NFS Server所提供的文件系統,請問NFS Server所提供的文件系統會讓咱們以什麼身份去訪問?是dmtzai仍是其餘什麼?
當以dmtsai這個通常身份用戶去訪問來自服務器端的文件時,須要注意的是:文件系統的inode所記錄的屬性爲UID、GID,而非帳號與屬組名。那通常linux主機會主動以本身的/etc/passwd、/etc/group來查詢對應的用戶名,組名。因此當dmtsai進入到該目錄後,會參照NFS Client1的用戶名與組名,可是因爲該目錄的文件來自於NFS Server,因此可能會出現如下幾種狀況。
(1)NFS Server/NFS Client恰好有相同的帳號與屬組名
此時用戶能夠直接以dmtsai的身份訪問服務器所提供的共享文件系統。
(2)NFS Server的502這個UID帳號對應的帳號爲vbird
若NFS服務器上的/etc/passwd裏面UID 502的用戶爲vbird,則客戶端的dmtsai能夠訪問服務器端的vbird這個用戶的文件,只由於二者有相同的UID而已。這樣就不能保證客戶端的UID對應的帳號會與服務器相同,那nfs服務器所提供的數據豈不就可能會被錯誤的用戶亂改?
(3)NFS Server並無502這個UID
另外一種狀況是,在服務器端並無502這個UID的存在,則此時dmtsai的身份在該目錄下就會被壓縮成匿名用戶,通常NFS的匿名者把65534做爲其ID,早期的linux中這個65534的帳號名稱一般是nobody,Centos則取名爲nfsnobody。但有時也有特殊的狀況,例如在服務器共享/tmp目錄的時候,dmtsain的身份仍是會保持502,但創建的各項數據在服務器端來看,就會屬於無屬主的數據。
(4)若是用戶身份是root
有個比價特殊的用戶,那就是每一個linux主機都有的UID爲0的root。若是客戶端能夠用root的身份去訪問服務器的文件系統,那服務器的數據哪會有什麼安全性保護?因此在默認狀況下,root的身份會被主動壓縮成爲匿名用戶。
總之,客戶端用戶能作的事情是與UID及其GID有關的,那當客戶端與服務器端的UID即帳號的對應不一致時,可能就會形成文件系統使用上的混亂,這是NFS文件系統在使用上的一個弊端,而在瞭解用戶帳號與UID及文件系統的關係以後,要實際在客戶端以NFS使用服務器端的文件系統時,還須要具有:
(1)NFS服務器已經開放可寫入的權限(與/etc/exports設置有關)。
(2)實際的文件權限具備可寫入(w)的權限。
當知足瞭如下的文件:①用戶帳號,即UID的相關身份;②NFS服務器容許寫入的權限;③文件系統確實是有w的權限時,才具備該文件的可寫入權限,尤爲是身份(UID)確認環節,很容易弄錯。
RPC主程序:rpcbind
NFS主程序:nfs-utils
用rpm或者yum安裝
[root@nfs_server ~]# yum install nfs-utils rpcbind -y [root@nfs_server ~]# rpm -qa|grep nfs nfs-utils-lib-1.1.5-13.el6.x86_64 nfs-utils-1.2.3-78.el6_10.1.x86_64 [root@nfs_server ~]# rpm -qa|grep rpcbind rpcbind-0.2.0-16.el6.x86_64
(1)主要配置文件:/etc/exports
這個文件時NFS的主要配置文件。不過系統並無默認值,因此這個文件不必定存在,可能要用vim建立。裏面的一些參數能夠用man exports查看。
(2)NFS文件系統維護命令:/usr/sbin/exportfs
[root@nfs_server ~]# which exportfs /usr/sbin/exportfs
這個是維護NFS共享資源的命令,能夠利用這個命令從新共享/etc/exports更新的目錄資源、將NFS Server共享的目錄卸載或從新共享等。
(3)共享資源的日誌文件:/var/lib/nfs/*tab
在NFS服務器中,日誌文件都放置到/var/lib/nfs/目錄中、在該目錄下有兩個比較重要的日誌文件,一個是etab,主要記錄了NFS所共享出來的目錄的完整權限的設置值;另外一個就是xtab,則記錄了曾經連接到此NFS服務器的相關客戶端的數據。
[root@nfs_server ~]# ll /var/lib/nfs/*tab -rw-r--r-- 1 root root 0 Oct 9 23:50 /var/lib/nfs/etab -rw-r--r-- 1 root root 0 Oct 9 23:50 /var/lib/nfs/rmtab -rw-r--r-- 1 root root 0 Oct 9 23:50 /var/lib/nfs/xtab
(4)客戶端查詢服務器共享資源的命令:/usr/sbin/showmount
這是一個重要的NFS命令。export用在NFS Server端,而showmount則主要用在客戶端。showmount能夠用來查看NFS共享出來的目錄資源。
在開始NFS服務器的配置以前要了解的是,NFS會直接使用到內核功能,因此內核必須支持NFS才行。萬一若是全部的核心版本小於2.2版本,那麼就要注意了可能忘記選擇NFS的內核支持。
還好Centos或者是其餘版本的linux,默認內核一般是支持NFS功能的,因此只要確認內核的版本是當前的2.6.X版本。
[root@nfs_server ~]# uname -r 2.6.32-696.el6.x86_64
至於NFS服務器的搭建很簡單,只要編輯好主配置文件/etc/exports以後,先啓動rpcbind(若是已經啓動了,就不要從新啓動),而後再啓動NFS,nfs服務器就搭建成功了。下面看一下文件的配置:
[root@nfs_server ~]# cat /etc/exports /tmp 192.168.136.0/24(rw) localhost(rw) *.ev.ncku.edu.tw(ro,sync) [共享目錄tmp] [第一臺主機(權限)][第二臺主機能夠用主機名(rw)] [可用通配符表示]
上面的例子是將/tmp分別分享給3個不一樣的主機或網絡。主機後面要用小括號「()」定義權限參數,若權限參數不止一個時,則以逗號「,」分開,而且主機名與小括號是連在一塊兒的,這個文件內也能夠用井號「#」來註釋。
主機名的設置有下面幾種方式:
(1)可使用完整的IP或者是網絡號,例如192.168.136.0或者192.168.136.0/24,或192.168.136.0/255.255.255.0均可以。
(2)可使用主機名,但這個主機名必須在/etc/hosts內,或者使用DNS找到該名稱才行,反正重點是可找到IP就行。若是是主機名的話,那麼能夠支持通配符。例如"*"或「?」均可以。
經常使用權限參數以下圖所示:
例題1:
讓root保留root的權限
假如想講/tmp共享出去給你們使用,因爲這個目錄原本就是你們均可以讀寫的,一次想讓全部人均可以訪問。此外,要讓root寫入的文件還具備root的權限,那應該如何設計配置文件呢?
答:
[root@nfs_server ~]# cat /etc/exports /tmp 192.168.136.0/24(rw) localhost(rw) *.ev.ncku.edu.tw(ro,sync) #任何人均可以用/tmp,用通配符來處理主機名,重點在no_root_squash /tmp*(rw,no_root_squash)
主機名可使用通配符,上例表示不管來自哪裏的用戶均可以使用/tmp目錄。再次提醒,*(rw,no_root_squash)
這個設置值中間是沒有空格符的。而/tmp和*(rw,no_root_squash)
則是用空格符來隔開的。特別注意no_root_squash的功能,在這個例子中,若是你是客戶端,並且你是以root的身份登陸你的linux主機,那麼當你掛載這臺主機的/tmp目錄後,在使用該目錄時將具備root的權限。
例題2:
同一目錄針對不一樣範圍開放不一樣權限
加入要將一個公共的目錄/home/public開放,可是須要限定在局域網192.168.136.0/24這個網絡且加入linzhongniao組的用戶纔可以讀寫,其餘來源的用戶只能讀取。
答:
[root@nfs_server ~]# mkdir -p /home/public [root@nfs_server ~]# setfacl -m g:linzhongniao:rwx /home/public/ [root@nfs_server ~]# cat /etc/exports #多個範圍用空格分開 /home/public 192.168.136.0/24(rw) *(ro)
上面的例子說明,當ip爲192.168.136.0/24這個網段的時候,在客戶端掛載了/home/public後,針對這個掛載的目錄就具備能夠讀寫的權限,至於不在這個網段的用戶,對這個目錄只具備能夠讀寫的權限。
注意:通配符只能用在主機名的分辨上,IP或網段只能用192.168.136.0/24的形式,不可使用192.168.136.*這種格式表示。
例題3:
僅給某一個主機使用的目錄設置
假如要將一個私人的目錄/home/test開放給192.168.136.114這個客戶端的機器來使用,該如何設置?假設具備完整權限的用戶是dmtsai。
答:
[root@nfs_server ~]# mkdir -p /home/test [root@nfs_server ~]# setfacl -m u:dmtsai:rwx /home/test [root@nfs_server ~]# cat /etc/exports #只要設置的ip正確便可 /home/test 192.168.136.114(rw)
例題4:
開放匿名訪問的狀況
假如要讓*.centos.vbird網絡的主機,登陸到NFS主機時,能夠訪問/home/linux,可是在寫入數據時,但願他們的UID與GID都變成45這個身份的用戶,假設NFS服務器上的UID45和GID45的用戶/組名爲nfsanon。
[root@nfs_server ~]# cat /etc/exports #若是要開放匿名訪問,那麼重點是all_squash,而且要配合anonuid /home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
注意all_squash與anonuid、anongid的功能。如此一來當*.centos.vbird登陸這臺NFS主機,而且在/home/linux寫入文件時,該文件的屬主與屬組就會變成/etc/passwd裏面對應的UID爲45的那個身份的用戶了。
[root@nfs_server ~]# cat /etc/exports /wwwdir 192.168.136.0/24(rw,no_root_squash,sync) [root@nfs_server ~]# /etc/init.d/rpcbind start [root@nfs_server ~]# /etc/init.d/nfslock start [root@nfs_server ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ] [root@nfs_server ~]# chkconfig rpcbind on [root@nfs_server ~]# chkconfig nfs on [root@nfs_server ~]# chkconfig nfslock on
rpcbind不須要配置,直接啓動便可。啓動以後會出現一個port 111的sunrpc的服務,那就是rpcbind。至於nfs則會啓動至少兩個以上的daemon,而後就開始監聽client端的請求。必需要注意屏幕上的輸出,若是配置文件寫錯的話會輸出錯誤的地方。
此外若是想要保證NFS服務器的一致性,可能須要用到rpc.lockd及rpc.start等rpc服務,這是須要增長的服務,就是nfslock。啓動以後要趕快查看/var/log/message日誌文件有沒有正確啓動。
[root@nfs_server ~]# tail /var/log/messages Nov 8 09:59:24 nfs_server kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None Nov 8 09:59:24 nfs_server kernel: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready Nov 8 10:45:25 nfs_server kernel: RPC: Registered named UNIX socket transport module. Nov 8 10:45:25 nfs_server kernel: RPC: Registered udp transport module. Nov 8 10:45:25 nfs_server kernel: RPC: Registered tcp transport module. Nov 8 10:45:25 nfs_server kernel: RPC: Registered tcp NFSv4.1 backchannel transport module. Nov 8 10:45:25 nfs_server kernel: Installing knfsd (copyright (C) 1996 okir@monad.swb.de). Nov 8 10:45:25 nfs_server rpc.mountd[2808]: Version 1.2.3 starting Nov 8 10:45:25 nfs_server kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory Nov 8 10:45:25 nfs_server kernel: NFSD: starting 90-second grace period
在確認正確啓動以後,查看一下NFS服務器開了那些端口
[root@nfs_server ~]# netstat -lntup|grep -E "rpc|nfs" tcp0 0 0.0.0.0:48897 0.0.0.0:* LISTEN 2808/rpc.mountd tcp0 0 0.0.0.0:875 0.0.0.0:* LISTEN 2803/rpc.rquotad tcp0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1382/rpcbind tcp0 0 0.0.0.0:44691 0.0.0.0:* LISTEN 2808/rpc.mountd tcp0 0 0.0.0.0:48952 0.0.0.0:* LISTEN 2808/rpc.mountd tcp0 0 0.0.0.0:59065 0.0.0.0:* LISTEN 1404/rpc.statd tcp0 0 :::35080:::*LISTEN 1404/rpc.statd tcp0 0 :::111 :::*LISTEN 1382/rpcbind tcp0 0 :::44050:::*LISTEN 2808/rpc.mountd tcp0 0 :::33399:::*LISTEN 2808/rpc.mountd tcp0 0 :::41721:::*LISTEN 2808/rpc.mountd udp0 0 0.0.0.0:709 0.0.0.0:* 1382/rpcbind udp0 0 127.0.0.1:732 0.0.0.0:* 1404/rpc.statd udp0 0 0.0.0.0:875 0.0.0.0:* 2803/rpc.rquotad udp0 0 0.0.0.0:111 0.0.0.0:* 1382/rpcbind udp0 0 0.0.0.0:34709 0.0.0.0:* 2808/rpc.mountd udp0 0 0.0.0.0:42402 0.0.0.0:* 2808/rpc.mountd udp0 0 0.0.0.0:42285 0.0.0.0:* 1404/rpc.statd udp0 0 0.0.0.0:44983 0.0.0.0:* 2808/rpc.mountd udp0 0 :::709 :::*1382/rpcbind udp0 0 :::33508:::*2808/rpc.mountd udp0 0 :::111 :::*1382/rpcbind udp0 0 :::47999:::*2808/rpc.mountd udp0 0 :::36500:::*2808/rpc.mountd udp0 0 :::38456:::*1404/rpc.statd
咱們看啓動了好多端口,不過最主要的端口是:
rpcbind啓動的prot在111端口,同時啓動在UDP和TCP。
[root@nfs_server ~]# netstat -lntup|grep -E "rpc|nfs"|grep "111" tcp0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1382/rpcbind tcp0 0 :::111 :::*LISTEN 1382/rpcbind udp0 0 0.0.0.0:111 0.0.0.0:* 1382/rpcbind udp0 0 :::111 :::*1382/rpcbind
NFS自己的服務啓動在port 2049上。
其餘的rpc.*服務啓動的port則是隨機產生的,所以須要向port 111註冊。
怎麼知道每一個RPC服務的註冊狀況呢?能夠用rpcinfo命令查看
[root@nfs_server ~]# rpcinfo -p [IP|hostname] [root@nfs_server ~]# rpcinfo -t|-u [IP|hostname] 程序名稱例如nfs -p:針對某IP(未寫則默認爲本機) 顯示出全部的port與program(程序)的信息。 -t:針對某主機的某個程序檢查其TCP數據包所在的軟件版本。 -u:針對某主機某個程序檢查其UDP數據包所在的軟件版本。 #1.顯示出目前這臺主機的rpc狀態 [root@nfs_server ~]# rpcinfo -p localhost program vers proto port service 1000004 tcp 111 portmapper 1000003 tcp 111 portmapper 1000002 tcp 111 portmapper 1000004 udp 111 portmapper 1000003 udp 111 portmapper 1000002 udp 111 portmapper 1000241 udp 42285 status 1000241 tcp 59065 status 1000111 udp 875 rquotad 1000112 udp 875 rquotad 1000111 tcp 875 rquotad 1000112 tcp 875 rquotad 1000051 udp 42402 mountd 1000051 tcp 44691 mountd 1000052 udp 34709 mountd 1000052 tcp 48952 mountd 1000053 udp 44983 mountd 1000053 tcp 48897 mountd 1000032 tcp 2049 nfs 1000033 tcp 2049 nfs 1000034 tcp 2049 nfs 1002272 tcp 2049 nfs_acl 1002273 tcp 2049 nfs_acl 1000032 udp 2049 nfs 1000033 udp 2049 nfs 1000034 udp 2049 nfs 1002272 udp 2049 nfs_acl 1002273 udp 2049 nfs_acl 1000211 udp 45895 nlockmgr 1000213 udp 45895 nlockmgr 1000214 udp 45895 nlockmgr 1000211 tcp 40840 nlockmgr 1000213 tcp 40840 nlockmgr 1000214 tcp 40840 nlockmgr 程序代號 NFS版本 數據包類型 端口 服務名稱 #2.針對nfs這個程序檢查其相關軟件的軟件版本信息(僅查看tcp數據包) [root@nfs_server ~]# 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 能夠發現提供NFS的共有三種,分別是二、三、四、版
上面的信息中須要除了程序名稱與對應的端口能夠與netstat -lntup輸出的結果做對比以外,還須要注意到NFS的版本支持。新的NFS版本傳輸速度較快,由上表看,咱們的NFS支持到第四版。若是rpcinfo沒法輸出,那就表示註冊的數據有爲題,可能須要從新啓動rpcbind與nfs。
在NFS服務器設置穩當以後,咱們能夠在Server端自我測試一下是否能夠鏈接。具體作法就是用showmount這個命令查看
[root@nfs_server ~]# showmount [-a|-e] [hostname|IP] 選項與參數: -a:顯示當前主機與客戶端的NFS鏈接共享的狀態 -e:顯示某臺主機的/etc/exports所共享的目錄數據 #顯示配置好的exports共享目錄信息 [root@nfs_server ~]# showmount -e localhost Export list for localhost: /wwwdir 192.168.136.0/24
當要掃描某一臺主機提供的NFS共享目錄時,就使用showmount -e IP(或hostname)便可,這也是NFS客戶端最經常使用的命令,另外NFS關於目錄權限設置的數據很是多。/etc/exports只是比較特別的權限參數而已,還有許多默認參數。這些默認參數在哪裏?檢查一下/var/lib/nfs/etab就知道了。
[root@nfs_server ~]# tail /var/lib/nfs/etab /wwwdir 192.168.136.0/24(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) #上面能夠看出除了rw、sync等。其實還有anonuid及anongid等的設置
經過上面的案例分析anonuid和anongid對比/etc/passwd以及/etc/group,會發現記錄的用戶和組是nfsnobody,這個帳號在不一樣的版本中多是不同。另外若是有其餘客戶端掛載服務器端的NFS文件系統,那麼該客戶端與文件系統信息就會被記錄到/var/lib/nfs/xtab裏去。
[root@nfs_server ~]# grep "65534" /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@nfs_server ~]# grep "65534" /etc/group nfsnobody:x:65534:
若是想要從新處理/etc/exports文件,當從新設置完/etc/exports後需不須要從新啓動NFS?不須要。若是從新啓動NFS的話,要得再向RPC註冊,很麻煩。這個時候就能夠經過exportfs這個NFS文件系統維護命令來處理。
[root@nfs_server ~]# exportfs [-a|-r|-u|-v] 選項參數: -a:所有掛載(或卸載)/etc/exports中的設置 -r:從新掛載/etc/exports裏面的設置,此外也更新/etc/exports及/var/lib/nfs/xtab的內容 -u:卸載某一個目錄 -v:在export的時候,將共享的目錄顯示在屏幕上 #從新掛載一次/etc/exports的設置,至關於/etc/init.d/nfs reload [root@nfs_server ~]# exportfs -arv exporting 192.168.136.0/24:/wwwdir #將已經共享的NFS目錄資源所有卸載 [root@nfs_server ~]# exportfs -auv #這時若是再使用showmount -e localhost就看不到任何資源了
這樣就能夠從新exportfs咱們記錄在/etc/exports文件中的目錄數據了。可是要特別留意,若是僅處理配置文件,但並無相對應的目錄等,就會出現警告信息,因此要先建立共享目錄。
(1)防火牆的設置問題與解決方案
通常來講NFS服務器是對內部網絡開放的,不會對內特網開放。然而,若是有特殊需求的話,可能會跨不一樣的網絡。可是NFS的防火牆很很差弄,爲何呢?由於除了固定的port1十一、2049以外,還有不少由rpc.mountd、rpc.rquotad等服務開啓的端口不固定,因此iptables就很難設定規則,那怎麼辦呢?
爲了解決這個問題,Centos6.x提供了一個固定NFS服務端口的配置文件,那就是/etc/sysconfig/nfs。在這個文件中就可以制定特定的端口,這樣每次啓動NFS時,相關服務啓動的端口就會固定,這樣就能設置防火牆了。那麼須要修改的RPC服務有哪些呢?主要有mountd、rquotad、nlockmgr這3個。
[root@nfs_server ~]# sed -i 's@#RQUOTAD_PORT=875@RQUOTAD_PORT=875@g' /etc/sysconfig/nfs [root@nfs_server ~]# sed -i 's@#LOCKD_TCPPORT=32803@LOCKD_TCPPORT=32803@g' /etc/sysconfig/nfs [root@nfs_server ~]# sed -i 's@#LOCKD_UDPPORT=32769@LOCKD_UDPPORT=32769@g' /etc/sysconfig/nfs [root@nfs_server ~]# sed -i 's@#MOUNTD_PORT=892@MOUNTD_PORT=892@g' /etc/sysconfig/nfs [root@nfs_server ~]# grep -nE "RQUOTAD_|LOCKD_T|LOCKD_U|MOUNTD_P" /etc/sysconfig/nfs 12:RQUOTAD_PORT=875 20:LOCKD_TCPPORT=32803 22:LOCKD_UDPPORT=32769 57:MOUNTD_PORT=892 把前面的註釋去掉,端口的值能夠自行設定也能夠不變 [root@nfs_server ~]# /etc/init.d/nfs restart 重啓儘可能用reload Shutting down NFS daemon: [ OK ] Shutting down NFS mountd: [ OK ] Shutting down NFS quotas: [ OK ] Shutting down NFS services:[ OK ] Shutting down RPC idmapd: [ OK ] Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ] [root@nfs_server ~]# rpcinfo -p|grep -E "rquota|mount|nlock" 1000111 udp875 rquotad 1000112 udp875 rquotad 1000111 tcp875 rquotad 1000112 tcp875 rquotad 1000051 udp892 mountd 1000051 tcp892 mountd 1000052 udp892 mountd 1000052 tcp892 mountd 1000053 udp892 mountd 1000053 tcp892 mountd 1000211 udp 32769 nlockmgr 1000213 udp 32769 nlockmgr 1000214 udp 32769 nlockmgr 1000211 tcp 32803 nlockmgr 1000213 tcp 32803 nlockmgr 1000214 tcp 32803 nlockmgr
假設想要開放192.168.136.0/24這個網段的用戶可以使用這臺服務器的NFS資源,須要這樣配置
[root@nfs_server ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.136.0/24 -m multiport --dport 111,2049,875,32803,32767,892 -j ACCEPT [root@nfs_server ~]# iptables -A INPUT -i eth0 -p udp -s 192.168.136.0/24 -m multiport --dport 111,2049,875,32803,32767,892 -j ACCEPT
(2)使用/etc/exports設置更安全的權限
這就要邏輯的思考了,可是要在便利與安裝之間找到平衡點,善用root_squash和all_squash等功能,再利用anonuid等的設置來規範主機的用戶部分。
(3)分區計劃
若是有多臺linux主機,而且打算彼此共享目錄,那麼在安裝的時候能夠規劃處一塊分區做爲預留之用。
當NFS使用的這個RPC服務在客戶端鏈接上服務器時,那麼服務器想要關機。那可能就會成爲「不可能的服務」。若是服務器上面還有客戶端鏈接,那麼可能須要等待幾個鐘頭纔可以正常關機。因此,建議NFS服務器想要關機以前,先關掉rpcbind和nfs的這兩個進程,若是沒法將這兩個進程關掉,那麼先用netstat -lutp找出PID,而後再kill將它關掉,這樣才能保證正常關機。
固然還能夠利用showmount -a localhost
來查出哪一個客戶端還在鏈接,能夠告訴他們,讓他們先掛斷服務。
既然NFS服務器最主要的工做就是共享系統給網絡上其餘的客戶端,因此客戶端固然須要掛載NFS服務器的文件系統,那麼NFS服務器能夠經過防火牆來保護本身,那麼客戶端掛載文件系統以後不須要保護本身嗎?
客戶端掛載文件系統,能夠這樣作:
(1)確認本地端已經啓動了rpcbind服務。
(2)掃描NFS服務器共享的目錄有哪些,並瞭解咱們是否可使用(showmount)
(3)在本地端創建預計要掛載的目錄(mkdir)
(4)利用mount將遠程主機直接掛載到相關目錄
假如客戶端在192.168.136.117(ping)這臺機器上,而nfs服務器在192.168.136.118這臺機器上,那麼趕忙來檢查一下咱們是否已經啓動rpcbind服務,另外看看nfs服務器主機有什麼可用的目錄。
#1.客戶端啓動必備的服務 [root@ping ~]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] [root@ping ~]# /etc/init.d/nfslock start Starting NFS statd:[ OK ] #客戶端已經啓動nfslock的話,客戶端也要啓動才能生效 #2.查看服務器給咱們提供了哪些可使用的資源,通常在配置完exports配置文件以後查看 [root@ping ~]# showmount -e 192.168.136.118 Export list for 192.168.136.118: /wwwdir 192.168.136.0/24 <==這是一下子要掛載的目錄
接下來想要將遠程主機的/wwwdir掛載到本地端主機的/home/nfs/public目錄下,因此就須要在本地端主機先創建起這個掛載點的目錄,而後就能夠用mount這個命令直接掛載了。
#3.掛載遠程主機的/wwwdir目錄 [root@ping ~]# mkdir -p /home/nfs/public [root@ping ~]# mount -t nfs 192.168.136.118:/wwwdir /home/nfs/public #語法:-t nfs用於指定文件系統類型 192.168.136.118:/wwwdir 指定某一臺主機的某個目錄 /home/nfs/public 客戶端要掛載的目錄、 #4.使用df或者mount查看掛載以後的狀況 [root@ping ~]# df Filesystem 1K-blocksUsed Available Use% Mounted on /dev/sda4 8717516 1162724 7105308 15% / tmpfs 502056 0502056 0% /dev/shm /dev/sda1 194241 34853149148 19% /boot /dev/sda2 9948012 111408 9324604 2% /var 192.168.136.118:/wwwdir 8717568 1162752 7105280 15% /home/nfs/public
如何將掛載的目錄卸載呢?能夠用umount命令,強制卸載umount -lf
(小寫的L)
[root@ping ~]# umount /home/nfs/public/
除了NFS服務器須要保護以外,客戶端也須要自我保護,這能夠經過mount掛載指定參數實現,下圖列出了mount命令的主要參數
經常使用選項:
-t 後面指定經常使用文件系統類型,ext, ext2, ext3, ext4,xfs
-o 選項的選擇,後面指定要掛載的參數
-a 全部的,掛載掛載/etc/fstab中提到的全部(給定類型的)文件系統。
若是NFS服務器所提供的只是相似/home下面的我的數據,應該不須要可執行、SUID與設備文件,所以在掛載的時候,可使用下面的命令:
[root@ping ~]# mount -t nfs -o nosuid,noexec,nodev,rw 192.168.136.118:/wwwdir /home/nfs/public [root@ping ~]# mount |grep "addr" 192.168.136.118:/wwwdir on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,vers=4,addr=192.168.136.118,clientaddr=192.168.136.117)
這樣掛載這個文件系統就只能進行數據訪問,相對來講,對於客戶端是比較安全的,因此nousid、noexec、nodev等參數要牢記。
案例:用df -h查看系統掛載發現文件系統只讀
文件系統只讀案例:http://blog.sina.com.cn/s/blog_4a2fadfb010131jf.html
解決:
一、先用umout卸載,不能卸載加-lt參數強制卸載,從新mount便可
二、mount -o rw,remount /
除了上面的mount參數以外,針對NFS服務器,linux還提供了很多有用的額外參數,這些參數頗有用,舉例來講因爲文件系統對linux系統很是重要,由於在進行任何操做時,只要用到文件系統,那麼整個目錄樹系統就會主動的去查詢所有的掛載點。若是nfs服務器與客戶端之間的鏈接由於網絡問題,或者是服務器端先關機了沒有通知客戶端,那麼客戶端在使用文件系統命令的時候就很是慢,由於必須等到文件系統查找等待時間後,系統纔可以繼續工做。
爲避免出現這些問題,還有一些額外的參數可用,如圖所示:
更多的參數能夠man nfs ,一般若是NFS是用在高速運行的環境中的話,建議加上這些參數
[root@ping ~]# umount /home/nfs/public [root@ping ~]# mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=1000,wsize=1000 192.168.136.118:/wwwdir /home/nfs/public
咱們知道開機就掛在的掛載點與相關參數是寫入/etc/fstab文件中的,那NFS能不能寫入/etc/fstab中呢?很是惋惜的是,不能夠,爲何呢?分析開機啓動流程,咱們能夠發現網絡的啓動是在本機掛載以後,所以當你利用/etc/fstab嘗試掛載NFS時,系統因爲還沒有啓動網絡,因此沒法掛載成功。那怎麼辦呢?寫入到/etc/rc.d/rc.local便可。
方法一:
[root@ping ~]# echo "mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=1000,wsize=1000 192.168.136.118:/wwwdir /home/nfs/public" >>/etc/rc.local
方法二:
[root@backup backup2]# tail -1 /etc/fstab 10.0.10.241:/data1 /backup2nfs defaults0 0 [root@backup backup2]# chkconfig netfs on [root@backup backup2]# chkconfig --list netfs netfs 0:關閉 1:關閉 2:啓用 3:啓用 4:啓用 5:啓用 6:關閉
在通常NFS文件系統的使用過程當中,若是客戶端要使用服務器所提供的NFS文件系統,要麼就是在/etc/rc.d/rc.local中設置開機時掛載,要麼就須要登陸後手動掛載,此外客戶端須要預先手動創建好掛載點目錄,而後掛載上來,可是這樣會有一些小問題。
(1)NFS文件系統與網絡鏈接的困擾
NFS服務器與客戶端的鏈接或許不會永遠存在,而RPC這個服務若是掛載了NFS服務器後,任何一方脫機均可能形成另外一方老是在等待超時。並且掛載的NFS文件系統可能又不常常被使用,若不掛在的話須要使用時又得通知管理員,這樣很不方便。
那麼爲了解決這個問題,可不可讓客戶端在使用NFS文件系統的需求是才讓系統自動掛載?
當NFS文件系統使用完畢後,可不可讓NFS自動卸載,以免可能的RPC錯誤?
那麼有沒有辦法實現上面的功能呢?有的,能夠用autofs這個服務來實現。
(2)autofs的配置的概念
autofs這個服務在客戶端計算機上面,會持續的檢測某個指定的目錄,並預先設置當使用到該目錄下的某個子目錄時,將會取得來自服務器端的NFS文件系統資源,並自行自動掛載的操做。拓撲圖以下圖所示:
如上圖所示,咱們的autofs的主要配置文件爲/etc/auto.master。這個文件中的內容很簡單咱們只要定義出須要掛載的目錄(/home/nfsfile)便可,這個目錄就是autofs要持續監測的目錄,在/etc/auto.nfs(這個文件名能夠自定義)裏面則能夠定義出每一個子目錄所欲掛載的NFS目錄資源。
舉例來講,當咱們在客戶端要使用/home/nfsfile/wwwdir的數據時,此時autofs纔會去192.168.136.118服務器上掛載/wwwdir,當隔了5分鐘沒有使用該目錄下的數據後,則客戶端將會主動卸載/home/nfsfile/wwwdir。
(3)安裝autofs
[root@ping ~]# yum install autofs -y
(4)創建主配置文件/etc/auto.master,並指定檢測的特定目錄
這個主要配置文件的內容很簡單,只要在要被檢測的目錄及數據對應文件便可,數據對應文件文件名是能夠自行定義的,在這個例子中我使用/etc/auto.nfs來命名。
[root@ping ~]# cp /etc/auto.master{,.bak} [root@ping ~]# >/etc/auto.master [root@ping ~]# echo "/home/nfsfile /etc/auto.nfs" >>/etc/auto.m auto.master auto.master.bak auto.misc [root@ping ~]# echo "/home/nfsfile /etc/auto.nfs" >>/etc/auto.master [root@ping ~]# cat /etc/auto.master /home/nfsfile /etc/auto.nfs
提示:須要注意的是/home/nfsfile目錄不須要實現存在,由於autofs會主動創建該目錄。若是提早創建了反而會出現問題。
(5)創建數據對應文件內(/etc/auto.nfs)的掛載信息與服務器對應的資源
自行設置/etc/auto.nfs文件
格式:
[本地端子目錄] [-掛載參數] [服務器所提供的目錄]
選項與參數:
[本地端子目錄] :指的是在/etc/auto.master內指定的目錄及子目錄
[-掛載參數]:就是前一小節提到的rw、bg、soft等參數,無關緊要
[服務器所提供的目錄]:例如192.168.136.118:/wwdir等
[root@ping ~]# echo "wwwdir -rw,bg,no_root_squash 192.168.136.118:/wwwdir" >>/etc/auto.nfs [root@ping ~]# cat /etc/auto.nfs wwwdir -rw,bg,no_root_squash 192.168.136.118:/wwwdir
(6)實際操做與查看
啓動autofs
[root@ping ~]# /etc/init.d/autofs start Loading autofs4: [ OK ] Starting automount:[ OK ]
如今咱們以前並無掛載NFS服務器的資源目錄,好了咱們來看一下幾個重要的數據吧。先看看/home/nfsfile會不會主動被創建?而後若是進入/home/nfsfile/wwwdir目錄文件系統如何變化?
[root@ping ~]# ls -ld /home/nfsfile/ drwxr-xr-x 2 root root 0 Nov 9 21:54 /home/nfsfile/ [root@ping ~]# cd /home/nfsfile/wwwdir #注意這個地方若是隻進入到/home/nfsfile/目錄ls或者按tab鍵是找不到目錄wwwdir的,只可以手敲出來,這時cd進入目錄才自動掛載。 [root@ping wwwdir]# mount|grep "nfsfile" 192.168.136.118:/wwwdir on /home/nfsfile/wwwdir type nfs (rw,no_root_squash,sloppy,vers=4,addr=192.168.136.118,clientaddr=192.168.136.117) [root@ping wwwdir]# df /home/nfsfile/wwwdir/ Filesystem 1K-blocksUsed Available Use% Mounted on 192.168.136.118:/wwwdir 8717568 1162752 7105280 15% /home/nfsfile/wwwdir