1. 程式人生 > >文件服務器之NFS服務器

文件服務器之NFS服務器

oct period 寫入文件 之間 希望 中間 public exportfs iptable

NFS(Network File System),它的目的就是想讓不同的機器,不同的操作系統可以彼此共享數據文件,目前在Unix like當中用來作為文件服務器是一個相當不錯的解決方案,基本上Unix like主機連接到另一臺Unix like主機來共享彼此的文件時,使用NFS要比SAMBA服務器快速且方便的多。此外,NFS的配置很簡單,只要記得啟動Remote Procedure Call(rpc,就是rpcbind這個軟件)就能夠搭建起來。

1.NFS的由來與功能

NFS共享文件系統的搭建很簡單,不過最大的問題就是權限。因為在服務器端和客戶端必須具備相同的賬號才能夠訪問某些目錄或文件,另外NFS啟動需要通過遠程調用RPC,也就是說並不是只啟動NFS,還要啟動rpc這個服務才行。

1.1 什麽是NFS(Network File System)

NFS就是Network File System的縮寫,最初由sun公司發展出來。它最大的功能就是可以通過網絡,讓不同的機器、不同的操作系統可以共享彼此的文件(share files)。所以也可以簡單的將它看做是一個文件服務器(file server).NFS服務器可以讓PC將網絡中的NFS服務器共享的目錄掛載到本地端的文件中,而且在本地段的系統看來,遠程主機的目錄就好像是自己的一個磁盤分區(partition)一樣,在使用上相當便利。其結構圖如下圖所示:

技術分享圖片

就如同上面的圖示一樣,當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等磁盤或文件相關的命令。

既然NFS是通過網絡來進行數據傳輸的,那麽NFS使用哪個端口來進行數據傳輸呢?基本上這個服務的端口開在2049,但是由於文件系統非常復雜,因此NFS還需要其他程序去啟動額外端口,但這些額外端口啟動的端口是什麽呢?答案“不知道”。因為默認NFS用來傳輸的端口是隨機選擇的,小於1024的端口,那客戶端怎麽知道服務器端使用哪個端口呢?此時就需要用遠程過程調用(Remote Procedure Call,RPC)協議來輔助了。

1.2 什麽是RPC(Remote Procedure Call)

RPC最主要的功能就是指定每個NFS功能所對應的port number,並且通知客戶端,讓客戶端可以連接到正確的端口上去,那rpc又是如何知道每個NFS的端口的呢?這是因為當服務器在啟動NFS時會隨機選取數個端口,並主動向RPC註冊,因此RPC可以知道每個端口對應的NFS功能。然後RPC又是固定使用port 111來監聽客戶端的需求並向客戶端相應正確的端口。因此使NFS得啟動更為便捷。

註意:在啟動NFS之前要先啟動RPC,否則NFS無法向rpc註冊,另外RPC若重新啟動,原來註冊的數據會不見,因此RPC重新啟動後,它管理的所有服務都需要重新啟動以重新向RPC註冊。

1.3 NFS啟動的RPC deamons

我們現在知道NFS服務器在啟動的時候需要向rpc註冊,所以NFS服務器也稱為RPC server之一。那麽NFS服務器主要的任務是進行文件系統的共享,而文件系統的共享是與權限有關的,所以NFS服務器至少需要兩個daemons,一個管理客戶端是否能夠登錄的問題,一個管理客戶端能夠取得的權限。如果需要quota的話,那麽NFS還需要加載其他的RPC程序,NFS服務器有一下幾個daemon。

rpc.nfsd

最主要的NFS服務提供程序,這個daemon主要的功能是管理客戶端是否能夠使用服務器文件系統的掛載信息等,其中還包含判斷這個登錄用戶的ID。

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.stats(非必要)

這個daemon可以用來檢查文件的一致性,與rpc.lockd有關。若發生因為客戶端同時使用同一文件造成可能有所損壞時,rpc.statd可以用來檢測並嘗試回復該文件,與rpc.lockd一樣,這個功能必要要在服務端和客戶端同時啟動才會生效。

