小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)設(shè)定及管理 - NFS服務(wù)

 todaytomo 2007-06-08
Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)設(shè)定及管理
1. 準(zhǔn)備工作
2. NFS的由來與其功能
  2.1 什么是NFS ( Network FileSystem )
  2.2 什么是RPC ( Remote Procedure Call )
  2.3 NFS啟動的RPC daemons
  2.4 NFS的文件存取權(quán)限
3. NFS Server 端的設(shè)定
  3.1 所需要的套件
  3.2 NFS的套件結(jié)構(gòu)
  3.3 /etc/exports 配置文件的語法與參數(shù)
  3.4 NFS服務(wù)的啟動:rpcinfo
  3.5 NFS的連接觀察: showmount, /var/lib/nfs/etab, exportfs
  3.6 NFS的安全性
4. NFS 客戶端的設(shè)定
  4.1 遠(yuǎn)端NFS服務(wù)器的掛載
  4.2 客戶端可處理的掛載參數(shù)與開機掛載
  4.3 無法掛載的原因分析
  4.4 自動掛載 autofs 的使用
5. 案例演練
6. 參考資料

1、準(zhǔn)備工作

  NFS 這個借由網(wǎng)路分享文件系統(tǒng)的服務(wù)在架設(shè)的時候是很簡單的,不過,他最大的問題在于『權(quán)限』方面的概念!因為在客戶端與服務(wù)器端可能必須要具備相同的賬號才能夠存取某些目錄或檔案。 另外,NFS的啟動需要透過所謂的遠(yuǎn)端程序呼叫 (RPC),也就是說,我們并不是只要啟動NFS就好了,還需要啟動RPC這個服務(wù)才行!

2、 NFS的由來與其功能

2.1 什么是 NFS (Network FileSystem)

  NFS(Network File System)是一種分布式文件系統(tǒng),允許網(wǎng)絡(luò)中的安裝不同操作系統(tǒng)的計算機間共享文件和外設(shè),所以它的通訊協(xié)定設(shè)計與主機及操作系統(tǒng)無關(guān). 它是由SUN公司于1984年推出,使得可以本地機一樣的使用另一臺聯(lián)網(wǎng)計算機的文件和外設(shè)。NFS在文件傳送或信息傳送過程中依賴于RPC協(xié)議。

            

  圖一、NFS 主機分享目錄與 Client 掛載示意圖


  就如同上面的圖示一般,當(dāng)我們的NFS Server設(shè)定好共享出來的/home/sharefile這個目錄后,其他的NFS Client端就可以將這個目錄掛載到自己系統(tǒng)上面的某個掛載點(掛載點可以自定義),例如前面圖示中的NFS client 1與NFS client 2掛載的目錄就不相同。我只要在 NFS client 1系統(tǒng)中進(jìn)入/home/data/sharefile內(nèi),就可以看到 NFS Server系統(tǒng)內(nèi)的/home/sharefile目錄下的所有資料了 (當(dāng)然,權(quán)限要足夠)。這個 /home/data/sharefile 就好像 NFS client 1自己機器里面的一個 partition。只要權(quán)限對了,那么您可以使用 cp, cd, mv, rm... 等等磁盤或文件相關(guān)的命令。

  好的,既然NFS是通過網(wǎng)絡(luò)來進(jìn)行文件的傳輸,那么經(jīng)由socket pair的概念你會知道NFS應(yīng)該會使用一些port吧?那么NFS使用哪個 port來進(jìn)行傳輸呢?答案是....不知道?因為NFS用來傳輸?shù)膒ort是隨機選擇小于1024以下的端口來使用的。那客戶端怎么知道你服務(wù)器端使用那個port呢?此時就得要遠(yuǎn)程過程調(diào)用(Remote Procedure Call, RPC)的協(xié)議來輔助,下面我們就來談?wù)勈裁词?RPC?

2.2 什么是 RPC (Remote Procedure Call)

  RPC, 遠(yuǎn)程過程調(diào)用 (remote procedure call)是能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機制。由于使用 RPC 的程序不必了解支持通信的網(wǎng)絡(luò)協(xié)議的情況,因此 RPC 提高了程序的互操作性。常用于分布式客戶端/服務(wù)器模型,發(fā)出請求的程序是客戶程序,而提供服務(wù)的程序是服務(wù)器。

  因為NFS支持的功能相當(dāng)?shù)亩?,而不同的功能都會使用不同的程序來啟動,每啟動一個功能就會啟用一些 port 來傳輸文件,因此, NFS 的功能所對應(yīng)的 port 才沒有固定, 而是采用隨機取用一些未被使用的小于 1024 的端口來作為傳輸之用。但如此一來又造成客戶端想要連上服務(wù)器時的困攏, 因為客戶端得要知道服務(wù)器端的相關(guān)端口才能夠連接!

  此時我們就得需要遠(yuǎn)程過程調(diào)用(RPC) 的服務(wù),RPC 最主要的功能就是在指定每個 NFS 功能所對應(yīng)的 port number ,并且返回給客戶端,讓客戶端可以連結(jié)到正確的端口上去。 那 RPC 又是如何知道每個 NFS 的端口呢?這是因為當(dāng)服務(wù)器在啟動 NFS 時會隨機取用數(shù)個端口,并主動的向 RPC 注冊,因此 RPC 可以知道每個端口對應(yīng)的 NFS 功能,然后 RPC 又是固定使用 port 111 來監(jiān)聽客戶端的需求并返回客戶端正確的端口。

  注:在啟動 NFS 之前,RPC 就要先啟動了,否則NFS會無法向 RPC 注冊。 另外,RPC若重新啟動時,原來注冊的資料會不見,因此RPC重新啟動后,它管理的所有程序都需要重新啟動以重新向RPC注冊。

            
  圖二、NFS 與 RPC 服務(wù)及文件系統(tǒng)操作的相關(guān)性

             
  如上圖所示,當(dāng)客戶端有NFS文件存取需求時,它會如何向服務(wù)器端請求文件呢?

  1)、客戶端會向服務(wù)器端的RPC(port 111)發(fā)出NFS檔案存取功能的詢問要求;
  2)、服務(wù)器端找到對應(yīng)的已注冊的NFS daemon端口后,會返回給客戶端;
  3)、客戶端了解正確的端口后,就可以直接與NFS daemon來建立連接;

  由于 NFS 的各項功能都必須要向RPC來注冊,如此一來RPC就能了解NFS這個服務(wù)的各項功能之port number, PID, NFS 在主機所監(jiān)聽的IP等等,而客戶端才能夠通過RPC的詢問找到正確對應(yīng)的端口。 也就是說,NFS 必須要有RPC存在時才能成功的提供服務(wù),因此我們稱NFS為RPC server的一種。事實上,有很多這樣的服務(wù)器都是向RPC注冊的,舉例來說,NIS (Network Information Service)也是RPC server 的一種。 此外,由圖二你也會知道,不論是客戶端還是服務(wù)器端,要使用 NFS 時,兩者都需要啟動 RPC 才行。

  更多的 NFS 相關(guān)協(xié)議信息你可以參考下面網(wǎng)頁:
     http://www./rfcs/rfc1094.html
     http://www./HOWTO/NFS-HOWTO/index.html


