1. 程式人生 > >檔案伺服器之NFS伺服器

檔案伺服器之NFS伺服器

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伺服器

就如同上面的圖示一樣,當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安裝

[[email protected]_server ~]# yum install nfs-utils rpcbind -y
[[email protected]_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
[[email protected]_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

[[email protected]_server ~]# which exportfs
/usr/sbin/exportfs

這個是維護NFS共享資源的命令,可以利用這個命令重新共享/etc/exports更新的目錄資源、將NFS Server共享的目錄解除安裝或重新共享等。

(3)共享資源的日誌檔案:/var/lib/nfs/*tab

在NFS伺服器中,日誌檔案都放置到/var/lib/nfs/目錄中、在該目錄下有兩個比較重要的日誌檔案,一個是etab,主要記錄了NFS所共享出來的目錄的完整許可權的設定值;另一個就是xtab,則記錄了曾經連結到此NFS伺服器的相關客戶端的資料。

[[email protected]_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版本。

[[email protected]_server ~]# uname -r
 2.6.32-696.el6.x86_64

至於NFS伺服器的搭建很簡單,只要編輯好主配置檔案/etc/exports之後,先啟動rpcbind(如果已經啟動了,就不要重新啟動),然後再啟動NFS,nfs伺服器就搭建成功了。下面看一下檔案的配置:

[[email protected]_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就行。如果是主機名的話,那麼可以支援萬用字元。例如"*"或“?”都可以。

常用許可權引數如下圖所示:

檔案伺服器之NFS伺服器

例題1:

讓root保留root的許可權

假如想講/tmp共享出去給大家使用,由於這個目錄本來就是大家都可以讀寫的,一次想讓所有人都可以訪問。此外,要讓root寫入的檔案還具有root的許可權,那應該如何設計配置檔案呢?

答:

[[email protected]_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組的使用者才能夠讀寫,其他來源的使用者只能讀取。

答:

[[email protected]_server ~]# mkdir -p /home/public
  [email protected]_server ~]# setfa
setfacl   setfattr  
[[email protected]_server ~]# setfacl -m g:linzhongniao:rwx /home/public/
[[email protected]_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。

答:

[[email protected]_server ~]# mkdir -p /home/test
[[email protected]_server ~]# setfacl -m u:dmtsai:rwx /home/test
[[email protected]_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。

[[email protected]_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

[[email protected]_server ~]# cat /etc/exports
/wwwdir 192.168.136.0/24(rw,no_root_squash,sync)
[[email protected]_server ~]# /etc/init.d/rpcbind start
[[email protected]_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  ]
[[email protected]_server ~]# chkconfig rpcbind on
[[email protected]_server ~]# chkconfig nfs on
[[email protected]_server ~]# chkconfig nfslock on

rpcbind不需要配置,直接啟動即可。啟動之後會出現一個port 111的sunrpc的服務,那就是rpcbind。至於nfs則會啟動至少兩個以上的daemon,然後就開始監聽client端的請求。必須要注意螢幕上的輸出,如果配置檔案寫錯的話會輸出錯誤的地方。

此外如果想要保證NFS伺服器的一致性,可能需要用到rpc.lockd及rpc.start等rpc服務,這是需要增加的服務,就是nfslock。啟動之後要趕快檢視/var/log/message日誌檔案有沒有正確啟動。

[[email protected]_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伺服器開了那些埠

[[email protected]_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。

[[email protected]_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命令檢視

[[email protected]_server ~]# rpcinfo -p [IP|hostname]
[[email protected]_server ~]# rpcinfo -t|-u  [IP|hostname] 程式名稱例如nfs
 -p:針對某IP(未寫則預設為本機) 顯示出所有的port與program(程式)的資訊。
 -t:針對某主機的某個程式檢查其TCP資料包所在的軟體版本。
 -u:針對某主機某個程式檢查其UDP資料包所在的軟體版本。

#1.顯示出目前這臺主機的rpc狀態
[[email protected]_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資料包)
[[email protected]_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這個命令檢視

[[email protected]_server ~]# showmount [-a|-e] [hostname|IP]
選項與引數:
-a:顯示當前主機與客戶端的NFS連線共享的狀態
-e:顯示某臺主機的/etc/exports所共享的目錄資料

#顯示配置好的exports共享目錄資訊
[[email protected]_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就知道了。

[[email protected]_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裡去。

[[email protected]_server ~]# grep "65534" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[[email protected]_server ~]# grep "65534" /etc/group
nfsnobody:x:65534:

如果想要重新處理/etc/exports檔案,當重新設定完/etc/exports後需不需要重新啟動NFS?不需要。如果重新啟動NFS的話,要得再向RPC註冊,很麻煩。這個時候就可以通過exportfs這個NFS檔案系統維護命令來處理。

[[email protected]_server ~]# exportfs [-a|-r|-u|-v]
選項引數:
 -a:全部掛載(或解除安裝)/etc/exports中的設定
 -r:重新掛載/etc/exports裡面的設定,此外也更新/etc/exports及/var/lib/nfs/xtab的內容
 -u:解除安裝某一個目錄
 -v:在export的時候,將共享的目錄顯示在螢幕上

#重新掛載一次/etc/exports的設定
[[email protected]_server ~]# exportfs -arv
exporting 192.168.136.0/24:/wwwdir

#將已經共享的NFS目錄資源全部解除安裝
[[email protected]_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個。

[[email protected]_server ~]# sed -i '[email protected]#[email protected][email protected]' /etc/sysconfig/nfs 
[[email protected]_server ~]# sed -i '[email protected]#[email protected][email protected]' /etc/sysconfig/nfs   
[[email protected]_server ~]# sed -i '[email protected]#[email protected][email protected]' /etc/sysconfig/nfs   
[[email protected]_server ~]# sed -i '[email protected]#[email protected][email protected]' /etc/sysconfig/nfs   
[[email protected]_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
把前面的註釋去掉,埠的值可以自行設定也可以不變

[[email protected]_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  ]
[[email protected]_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資源,需要這樣配置

[[email protected]_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
[[email protected]_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.客戶端啟動必備的服務
[[email protected] ~]# /etc/init.d/rpcbind start
Starting rpcbind:  [  OK  ]
[[email protected] ~]# /etc/init.d/nfslock start
Starting NFS statd:[  OK  ]
#客戶端已經啟動nfslock的話,客戶端也要啟動才能生效

#2.檢視伺服器給我們提供了哪些可以使用的資源
[[email protected] ~]# 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目錄
[[email protected] ~]# mkdir -p /home/nfs/public
[[email protected] ~]# mount -t nfs 192.168.136.118:/wwwdir /home/nfs/public
#語法:-t nfs用於指定檔案系統型別
192.168.136.118:/wwwdir  指定某一臺主機的某個目錄
/home/nfs/public   客戶端要掛載的目錄、

#4.使用df或者mount檢視掛載之後的情況
[[email protected] ~]# 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命令

[[email protected] ~]# umount /home/nfs/public/

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

除了NFS伺服器需要保護之外,客戶端也需要自我保護,這可以通過mount掛載指定引數實現,下圖列出了mount命令的主要引數

檔案伺服器之NFS伺服器

常用選項:

-t 後面指定常用檔案系統型別,ext, ext2, ext3, ext4,xfs

-o 選項的選擇,後面指定要掛載的引數

-a 所有的,掛載掛載/etc/fstab中提到的所有(給定型別的)檔案系統。

如果NFS伺服器所提供的只是類似/home下面的個人資料,應該不需要可執行、SUID與裝置檔案,因此在掛載的時候,可以使用下面的命令:

[[email protected] ~]# mount -t nfs -o nosuid,noexec,nodev,rw 192.168.136.118:/wwwdir /home/nfs/public
[[email protected] ~]# 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伺服器與客戶端之間的連線因為網路問題,或者是伺服器端先關機了沒有通知客戶端,那麼客戶端在使用檔案系統命令的時候就非常慢,因為必須等到檔案系統查詢等待時間後,系統才能夠繼續工作。

為避免出現這些問題,還有一些額外的引數可用,如圖所示:

檔案伺服器之NFS伺服器

更多的引數可以man nfs ,通常如果NFS是用在高速執行的環境中的話,建議加上這些引數

[[email protected] ~]# umount /home/nfs/public
[[email protected] ~]# 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即可。

[[email protected] ~]# 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檔案系統資源,並自行自動掛載的操作。拓撲圖如下圖所示:

檔案伺服器之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

[[email protected] ~]# yum install autofs -y

(4)建立主配置檔案/etc/auto.master,並指定檢測的特定目錄

這個主要配置檔案的內容很簡單,只要在要被檢測的目錄及資料對應檔案即可,資料對應檔案檔名是可以自行定義的,在這個例子中我使用/etc/auto.nfs來命名。

[[email protected] ~]# cp /etc/auto.master{,.bak}
[[email protected] ~]# >/etc/auto.master
[[email protected] ~]# echo "/home/nfsfile /etc/auto.nfs" >>/etc/auto.m
auto.master  auto.master.bak  auto.misc
[[email protected] ~]# echo "/home/nfsfile /etc/auto.nfs" >>/etc/auto.master
[[email protected] ~]# 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等

[[email protected] ~]# echo "wwwdir -rw,bg,no_root_squash 192.168.136.118:/wwwdir" >>/etc/auto.nfs
[[email protected] ~]# cat /etc/auto.nfs
wwwdir -rw,bg,no_root_squash 192.168.136.118:/wwwdir

(6)實際操作與檢視

啟動autofs

[[email protected] ~]# /etc/init.d/autofs start
Loading autofs4:   [  OK  ]
Starting automount:[  OK  ]

現在我們之前並沒有掛載NFS伺服器的資源目錄,好了我們來看一下幾個重要的資料吧。先看看/home/nfsfile會不會主動被建立?然後如果進入/home/nfsfile/wwwdir目錄檔案系統如何變化?

[[email protected] ~]# ls -ld /home/nfsfile/
drwxr-xr-x 2 root root 0 Nov  9 21:54 /home/nfsfile/
[[email protected] ~]# cd /home/nfsfile/wwwdir
#注意這個地方如果只進入到/home/nfsfile/目錄ls或者按tab鍵是找不到目錄wwwdir的,只能夠手敲出來,這時cd進入目錄才自動掛載。
[[email protected] 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)
[[email protected] wwwdir]# df /home/nfsfile/wwwdir/
Filesystem   1K-blocksUsed Available Use% Mounted on
192.168.136.118:/wwwdir
   8717568 1162752   7105280  15% /home/nfsfile/wwwdir