上述的幾個RPC 所需要的程序,其實都已經寫入兩個基本的服務器啟動腳本中了,那就是bfs和nfslock,也就是/etc/init.d/nfs和/etc/init.d/nfslock,與服務器相關的寫入nfs服務中,而與客戶端的rpc.lockd相關,就設置於nfslock服務中。

1.4 NFS的文件系統的訪問權限

不知道大家想沒想過一個問題,假如在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)確認環節,很容易弄錯。

2.NFS Server端的配置

2.1 所需要的軟件

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

2.2 NFS軟件的結構

(1)主要配置文件:/etc/exports

這個文件時NFS的主要配置文件。不過系統並沒有默認值,所以這個文件不一定存在,可能要用vim創建。

(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共享出來的目錄資源。

2.3 /etc/exports配置文件的語法與參數

在開始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
/tmp192.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
  oot@nfs_server ~]# setfa
setfacl   setfattr  
[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的那個身份的用戶了。

2.4 啟動NFS

[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/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 [email protected]).
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   tcp111  portmapper
1000003   tcp111  portmapper
1000002   tcp111  portmapper
1000004   udp111  portmapper
1000003   udp111  portmapper
1000002   udp111  portmapper
1000241   udp  42285  status
1000241   tcp  59065  status
1000111   udp875  rquotad
1000112   udp875  rquotad
1000111   tcp875  rquotad
1000112   tcp875  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的共有三種,分別是2、3、4、版

上面的信息中需要除了程序名稱與對應的端口可以與netstat -lntup輸出的結果作對比之外,還需要註意到NFS的版本支持。新的NFS版本傳輸速度較快,由上表看,我們的NFS支持到第四版。如果rpcinfo無法輸出,那就表示註冊的數據有為題,可能需要重新啟動rpcbind與nfs。

2.5 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的設置
[root@nfs_server ~]# exportfs -arv
exporting 192.168.136.0/24:/wwwdir

#將已經共享的NFS目錄資源全部卸載
[root@nfs_server ~]# exportfs -auv
#這時如果再使用showmount -e localhost就看不到任何資源了

這樣就可以重新exportfs我們記錄在/etc/exports文件中的目錄數據了。但是要特別留意,如果僅處理配置文件,但並沒有相對應的目錄等,就會出現警告信息,所以要先創建共享目錄。

2.6 NFS的安全性

(1)防火墻的設置問題與解決方案

一般來說NFS服務器是對內部網絡開放的,不會對內特網開放。然而,如果有特殊需求的話,可能會跨不同的網絡。但是NFS的防火墻很不好弄,為什麽呢?因為除了固定的port111、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
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主機,並且打算彼此共享目錄,那麽在安裝的時候可以規劃處一塊分區作為預留之用。

3.NFS服務器關機註意事項

當NFS使用的這個RPC服務在客戶端連接上服務器時,那麽服務器想要關機。那可能就會成為“不可能的服務”。如果服務器上面還有客戶端連接,那麽可能需要等待幾個鐘頭才能夠正常關機。所以,建議NFS服務器想要關機之前,先關掉rpcbind和nfs的這兩個進程,如果無法將這兩個進程關掉,那麽先用netstat -lutp找出PID,然後再kill將它關掉,這樣才能保證正常關機。

當然還可以利用showmount -a localhost來查出哪個客戶端還在連接,可以告訴他們,讓他們先掛斷服務。

4.NFS客戶端的設置

既然NFS服務器最主要的工作就是共享系統給網絡上其他的客戶端,所以客戶端當然需要掛載NFS服務器的文件系統,那麽NFS服務器可以通過防火墻來保護自己,那麽客戶端掛載文件系統之後不需要保護自己嗎?

4.1 手動掛載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.查看服務器給我們提供了哪些可以使用的資源
[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命令

[root@ping ~]# umount /home/nfs/public/

4.2 客戶端的掛載參數與開機掛載

除了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等參數要牢記。

4.3 關於NFS特殊的掛載參數

除了上面的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

4.4 使NFS開機掛載

我們知道開機就掛在的掛載點與相關參數是寫入/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 

4.5 自動掛載autofs的使用

在一般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

文件服務器之NFS服務器