2.3 NFS啟動的RPC daemons

  我們現(xiàn)在知道NFS服務(wù)器在啟動的時候就得要向RPC注冊,所以NFS服務(wù)器也被稱為RPC server之一。那么NFS服務(wù)器主要的任務(wù)是進(jìn)行文件系統(tǒng)的共享,文件系統(tǒng)的共享則與權(quán)限有關(guān)。 所以 NFS 服務(wù)器啟動時至少需要兩個 daemons ,一個管理client端是否能夠登入的問題,一個管理client端能夠取得的權(quán)限。如果你還想要管理quota的話,那么NFS還得要再載入其他的RPC程序。我們以較單純的NFS主機來說:

  rpc.nfsd:
  這個 daemon 主要的功能就是在管理 Client 是否能夠登入主機的權(quán)限,其中還包含這個登入者的 ID 的判別。

  rpc.mountd
  這個daemon主要的功能,則是在管理NFS的文件系統(tǒng),當(dāng)Client端順利的通過rpc.nfsd而登入主機之后,在他可以使用NFS服務(wù)器提供的文件之前,還會經(jīng)過文件使用權(quán)限 (就是那個-rwxrwxrwx與owner, group那幾個權(quán)限)的認(rèn)證程序!它會去讀NFS的配置文件/etc/exports 來比對Client的權(quán)限,當(dāng)通過這一關(guān)之后Client就可以取得使用NFS文件的權(quán)限(注:這個也是我們用來管理NFS共享之目錄的使用權(quán)限與安全設(shè)定的地方)

  rpc.lockd (非必要)
  這個玩意兒可以用在管理文件的鎖定(lock)用途。為何文件需要『鎖定』呢?因為既然分享的NFS文件可以讓客戶端使用,那么當(dāng)多個客戶端同時嘗試寫入某個文件時,就可能對于該文件造成一些問題啦!這個rpc.lockd則可以用來克服這個問題。 但rpc.lockd必須要同時在客戶端與服務(wù)器端都開啟才行,此外,rpc.lockd也常與rpc.statd 同時啟用。

  rpc.statd (非必要)
  可以用來檢查文件的一致性,與rpc.lockd有關(guān)!若發(fā)生因為客戶端同時使用同一文件造成文件可能有所損毀時, rpc.statd 可以用來檢測并嘗試回復(fù)該文件。與 rpc.lockd同樣的,這個功能必須要在服務(wù)器端與客戶端都啟動才會生效。

2.4 NFS的文件存取權(quán)限

  不知道你有沒有想過這個問題,在圖一的環(huán)境下,假如我在NFS client 1上面以dmtsai這個使用者身份想要去存取 /home/data/sharefile/這個來自NFS server所提供的文件系統(tǒng)時,請問NFS server所提供的文件系統(tǒng)會讓我以什么身份去存?。渴?dmtsai 還是?

  為什么會這么問呢?這是因為NFS本身的服務(wù)并沒有進(jìn)行身份登入的識別,所以說,當(dāng)你在客戶端以dmtsai的身份想要存取服務(wù)器端的文件系統(tǒng)時,服務(wù)器端會以客戶端的使用者UID與GID等身份來嘗試讀取服務(wù)器端的文件系統(tǒng)。這時有個有趣的問題就產(chǎn)生啦!那就是如果客戶端與服務(wù)器端的使用者身份并不一致怎么辦?

  我們以下面這個圖示來說明一下:

               
         
  圖三、NFS 的服務(wù)器端與客戶端的使用者身份確認(rèn)機制


  當(dāng)我以dmtsai這個一般身份使用者要去存取來自服務(wù)器端的文件時,你要先注意到的是:文件系統(tǒng)的inode所記錄的屬性為UID,GID而非賬號與群組名。那一般Linux主機會主動的以自己的/etc/passwd,/etc/group來查詢對應(yīng)的使用者、群組名稱。所以當(dāng)dmtsai進(jìn)入到該目錄后,會參照NFS client 1的使用者與群組名稱。 但是由于該目錄的文件主要來自NFS server,所以可能就會發(fā)現(xiàn)幾個情況:

  NFS server/NFS client剛好有相同的賬號與群組
  則此時使用者可以直接以dmtsai的身份進(jìn)行服務(wù)器所提供的文件系統(tǒng)之存取。

  NFS server的501這個UID賬號對應(yīng)為vbird
  若 NFS 服務(wù)器上的/etc/passwd里面UID 501的使用者名稱為vbird時,則客戶端的dmtsai可以存取服務(wù)器端的vbird這個使用者的文件!只因為兩者具有相同的UID而已。這就造成很大的問題了!因為沒有人可以保證客戶端的UID所對應(yīng)的賬號會與服務(wù)器端相同, 那服務(wù)器所提供的資料就可能會被錯誤的使用者修改?

  NFS server并沒有501這個UID
  另一個極端的情況是,在服務(wù)器端并沒有501這個UID的存在,則此時dmtsai的身份在該目錄下會被壓縮成匿名者,一般NFS的匿名者會以UID為 65534為其使用者,早期的Linux distributions這個65534的賬號名稱通常是nobody ,我們的RHEL4則取名為nfsnobody 。

  如果使用者身份是root時
  有個比較特殊的使用者,那就是每個 Linux 主機都有的UID為0的root。想一想,如果客戶端可以用root的身份去存取服務(wù)器端的文件系統(tǒng)時,那服務(wù)器端的資料哪有什么保護(hù)性?所以在預(yù)設(shè)的情況下, root的身份會被主動的壓縮成為匿名者。

  總之,客戶端使用者能做的事情是與UID及其GID有關(guān)的,那當(dāng)客戶端與服務(wù)器端的UID及賬號的對應(yīng)不一致時,可能就會造成文件系統(tǒng)使用上的困擾,這個就是NFS文件系統(tǒng)在使用上面的一個很重要的地方!而在了解使用者賬號與UID及文件系統(tǒng)的關(guān)系之后,要實際在客戶端以NFS取用服務(wù)器端的文件系統(tǒng)時, 你還得需要具有:

  NFS服務(wù)器有開放可寫入的權(quán)限(與/etc/exports設(shè)定有關(guān));
  實際的文件權(quán)限具有可寫入(w)的權(quán)限。

  當(dāng)你滿足了(1)使用者賬號,亦即UID的相關(guān)身份;(2)NFS服務(wù)器允許有寫入的權(quán)限;(3)文件系統(tǒng)確實具有w的權(quán)限時,你才具有該文件的可寫入權(quán)限!尤其是身份(UID)確認(rèn)的環(huán)節(jié)部分,最容易搞錯!也因為如此,所以NFS通常需要與NIS這一個可以確認(rèn)客戶端與服務(wù)器端身份一致的服務(wù)搭配使用,以避免身份的錯亂

3、NFS Server 端的設(shè)定

  既然要使用NFS的話,就得要安裝NFS所需要的套件,下面讓我們查詢一下系統(tǒng)有無安裝所需要的套件, NFS套件的架構(gòu)以及如何設(shè)定 NFS主機。^

3.1 所需要的套件

  以RHEL 4為例的話,要設(shè)定好NFS服務(wù)器我們必須要有兩個套件才行,分別是:

  NFS 主程序:nfs-utils
  RPC 主程序:portmap

  portmap

  就如同剛剛提的到,我們的NFS其實可以被視為一個RPC程序,而要啟動任何一個RPC程序之前,我們都需要做好port的對應(yīng) (mapping) 的工作才行,這個工作其實就是『portmap』這個服務(wù)所負(fù)責(zé)的!也就是說, 在啟動任何一個RPC server之前,我們都需要啟動portmap才行!

  nfs-utils

  就是提供 rpc.nfsd 及 rpc.mountd 這兩個 NFS daemons 與其他相關(guān) documents 與說明文件、執(zhí)行檔等的套件!這個就是 NFS 的主要套件。

  判斷系統(tǒng)中是否已安裝NFS相關(guān)包

  RHEL4 系統(tǒng)的情況;其它版本的Redhat及Fedora的系統(tǒng)和這相似;

#rpm -qa | grep nfs
nfs-utils-1.0.6-65.EL4

#rpm -qa | grep portmap
portmap-4.0-63

3.2 NFS的套件結(jié)構(gòu)

  /etc/exports
  這個文件就是NFS的主要配置文件。系統(tǒng)可能沒有預(yù)設(shè),所以這個文件不一定會存在,您可能必須要使用 vi 主動的建立這個文件。

  /usr/sbin/exportfs
  這個是維護(hù)NFS共享資源的命令,我們可以利用這個命令重新共享 /etc/exports 變更的目錄資源、將NFS Server分享的目錄卸載或重新分享等等,這個指令是NFS系統(tǒng)里面相當(dāng)重要的。至于指令的用法我們在下面會再介紹。

  /usr/sbin/showmount
  這是另一個重要的NFS命令。exportfs是用在NFS Server端,而showmount則主要用在Client端。這個showmount可以用來察看NFS共享出來的目錄資源。

  /var/lib/nfs/*tab
  在NFS服務(wù)器的登錄檔都放置到/var/lib/nfs/目錄里面,在該目錄下有兩個比較重要的登錄檔,一個是etab ,主要記錄了 NFS 所分享出來的目錄的完整權(quán)限設(shè)定值;另一個xtab則記錄曾經(jīng)連結(jié)到此NFS主機的相關(guān)客戶端資料。

  /var/lib/nfs/rmtab
  狀態(tài)文件,列出了掛接導(dǎo)出文件的遠(yuǎn)程客戶機清單。
  
3.3 /etc/exports配置文件的語法與參數(shù)

  在開始NFS服務(wù)器的設(shè)置之前,您必須要了解的是,NFS會直接使用到內(nèi)核功能,所以你的內(nèi)核必須要有支持NFS才行。 萬一如果你的內(nèi)核版本小于2.2版,或者重新自行編譯過內(nèi)核的話,那么就得要很注意, 因為你可能會忘記選擇NFS的核心支持。

  還好,我們RHEL4或者是其他版本的Linux ,預(yù)設(shè)內(nèi)核通常是支援NFS功能的, 所以你只要確認(rèn)你的內(nèi)核版本是目前新的2.6.x版,并且使用你的distribution所提供的核心,那應(yīng)該就不會有問題。

  至于NFS服務(wù)器的架設(shè)實在很簡單,你只要編輯好主要配置文件/etc/exports之后, 先啟動portmap ,然后再啟動nfs ,你的NFS就成功了!不過這樣的設(shè)定能否對客戶端生效?那就得要考慮你權(quán)限方面的設(shè)定能力了。 我們就直接來看看/etc/exports 應(yīng)該如何配置,某些 distributions并不會主動提供 /etc/exports 文件,所以請您自行手動建立。

  例如:
# vi /etc/exports
/tmp         192.168.1.0/24(ro)   localhost(rw)   *.ev.ncku.edu.tw(ro,sync)
[分享目錄]  [第一個主機(權(quán)限)]   [可用主機名]    [可用域名]


  這個文件的內(nèi)容非常簡單,每一行由共享路徑,客戶端列表以及每個客戶端后緊跟的訪問選項構(gòu)成:

[共享的目錄] [主機名或IP(參數(shù),參數(shù))]


  其中參數(shù)是可選的,當(dāng)不指定參數(shù)時,nfs將使用默認(rèn)選項。默認(rèn)的共享選項是 sync,ro,root_squash,no_delay。

  當(dāng)主機名或IP地址為空時,則代表共享給任意客戶機提供服務(wù)。

  當(dāng)將同一目錄共享給多個客戶機,但對每個客戶機提供的權(quán)限不同時,可以這樣:

[共享的目錄] [主機名1或IP1(參數(shù)1,參數(shù)2)] [主機名2或IP2(參數(shù)3,參數(shù)4)]


  下面是一些NFS共享的常用參數(shù):
    
ro: read-only,只讀訪問權(quán)限

rw: read-write,可讀寫的權(quán)限

sync: 資料同步寫入到內(nèi)存與硬盤中

async: 資料會先暫存于內(nèi)存中,而非直接寫入硬盤

secure: NFS通過1024以下的安全TCP/IP端口發(fā)送

insecure: NFS通過1024以上的端口發(fā)送

wdelay: 如果多個客戶要寫入NFS目錄,則歸組寫入(默認(rèn))

no_wdelay: 如果多個客戶要寫入NFS目錄,則立即寫入,當(dāng)使用async時,無需此設(shè)置。

hide: 在NFS共享目錄中不共享其子目錄

no_hide: 共享NFS目錄的子目錄

subtree_check: 如果共享/usr/bin之類的子目錄時,強制NFS檢查父目錄的權(quán)限(默認(rèn))

no_subtree_check: 和上面相對,不檢查父目錄權(quán)限

no_all_squash: 保留共享文件的UID和GID(默認(rèn))
   
all_squash
  不論登入 NFS 的使用者身份為何, 他的UID和GID映射匿名客戶anonymous(通常也就是 nobody(nfsnobody)),適合公用目錄。
      
root_squash 
  在登入NFS主機使用共享之目錄的使用者如果是root時,那么這個使用者的權(quán)限將被映射成為匿名使用者,通常他的 UID 與 GID 都會變成nobody(nfsnobody) 那個系統(tǒng)賬號的身份的權(quán)限;(默認(rèn))
      
no_root_squas         
  登入NFS主機使用共享目錄的使用者,如果是root的話,那么對于這個共享的目錄來說,他就具有root的權(quán)限!這個項目『極不安全』,不建議使用!
      
anonuid=xxx: 指定NFS服務(wù)器/etc/passwd文件中匿名客戶的UID
      
anongid=xxx: 指定NFS服務(wù)器/etc/passwd文件中匿名客戶的GID

/etc/exports 中client的書寫規(guī)則

  (1)單個主機
  可以用短名及完全限定名,或者用IP地址,例如student01、student01.flying.com.cn或者192.168.10.1都是合法的主機名。

  (2)Net-Group
  可以列出/etc/netgroup文件中或NFS網(wǎng)組映射中定義的整組主機。網(wǎng)組名以@開頭。

  (3)通配符主機
  . *.*.comsenz.com
  (4)掩碼
  192.168.1.0/255.255.255.0

  接下來我們利用上述的幾個參數(shù)來實際思考一下幾個有趣的小習(xí)題:

  思考一:讓root保有root的權(quán)限

  我想將/tmp共享出去給大家使用,由于這個目錄本來就是大家都可以讀寫的,因此想讓所有的人都可以存取。 此外,我要讓root寫入的文件還是具有root的權(quán)限,那如何設(shè)計配置文件?

# vi /etc/exports
# 任何人都可以用我的 /tmp ,用通配字符(*)來處理主機名稱,重點在no_root_squash
/tmp  *(rw,no_root_squash)


  參考前面的主機名稱設(shè)定說明,我們可以利用通配字符(*)。這表示無論來自哪里都可以使用我的/tmp這個目錄。 再次提醒,『 *(rw,no_root_squash)』這一串設(shè)定值中間是沒有空格的,而/tmp與*(rw,no_root_squash)則是有空格來隔開的。特別注意到 no_root_squash的功能!在這個例子中,如果你是客戶端,而且您是以 root 的身份登入您的Linux主機,那么當(dāng)您mount上我這部主機的 /tmp 之后,您在該mount的目錄當(dāng)中,將具有『root 的權(quán)限』

  思考二:同一目錄針對不同范圍開放不同權(quán)限

  我要將一個公共的目錄/home/public公開出去,但是只有限定我的局域網(wǎng)內(nèi)192.168.0.0/24這個網(wǎng)段可以讀寫,其他人則只能讀?。?br>
# vi /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.0.0/24(rw)    *(ro)
# 繼續(xù)加在后面,注意,我有將主機與網(wǎng)域分為兩段(用空格隔開)


  上面的例子說的是,當(dāng)我的IP是在192.168.0.0/24 這個網(wǎng)段的時候,那么當(dāng)我在Client端掛載了Server 端的/home/public后,針對這個被我掛載的目錄我就具有可以讀寫的權(quán)限,至于如果我不是在這個網(wǎng)段之內(nèi),那么這個目錄的文件我就只能讀取而已,亦即為只讀的屬性。
  需要注意的是,通配字符僅能用在主機名稱的分辨上面,IP或網(wǎng)段就只能用192.168.0.0/24的狀況,不可以使用192.168.0.*

  思考三:僅給某個單一主機使用的目錄設(shè)置

  我要將一個私人的目錄 /home/test 開放給192.168.0.100這個Client端的機器來使用,那么我就必需這么寫:

# vi /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.0.0/24(rw)    *(ro)
/home/test    192.168.0.100(rw) # 只要設(shè)定 IP 正確即可!


  這樣就設(shè)定完成了!而且,只有192.168.0.100這部機器才能對/home/test這個目錄進(jìn)行存取。

  思考四:開放匿名登入的情況

  我要讓*.linux.org網(wǎng)域的主機,登入我的NFS主機時,可以存取 /home/linux,但是他們存資料的時候,我希望他們的UID與GID 都變成40這個身份的使用者, 假設(shè)我NFS服務(wù)器上的UID 40已經(jīng)有設(shè)定妥當(dāng):

# vi /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.0.0/24(rw)    *(ro)
/home/test    192.168.0.100(rw)
/home/linux   *.linux.org(rw,all_squash,anonuid=40,anongid=40)
# 如果要開放匿名,那么重點是all_squash,并且要配合anonuid


  特別注意到那個all_squash與anonuid,anongid 的功能!如此一來,當(dāng) test.linux.org 登入這部 NFS 主機,并且在 /home/linux 寫入文件時,該文件的所有人與所有群組,就會變成/etc/passwd 里面對應(yīng)的UID為40的那個身份的使用者。

  上面四個案例的權(quán)限如果依照前一小節(jié)的存取設(shè)定權(quán)限來思考的話,那么權(quán)限會是什么情況呢?讓我們來檢查一下:

  客戶端與主機端具有相同的UID與賬號:

  假設(shè)我在192.168.0.100登入這個NFS(IP假設(shè)為192.168.0.2)主機,并且我在192.168.0.100的賬號為dmtsai這個身份,同時,在這個NFS上面也有dmtsai這個賬號,并具有相同的UID,果真如此的話,那么:

  a) 由于192.168.0.2這個NFS主機的/tmp權(quán)限為-rwxrwxrwt,所以我 (dmtsai在192.168.0.100上面)在/tmp底下具有存取的權(quán)限,并且寫入的文件所有人為dmtsai;
  b) 在/home/public當(dāng)中,由于我有讀寫的權(quán)限,所以如果在/home/public這個目錄的權(quán)限對于dmtsai有開放寫入的話,那么我就可以讀寫,并且我寫入的文件所有人是dmtsai。但是萬一/home/public對于dmtsai這個使用者并沒有開放可以寫入的權(quán)限時,那么我還是沒有辦法寫入文件(這點請?zhí)貏e留意);
  c) 在/home/test當(dāng)中,我的權(quán)限與/home/public相同的狀態(tài),還需要NFS主機的/home/test對于dmtsai有開放權(quán)限;
  d) 在/home/linux當(dāng)中就比較麻煩,因為不論您是何種user ,您的身份一定會被變成UID=40這個賬號!所以,這個目錄就必需要針對UID = 40的那個賬號名稱,修改他的權(quán)限才行。

  客戶端與主機端的賬號并未相同時:

  假如我在192.168.0.100的身份為vbird ,但是192.168.0.2這部NFS主機卻沒有vbird這個賬號時,情況會變成怎樣呢?

  a) 我在/tmp 底下還是可以寫入,但是寫入的文件所有人變成 nobody 了;
  b) 我在/home/public里面是否可以寫入,還需要視/home/public的權(quán)限而定,不過,反正我的身份就被變成nobody了就是;
  c) /home/test 的觀點與/home/public相同!
  d) /home/linux 底下,我的身份就被變成 UID=40那個使用者呢!

  當(dāng)客戶端的身份為 root 時:

  假如我在192.168.0.100的身份為root,root這個賬號每個系統(tǒng)都會有,權(quán)限變成怎樣呢?

  a) 我在/tmp里面可以寫入,并且由于no_root_squash的參數(shù),改變了預(yù)設(shè)的root_squash設(shè)定值,所以在/tmp寫入的文件所有者為 root
  b) 我在/home/public底下的身份還是被壓縮成為nobody,因為預(yù)設(shè)屬性里面都具有root_squash,所以,如果/home/public 有針對 nobody開放寫入權(quán)限時,那么我就可以寫入,但是文件所有者變成nobody
  c) /home/test與/home/public相同;
  d) /home/linux 的情況中,我root的身份也被壓縮成為UID=40的那個使用者

  這樣的權(quán)限講解之后,您可以了解了嗎?這里是最重要的地方,如果這一關(guān)通過了,下面的就沒有問題啦! 當(dāng)然,您還是得要回到前一小節(jié)NFS 的文件存取權(quán)限好好的瞧一瞧, 才能解決NFS的問題。

3.4 NFS服務(wù)的啟動
  
  NFS的啟動還需要portmap的協(xié)助,所以需先啟動。

# /etc/init.d/portmap start
# 如果 portmap 本來就已經(jīng)在執(zhí)行了,那就不需要啟動??!

# /etc/init.d/nfs start
# 有時候可能會出現(xiàn)如下的警告訊息:
exportfs: /etc/exports [3]: No ‘sync‘ or ‘a(chǎn)sync‘ option specified
for export "192.168.0.100:/home/test".
Assuming default behaviour (‘sync‘).
# 上面的警告訊息僅是在告知因為我們沒有指定 sync 或 async 的參數(shù),
# 則NFS將預(yù)設(shè)會使用sync的資訊而已。你可以不理他,也可以加入/etc/exports。

# vi /etc/exports
/tmp          *(rw,no_root_squash,sync)
/home/public  192.168.0.0/24(rw,sync)    *(ro,sync)
/home/test    192.168.0.100(rw,sync)
/home/linux   *.linux.org(rw,all_squash,anonuid=40,anongid=40,sync)

# /etc/init.d/nfs restart


  portmap不需要設(shè)定,只要直接啟動就行,啟動之后,會出現(xiàn)一個port 111的sunrpc的服務(wù),那就是portmap啦!至于nfs則會啟動至少兩個以上的daemon出現(xiàn)!然后就開始在監(jiān)聽Client端的請求。你必須要很注意屏幕上面的輸出資訊, 因為如果配置文件寫錯的話,屏幕上會顯示出錯誤。

  此外,如果你想要增加一些NFS服務(wù)器的文件一致性功能時,可能需要用到rpc.lockd及rpc.statd等RPC服務(wù), 那么或許你可以增加一個服務(wù),那就是nfslock

# /etc/init.d/nfslock start


  啟動之后,請趕快到 /var/log/messages 里面看看有沒有被正確的啟動呢?

# vi /var/log/messages
Sep 22 00:01:37 linux nfs: Starting NFS services:  succeeded
Sep 22 00:01:37 linux nfs: rpc.rquotad startup succeeded
Sep 22 00:01:37 linux nfsd[1050]: nfssvc_versbits: +2 +3 +4
Sep 22 00:01:37 linux nfs: rpc.nfsd startup succeeded
Sep 22 00:01:37 linux nfs: rpc.mountd startup succeeded
Sep 22 00:01:37 linux rpcidmapd: rpc.idmapd -SIGHUP succeeded


  在確認(rèn)沒有問題之后,接下來我們來看一看NFS到底開了哪些端口?

# netstat -ultn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   State   PID/Program name
tcp        0      0 0.0.0.0:2049    LISTEN  -
tcp        0      0 0.0.0.0:803     LISTEN  1047/rpc.rquotad
tcp        0      0 0.0.0.0:111     LISTEN  32503/portmap
tcp        0      0 0.0.0.0:819     LISTEN  1064/rpc.mountd
udp        0      0 0.0.0.0:2049            -
udp        0      0 0.0.0.0:800             1047/rpc.rquotad
udp        0      0 0.0.0.0:816             1064/rpc.mountd
udp        0      0 0.0.0.0:111             32503/portmap


  注意看到上面,總共產(chǎn)生了好多的port,真是可怕!不過主要的端口是:

  portmap啟動的 port 在 111;
  NFS啟動的port在2049;
  其它rpc.daemons啟動的port則是隨機產(chǎn)生的,因此需向port 111注冊。
  
  好了,那我怎么知道每個RPC服務(wù)的注冊狀況?你可以使用 rpcinfo 來處理的。

# rpcinfo [-p] [IP|hostname]
參數(shù):
-p :顯示出所有的 port 與 porgram 的信息;



  范例一:顯示出目前這部主機的 RPC 狀態(tài)

# rpcinfo -p localhost
 program vers proto   port
  100000    2   tcp    111  portmapper
  100000    2   udp    111  portmapper
  100011    1   udp    800  rquotad
  100011    2   udp    800  rquotad
  100011    1   tcp    803  rquotad
  100011    2   tcp    803  rquotad
  100003    2   udp   2049  nfs
  100003    3   udp   2049  nfs
  100003    2   tcp   2049  nfs
  100003    3   tcp   2049  nfs
  100005    1   udp    816  mountd
  100005    1   tcp    819  mountd
  100005    2   udp    816  mountd
  100005    2   tcp    819  mountd
  100005    3   udp    816  mountd
  100005    3   tcp    819  mountd
#         NFS版本       端口  服務(wù)名稱


  上面出現(xiàn)的信息當(dāng)中除了程序名稱與端口的對應(yīng)可以與netstat -tlunp輸出的結(jié)果作比對之外,還需要注意到NFS版本支持!新的NFS 版本傳輸速度較快,由上表看起來,我們的NFS至少支持到第3版,應(yīng)該還算合理,如果你的rpcinfo無法輸出,那就表示注冊的資料有問題,可能需要重新啟動portmap與nfs。

3.5 NFS的連接觀察

  在你的NFS服務(wù)器設(shè)定好之后,我們可以先自我測試一下是否可以連接?

showmount [-ae] [hostname|IP]
參數(shù):
-a :這個參數(shù)是一般在NFS SERVER上使用,是用來顯示已經(jīng)mount上本機nfs目錄的cline機器
-e :顯示主機的 /etc/exports 所共享的目錄。


  范例一:請顯示出剛剛我們所設(shè)定好的相關(guān)exports信息

# showmount -e localhost
Export list for localhost:
/tmp         *
/home/linux  *.linux.org
/home/public (everyone)
/home/test   192.168.0.100


  很簡單吧!所以,當(dāng)您要查看某一臺主機提供的NFS共享的目錄時,就使用 showmount -e IP (或hostname)即可!非常的方便吧!這也是 NFS client 端最常用的指令。

  事實上NFS關(guān)于目錄權(quán)限設(shè)定的資料非常之多!我們可以檢查一下/var/lib/nfs/etab就知道了!

# tail /var/lib/nfs/etab
/home/public    *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,
subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
# 上面是同一行,可以看出除了 ro, sync, root_squash 等等,
# 其實還有 anonuid 及 anongid 等等的設(shè)定!

/tmp    *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,subtr
ee_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
# 同樣的,在/tmp也有很多的權(quán)限相關(guān)的參數(shù)


  上面僅僅是一個小范例,只是....怎么anonuid會是-2?其實那個數(shù)值是65536-2,所以得到65534,比對/etc/passwd,會發(fā)現(xiàn)RHEL4出現(xiàn)的是nfsnobody,這個賬號在不同的版本都可能會不一樣。 另外,如果有其他客戶端掛載了你的NFS文件系統(tǒng)時,那么該客戶端與文件系統(tǒng)信息就會被記錄到/var/lib/nfs/xtab。

  另外,如果你想要重新處理/etc/exports文件,是不是我們每次修改了配置文件都需要重啟nfs服務(wù)呢?這個時候我們就可以用exportfs命令重新掃描/etc/exports文件,來使改動立刻生效。

exportfs [-aruv]
參數(shù):
-a :全部掛載(或卸載)/etc/exports文件內(nèi)的設(shè)置
-r :重新掛載/etc/exports里面的設(shè)置,此外,亦同步更新/etc/exports及/var/lib/nfs/xtab 的內(nèi)容!
-u :卸載某一目錄
-v :在export的時候,將分享的目錄顯示到屏幕上!


  范例一:重新掛載一次 /etc/exports的設(shè)置

# exportfs -arv
exporting 192.168.0.100:/home/test
exporting 192.168.0.0/24:/home/public
exporting *.linux.org:/home/linux
exporting *:/home/public
exporting *:/tmp


  范例二:全部卸載

# exportfs -auv


3.6 NFS的安全性

  在NFS的安全性上面,有些地方是你必須知道的!下面我們分別來看一看:

  a) 利用iptables做大范圍連接的限制:

  假設(shè)我們的NFS主要是針對內(nèi)部網(wǎng)路開放而已,而對于外部網(wǎng)路只有對140.116.0.0/16這個網(wǎng)段 ,那么你可以在iptables.allow內(nèi)增加如下的語法:

# vi /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i $EXTIF -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i $EXTIF -p TCP -s 140.116.0.0/16 --dport 111 -j ACCEPT
iptables -A INPUT -i $EXTIF -p UDP -s 140.116.0.0/16 --dport 111 -j ACCEPT


  這樣大致上就可以讓 192.168.0.0/24 這個C Class的網(wǎng)域與140.116.0.0/16這個 B Class的網(wǎng)段到您的主機里面來,而其它的連接就視您的原本的iptables的狀態(tài)而定。

  那為什么是限制port 111而不是每個RPC server所開啟的端口呢?因為RPC server所開啟的端口都是隨機產(chǎn)生的,要對他開放實在是... 而且客戶端想要連上NFS服務(wù)器之前,都是透過port 111來向NFS服務(wù)器詢問連接的端口的,所以當(dāng)然先就port 111來進(jìn)行限制。

b) 利用 TCP Wrappers 限制

  但是不同的 RPC 畢竟提供的服務(wù)不一樣,如果你想要針對某些服務(wù)來阻止的話,那可以透過TCP Wrappers這個根據(jù) program name來阻止網(wǎng)路包,還記得我們剛剛使用過rpcinfo這個指令,不是會輸出很多的RPC program name嗎?沒錯!你可以這樣做:

# vi /etc/hosts.allow
# 讓來自 140.116.44.0/255.255.255.0 的主機可以使用 mountd
mountd: 140.116.44.0/255.255.255.0

# vi /etc/hosts.deny
# 讓所有人都不能使用 mountd
mountd: ALL


  為什么使用的是mountd呢?去到前一小節(jié)的rpcinfo指令處看一下, 你就會知道為何需要使用到mountd。

  c) 使用/etc/exports 設(shè)定更安全的權(quán)限

  這就牽涉到您的邏輯思考了!怎么設(shè)置都沒有關(guān)系,但是在『便利』與『安全』之間,要找到您的平衡點。善用root_squash 及 all_squash 等功能,再利用anonuid等等的設(shè)定來規(guī)范登入您主機的使用者身份!應(yīng)該還是有辦法提供一個較為安全的NFS主機的!

  另外,當(dāng)然啦,你的NFS服務(wù)器的文件系統(tǒng)之權(quán)限設(shè)定也需要很留意!不要隨便設(shè)定成為-rwxrwxrwx ,這樣會造成你的系統(tǒng)『很大的困擾』。

  d) 更安全的 partition 規(guī)劃:

  如果您的工作環(huán)境中,具有多部的 Linux 主機,并且預(yù)計彼此共享出目錄時,那么在安裝 Linux 的時候,最好就可以規(guī)劃出一塊 partition作為預(yù)留之用。因為『NFS可以針對目錄來分享』,因此,您可以將預(yù)留的partition掛載在任何一個掛載點,再將該掛載點 (就是目錄)由/etc/exports的設(shè)定中分享出去,那么整個工作環(huán)境中的其他Linux主機就可以使用該NFS主機的那塊預(yù)留的 partition。所以,在主機的規(guī)劃上面,主要需要留意的只有partition而已。此外,由于共享的partition可能較容易被入侵,最好可以針對該partition設(shè)定比較嚴(yán)格的參數(shù)在/etc/fstab當(dāng)中。

  e) NFS服務(wù)器關(guān)機前的注意事項:

  需要注意的是,由于NFS使用的這個RPC在client端連上服務(wù)器時,那么您的服務(wù)器想要關(guān)機,那可就會成為『不可能的任務(wù)』!如果您的Server上面還有Client在連接,那么您要關(guān)機,可能得要等到數(shù)個鐘頭才能夠正常的關(guān)機成功!真的假的?不相信嗎?不然您自已試試看!

  所以,建議您的NFS Server想要關(guān)機之前,能先『關(guān)掉portmap與nfs』。如果無法正確的將這兩個daemons關(guān)掉,那么先以netstat -utlp找出PID ,然后以kill將他殺掉先,這樣才有辦法正常的關(guān)機成功。請?zhí)貏e的注意!

  當(dāng)然,你也可以利用showmount -a localhost查出來那個客戶端還在連接,或者是查閱/var/lib/nfs/rmtab或xtab等文件來檢查亦可。找到這些客戶端后,可以直接call他們?。∽屗麄兡軌驇蛶兔ο?!

  事實上,客戶端以NFS連接到服務(wù)器端時,如果他們可以下達(dá)一些比較不那么『硬』的掛載參數(shù)時,就能夠減少這方面的問題。相關(guān)的安全性可以參考下一小節(jié)的客戶端可處理的掛載參數(shù)與開機掛載。

4、NFS 客戶端的設(shè)定

  既然NFS服務(wù)器最主要的工作就是共享文件系統(tǒng)給網(wǎng)路上其他的客戶端,所以客戶端當(dāng)然得要掛載這個玩意兒!此外,主機端可以加設(shè)防火墻來保護(hù)自己的文件系統(tǒng),那么客戶端掛載該文件系統(tǒng)后,難道不需要保護(hù)自己? 所以下面我們要來談一談幾個NFS客戶端。

4.1 遠(yuǎn)端NFS服務(wù)器的掛載

  你要如何掛載NFS服務(wù)器所提供的文件系統(tǒng)?基本上,可以這樣做:

  a) 確認(rèn)本地端已經(jīng)啟動了portmap服務(wù)!  
  b) 查看NFS服務(wù)器共享的目錄有哪些,并了解我們是否可以使用(showmount);
  c) 在本地端建立預(yù)計要掛載的掛載點目錄(mkdir);
  d) 利用mount將遠(yuǎn)端主機直接掛載到相關(guān)目錄。

  好,現(xiàn)在假設(shè)客戶端在192.168.0.100這部機器上,而服務(wù)器是192.168.0.2,那么趕緊來檢查一下我們是否已經(jīng)有portmap的啟動,另外遠(yuǎn)端主機有什么可用的目錄!
# /etc/init.d/portmap start
# /etc/init.d/nfslock start
# 一般來說,系統(tǒng)預(yù)設(shè)會啟動 portmap
# 另外,如果服務(wù)器端有啟動nfslock的話,客戶端也要啟動才能生效!

# showmount -e 192.168.0.2
Export list for 192.168.0.2:
/tmp         *
/home/linux  *.linux.org
/home/public (everyone)   <==這是等一下我們要掛載的目錄
/home/test   192.168.0.100


  接下來我想要將遠(yuǎn)端主機的/home/public掛載到本地端主機的 /home/nfs/public,所以我就得要在本地端主機先建立起這個掛載點目錄才行?。∪缓缶涂梢杂胢ount這個命令直接掛載NFS的文件系統(tǒng)!

# mkdir -p /home/nfs/public
# mount -t nfs 192.168.0.2:/home/public /home/nfs/public
# 注意一下掛載的語法!『 -t nfs 』指定文件系統(tǒng)類型
# IP:/dir 則是指定某一部主機的某個提供的目錄!

# df
Filesystem    1K-blocks      Used Available Use% Mounted on
....中間省略....
192.168.0.2:/home/public
             10080512   2135072   7433344  23% /home/nfs/public

4.2 客戶端可處理的掛載參數(shù)與開機掛載

  如果你剛剛掛載到本機/home/nfs/public的文件系統(tǒng)當(dāng)中,含有一個 script,且這個script的內(nèi)容為『 rm -rf / 』且該文件權(quán)限為555,如果你因為好奇給它執(zhí)行下去,整個系統(tǒng)都會被刪掉!

  所以說,除了NFS服務(wù)器需要保護(hù)之外,我們?nèi)∮萌思业腘FS文件系統(tǒng)也需要自我保護(hù)才行。 那要如何自我保護(hù)啊?可以透過mount的指令參數(shù)!包括底下這些主要的參數(shù)可以嘗試加入:

suid、nosuid
  如果掛載的partition上面有任何suid的binary程序時,你只要使用nosuid就能夠取消SUID的功能。
  系統(tǒng)預(yù)設(shè)值:suid

rw、ro
  你可以指定該partition是只讀(ro)或可讀寫。
  系統(tǒng)預(yù)設(shè)值:rw

dev、nodev
  是否可以保留裝置文件的特殊功能。一般來說只有/dev才會有特殊的裝置,因此你可以選擇nodev。
  系統(tǒng)預(yù)設(shè)值:dev

exec、noexec
  是否具有執(zhí)行binary file的權(quán)限。如果你想要掛載的僅是資料區(qū)(例如/home),那么可以選擇noexec。
  系統(tǒng)預(yù)設(shè)值:exec

user、nouser
  是否允許使用者進(jìn)行文件的掛載與卸載功能。如果要保護(hù)文件系統(tǒng),最好不要提供使用者進(jìn)行掛載與卸載。
  系統(tǒng)預(yù)設(shè)值:nouser

auto
noauto
  這個auto指的是『mount -a』時,會不會被掛載的項目。如果你不需要這個partition隨時被掛載,可以設(shè)定為noauto。
  系統(tǒng)預(yù)設(shè)值:auto

  一般來說,如果你的NFS服務(wù)器所提供的只是類似/home下面的個人資料,應(yīng)該不需要可執(zhí)行、SUID與裝置文件,因此當(dāng)你在掛載的時候,可以這樣掛載:

# mount -t nfs -o nosuid,noexec,nodev,rw 192.168.0.2:/home/public /home/nfs/public

# mount
192.168.0.2:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,addr=192.168.0.2)


  這樣一來你所掛載的這個文件系統(tǒng)就只能作為文件存取之用,相對來說,對于客戶端是比較安全一些的。

  關(guān)于NFS特殊的掛載參數(shù)

  除了上述的mount參數(shù)之外,其實針對NFS服務(wù)器,Linux 還提供不少有用的額外參數(shù)。因為NFS使用的是RPC服務(wù),這個RPC必須要客戶端與服務(wù)器端兩者都有啟動RPC才能運作。在一般的模式下面,你想要在客戶端掛載服務(wù)器端的NFS文件系統(tǒng)時,一次命令只能掛載一次, 如果該次掛載由于某些問題 (例如服務(wù)器未開機、RPC忘記開等等)導(dǎo)致無法順利掛載時,你只能等到連接超時(time out)后,才能夠繼續(xù)工作。

  另外,當(dāng)建立連接后,RPC會不斷的在客戶端與服務(wù)器兩者之間進(jìn)行呼叫,此時如果有一個主機失去連接,那么RPC將會持續(xù)不斷的呼叫,直到服務(wù)器或客戶端恢復(fù)連接為止。此一行為將導(dǎo)致RPC服務(wù)出現(xiàn)延遲問題,結(jié)果常常就造成你在執(zhí)行df或者是mount等命令時,出現(xiàn)『等等等等』的情況。

  為了避免這些困擾,我們還有一些額外的NFS掛載參數(shù)可用。例如:

fg、bg
  當(dāng)執(zhí)行掛載時,該掛載的行為會在前臺(fg)還是在后臺(bg)執(zhí)行? 若在前臺執(zhí)行時,則mount會持續(xù)嘗試掛載,直到成功或 time out 為止,若為后臺執(zhí)行,則mount會在后臺持續(xù)多次進(jìn)行mount,而不會影響到前臺的程序操作。如果你的網(wǎng)路連接有點不穩(wěn)定,或是服務(wù)器常常需要開關(guān)機,那建議使用bg比較妥當(dāng)。
  預(yù)設(shè)參數(shù):fg

soft
hard
  上面不是談到掛載時會使用RPC呼叫,如果是hard的情況,則當(dāng)兩者之間有任何一個主機離線,則RPC會持續(xù)的呼叫,直到對方恢復(fù)連接為止。 如果是soft的話,那RPC會在time out后『重復(fù)』呼叫,而非『持續(xù)』呼叫, 因此系統(tǒng)的延遲會比較不這么明顯。同上,如果你的服務(wù)器可能開開關(guān)關(guān),建議用soft
  預(yù)設(shè)參數(shù): hard

intr
  當(dāng)你使用上面提到的hard方式掛載時,若加上intr這個參數(shù), 則當(dāng)RPC持續(xù)呼叫中,該次的呼叫是可以被中斷的 (interrupted)。
  預(yù)設(shè)參數(shù):無

rsize
wsize
  讀出(rsize)與寫入(wsize)的區(qū)塊大小(block size)。這個設(shè)定值可以影響客戶端與服務(wù)器端傳輸資料的緩存記憶容量。一般來說,如果在局域網(wǎng)路內(nèi)(LAN),并且客戶端與服務(wù)器端都具有足夠的內(nèi)存,那這個值可以設(shè)置大一點,比如說8192 (bytes)等,提升緩存記憶區(qū)塊將可提升NFS文件系統(tǒng)的傳輸能力。但要注意設(shè)定的值也不要太大,最好是達(dá)到網(wǎng)路能夠傳輸?shù)淖畲笾禐橄?。舉例來說,如果你的MTU可達(dá)9000,那設(shè)定成 8192 才會有意義。
  預(yù)設(shè)參數(shù):rsize=1024
       wsize=1024

  更多的參數(shù)可以參考 man nfs ,通常如果你的NFS是用在高速運作的環(huán)境當(dāng)中的話,那么可以建議加上這些參數(shù):

# mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=8192,wsize=8192  192.168.0.2:/home/public /home/nfs/public


  則當(dāng)你的 192.168.0.2這個服務(wù)器因為某些因素離線時,你的NFS可以繼續(xù)在后臺中重復(fù)的呼叫!直到NFS服務(wù)器再度上線為止。這對于系統(tǒng)的持續(xù)操作還是有幫助的, rsize與wsize的大小則需要依據(jù)你的實際網(wǎng)路環(huán)境而定。

  啟動時自動掛載NFS

  修改客戶機的 /etc/fstab文件,加入類似如下行:

# vi /etc/fstab
192.168.0.2:/home/public   /home/nfs/public   nfs   nosuid,noexec,nodev,rw,bg,soft,rsize=8192,wsize=8192   0   0
# 注意!上面的設(shè)定是同一行

4.3 自動掛載 autofs 的使用

  在傳統(tǒng)的 NFS 文件系統(tǒng)的使用中,如果客戶端要使用服務(wù)器端所提供的NFS文件系統(tǒng)時:

  1、在 /etc/fstab 當(dāng)中設(shè)定開機時掛載,
  2、要手動利用mount來掛載。 此外,客戶端得要預(yù)先手動的建立好掛載點目錄。

  不過有個小問題,我們知道NFS服務(wù)器與客戶端的連接或許可能不會永遠(yuǎn)存在, 而RPC這個服務(wù),如果掛載了NFS服務(wù)器后,任何一方離線都可能造成另外一方老是在等待超時。

  換個思考的角度:
 
  可不可以讓客戶端在有使用到NFS文件系統(tǒng)的需求時才掛載?
  并且不需要事先建立掛載點?
  另外,當(dāng)NFS文件系統(tǒng)使用完畢后,可不可以讓NFS自動卸載,以避免可能的 RPC 錯誤?

  在現(xiàn)在的Linux環(huán)境下采用autofs服務(wù)是可以達(dá)成。

  autofs使用automount守護(hù)進(jìn)程來管理你的掛載點,它只在文件系統(tǒng)被訪問時才動態(tài)地掛載它們。 autofs查詢主配置文件 /etc/auto.master來決定要定義哪些掛載點。然后,它使用適用于各個掛載點的參數(shù)來啟動automount進(jìn)程。主配置中的每一行都定義一個掛載點,然后用單獨的配置文件定義在該掛載點下要掛載的文件系統(tǒng)。

  autofs可以預(yù)先定義好客戶端『預(yù)計掛載來自服務(wù)器端的上層目錄』,以及其相關(guān)的對應(yīng)NFS服務(wù)器共享目錄。至于在該目錄下面的對應(yīng)目錄則可以不需要額外設(shè)置。讓我們看看下面的圖示:

            
         
  圖四、自動掛載的設(shè)定檔內(nèi)容


  如上圖所示,我們的autofs主要設(shè)定檔為 /etc/auto.master,這個文件的內(nèi)容很簡單, 如上所示,我只要定義出最上層目錄 (/home/nfs) 即可,至于后續(xù)的文件則是該目錄底下各次目錄的對應(yīng)。 在etc/auto.nfs (這個文件的文件名可自定義) 里面則可以定義出每個次目錄所欲掛載的遠(yuǎn)端服務(wù)器目錄。 然后:『當(dāng)我們在客戶端要使用 /home/nfs/public 的資料時,此時 autofs 才會去 192.168.0.2 掛載/home/public』且『當(dāng)隔了5分鐘沒有使用該目錄下的文件后,則/home/nfs/public 將會主動的卸載』。

  建立主要配置文件 /etc/auto.master

  這個主要配置文件的內(nèi)容很簡單,只要有預(yù)設(shè)目錄及『資料對應(yīng)文件』即可。 那個資料對應(yīng)文件的文件名是可以自行定義的,在這個例子當(dāng)中我使用 /etc/auto.nfs 來命名。

# vi /etc/auto.master
/home/nfs  /etc/auto.nfs

# mkdir /home/nfs
# 注意!此時 /home/nfs 內(nèi)并沒有其他的目錄存在


  建立資料對應(yīng)文件內(nèi)的掛載資訊

  剛剛我們所指定的/etc/auto.nfs是自行設(shè)定的,所以這個文件是不存在的。該文件的格式:

[本地端目錄] [-掛載參數(shù)] [服務(wù)器所提供的目錄]

參數(shù):

本地端目錄:指的就是在 /etc/auto.master 內(nèi)指定的目錄之次目錄
-掛載參數(shù) :就是前一小節(jié)提到的 rw,bg,soft 等等的參數(shù);
服務(wù)器所提供的目錄 :例如 192.168.0.2:/home/public 等

# vi /etc/auto.nfs
public  -rw,bg,soft,rsize=8192,wsize=8192 192.168.0.2:/home/public
testing -rw,bg,soft,rsize=8192,wsize=8192 192.168.0.2:/home/test
temp    -rw,bg,soft,rsize=8192,wsize=8192 192.168.0.2:/tmp

# 參數(shù)部分,只要最前面加個 - 符號即可!


  這樣就可以建立對應(yīng)了!要注意的是,那些 /home/nfs/public 是不需要事先建立的。(public目錄是由 automount 動態(tài)地創(chuàng)建的,它不應(yīng)該在客戶機器上實際存在。)

  實際運作與觀察

  配置文件配置好后,啟動autofs

# /etc/init.d/autofs start


  假設(shè)你目前并沒有掛載任何來自192.168.0.2這個NFS服務(wù)器的目錄, 讓我們實際來看看,如果我要進(jìn)入 /home/nfs/public 時,文件系統(tǒng)會如何變化呢?

# mount; df
# 你不會看到任何跟192.168.0.2這個主機有關(guān)的NFS掛載信息。

# cd /home/nfs/public

# mount; df
192.168.0.2:/home/public on /home/nfs/public type nfs (rw,bg,soft,rsize=8192,wsize=8192,addr=140.116.44.179)
# 上面的輸出是同一行

Filesystem 1K-blocks     Used Available Use% Mounted on
192.168.0.2:/home/public
          10080488  2144288   7424136  23% /home/nfs/public
# 文件的掛載也出現(xiàn)沒錯!

# pwd
/home/nfs/public
# 應(yīng)當(dāng)注意public目錄是由 automount 動態(tài)地創(chuàng)建的,它不應(yīng)該在客戶機器上實際存在。

4.4 無法掛載的原因分析
  
  使用者或客戶端身份權(quán)限不符:

  以上面的例子來說明,我的/home/test只能提供 192.168.0.0/24 這個網(wǎng)域,所以如果我在 192.168.0.2 這部服務(wù)器中,以 localhost (127.0.0.1) 來掛載時,就會無法掛載上,這個權(quán)限概念沒問題吧! 那么您可以試試看:

# mount -t nfs localhost:/home/test /home/nfs
mount: localhost:/home/test failed, reason given by server: Permission denied


  服務(wù)器或客戶端某些服務(wù)未啟動:

  如果您發(fā)現(xiàn)您的mount的訊息是這樣,說明未啟動portmap或服務(wù)器nfs這個服務(wù)。

# mount -t nfs localhost:/home/test /home/nfs
mount: RPC: Port mapper failure - RPC: Unable to receive

# mount -t nfs localhost:/home/test /home/nfs
mount: RPC: Program not registered


  被防火墻阻擋

  這個原因很多人都忽視了,在有嚴(yán)格要求的網(wǎng)絡(luò)環(huán)境中,我們一般會關(guān)閉linux上的所有端口,當(dāng)需要使用哪個端口的時候才會去打開。而NFS默認(rèn)是使用111端口,所以我們先要檢測是否打開了這個端口,另外也要檢查TCP_Wrappers的設(shè)定。

5、案例演練

  假設(shè)環(huán)境:

  假設(shè)我的 Linux 主機為 192.168.0.100 這一臺;
  預(yù)計將 /tmp 以可讀寫,并且不限制使用者身份的方式分享給所有 192.168.0.0/24 這個網(wǎng)域中的所有 Linux 工作站;
  預(yù)計開放 /home/nfs 這個目錄,使用的屬性為唯讀,可提供除了網(wǎng)域內(nèi)的工作站外,向外亦提供資料內(nèi)容;
  預(yù)計開放 /home/upload 做為 192.168.0.0/24 這個網(wǎng)域的資料上傳目錄,其中,這個 /home/upload 的使用者及所屬群組為 nfs-upload 這個名字,他的 UID 與 GID 均為 210;
  預(yù)計將 /home/andy 這個目錄僅分享給 192.168.0.50 這部 Linux 主機,以提供該主機上面 andy 這個使用者來使用,也就是說, andy 在 192.168.0.50 及 192.168.0.100 均有賬號,且賬號均為 andy ,所以預(yù)計開放 /home/andy 給 andy 使用他的家目錄啦!

  實地演練:
  
  (1)、首先,就是要建立/etc/exports這個文件的內(nèi)容,您可以這樣寫:

# vi /etc/exports
/tmp         192.168.0.*(rw,no_root_squash)
/home/nfs    192.168.0.*(ro)  *(ro,all_squash)
/home/upload 192.168.0.*(rw,all_squash,anonuid=210,anongid=210)
/home/andy   192.168.0.50(rw)


  (2)、再來,就是要建立每個對應(yīng)的目錄的實際Linux權(quán)限:

  a. /tmp
# ll -d /tmp
drwxrwxrwt  5 root root 20480 Sep 22 22:52 /tmp


  b. /home/nfs
# mkdir -p /home/nfs
# chmod 755 -R /home/nfs
# 修改較為嚴(yán)格的文件權(quán)限將目錄與文件設(shè)定成只讀!不能寫入的狀態(tài),會更保險一點!


  c. /home/upload
# groupadd -g 210 nfs-upload
# useradd -g 210 -u 210 -M nfs-upload
# 先建立對應(yīng)的賬號與群組名稱及UID
# mkdir -p /home/upload
# chown -R nfs-upload:nfs-upload /home/upload
# 修改擁有者!如此,則使用者與目錄的權(quán)限都設(shè)定妥當(dāng)!

 (3)、啟動 portmap 與 nfs 服務(wù):
# /etc/init.d/portmap start
# /etc/init.d/nfs start
# /etc/init.d/nfslock start


  (4)、在 192.168.0.50 這部機器上面測試一下:

  a. 確認(rèn)遠(yuǎn)端服務(wù)器的可用目錄:
# /etc/init.d/portmap start
# /etc/init.d/nfslock start
# showmount -e 192.168.0.100
Export list for 192.168.0.100:
/tmp         192.168.0.*
/home/nfs    (everyone)
/home/upload 192.168.0.*
/home/andy   192.168.0.50


  b. 建立掛載點:
# mkdir -p /home/zzz/tmp
# mkdir -p /home/zzz/nfs
# mkdir -p /home/zzz/upload
# mkdir -p /home/zzz/andy


  c. 實際掛載:
# mount -t nfs 192.168.0.100:/tmp         /home/zzz/tmp
# mount -t nfs 192.168.0.100:/home/nfs    /home/zzz/nfs
# mount -t nfs 192.168.0.100:/home/upload /home/zzz/upload
# mount -t nfs 192.168.0.100:/home/andy   /home/zzz/andy


  整個步驟大致上就是這樣。

6、參考資料
  http://debian./doc/inthedebianway/nfs/
  http://www./bbs/showthread.php?t=3902
  http://fanqiang./a1/b1/20010607/110001424.html
  http://linux./linux_server/0330nfs.php#What_NFS_NFS
  http://x./65438/viewspace_19518.html
  http://www./htmldata/2004_07/1/3/article_159_1.html
 

 原文地址 http://blog./read.php?32&part=11

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多