日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Linux下NFS網絡文件系統(tǒng)設定及管理 - NFS服務

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

1、準備工作

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

2、 NFS的由來與其功能

2.1 什么是 NFS (Network FileSystem)

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

            

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


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

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

2.2 什么是 RPC (Remote Procedure Call)

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

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

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

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

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

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

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

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

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


2.3 NFS啟動的RPC daemons

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

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

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

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

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

2.4 NFS的文件存取權限

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

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

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

               
         
  圖三、NFS 的服務器端與客戶端的使用者身份確認機制


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

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

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

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

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

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

  NFS服務器有開放可寫入的權限(與/etc/exports設定有關);
  實際的文件權限具有可寫入(w)的權限。

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

3、NFS Server 端的設定

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

3.1 所需要的套件

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

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

  portmap

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

  nfs-utils

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

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

  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的套件結構

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

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

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

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

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

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

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

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

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


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

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


  其中參數是可選的,當不指定參數時,nfs將使用默認選項。默認的共享選項是 sync,ro,root_squash,no_delay。

  當主機名或IP地址為空時,則代表共享給任意客戶機提供服務。

  當將同一目錄共享給多個客戶機,但對每個客戶機提供的權限不同時,可以這樣:

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


  下面是一些NFS共享的常用參數:
    
ro: read-only,只讀訪問權限

rw: read-write,可讀寫的權限

sync: 資料同步寫入到內存與硬盤中

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

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

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

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

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

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

no_hide: 共享NFS目錄的子目錄

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

no_subtree_check: 和上面相對,不檢查父目錄權限

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

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

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

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

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

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

  思考一:讓root保有root的權限

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

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


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

  思考二:同一目錄針對不同范圍開放不同權限

  我要將一個公共的目錄/home/public公開出去,但是只有限定我的局域網內192.168.0.0/24這個網段可以讀寫,其他人則只能讀取:

# vi /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.0.0/24(rw)    *(ro)
# 繼續(xù)加在后面,注意,我有將主機與網域分為兩段(用空格隔開)


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

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

  我要將一個私人的目錄 /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) # 只要設定 IP 正確即可!


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

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

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

# 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 的功能!如此一來,當 test.linux.org 登入這部 NFS 主機,并且在 /home/linux 寫入文件時,該文件的所有人與所有群組,就會變成/etc/passwd 里面對應的UID為40的那個身份的使用者。

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

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

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

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

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

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

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

  當客戶端的身份為 root 時:

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

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

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

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

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

# /etc/init.d/nfs start
# 有時候可能會出現如下的警告訊息:
exportfs: /etc/exports [3]: No ‘sync‘ or ‘async‘ option specified
for export "192.168.0.100:/home/test".
Assuming default behaviour (‘sync‘).
# 上面的警告訊息僅是在告知因為我們沒有指定 sync 或 async 的參數,
# 則NFS將預設會使用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不需要設定,只要直接啟動就行,啟動之后,會出現一個port 111的sunrpc的服務,那就是portmap啦!至于nfs則會啟動至少兩個以上的daemon出現!然后就開始在監(jiān)聽Client端的請求。你必須要很注意屏幕上面的輸出資訊, 因為如果配置文件寫錯的話,屏幕上會顯示出錯誤。

  此外,如果你想要增加一些NFS服務器的文件一致性功能時,可能需要用到rpc.lockd及rpc.statd等RPC服務, 那么或許你可以增加一個服務,那就是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


  在確認沒有問題之后,接下來我們來看一看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


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

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

# rpcinfo [-p] [IP|hostname]
參數:
-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版本       端口  服務名稱


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

3.5 NFS的連接觀察

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

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


  范例一:請顯示出剛剛我們所設定好的相關exports信息

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


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

  事實上NFS關于目錄權限設定的資料非常之多!我們可以檢查一下/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 等等的設定!

/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也有很多的權限相關的參數


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

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

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


  范例一:重新掛載一次 /etc/exports的設置

# 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做大范圍連接的限制:

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

# 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的網域與140.116.0.0/16這個 B Class的網段到您的主機里面來,而其它的連接就視您的原本的iptables的狀態(tài)而定。

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

b) 利用 TCP Wrappers 限制

  但是不同的 RPC 畢竟提供的服務不一樣,如果你想要針對某些服務來阻止的話,那可以透過TCP Wrappers這個根據 program name來阻止網路包,還記得我們剛剛使用過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 設定更安全的權限

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

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

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

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

  e) NFS服務器關機前的注意事項:

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

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

  當然,你也可以利用showmount -a localhost查出來那個客戶端還在連接,或者是查閱/var/lib/nfs/rmtab或xtab等文件來檢查亦可。找到這些客戶端后,可以直接call他們??!讓他們能夠幫幫忙先!

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

4、NFS 客戶端的設定

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

4.1 遠端NFS服務器的掛載

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

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

  好,現在假設客戶端在192.168.0.100這部機器上,而服務器是192.168.0.2,那么趕緊來檢查一下我們是否已經有portmap的啟動,另外遠端主機有什么可用的目錄!
# /etc/init.d/portmap start
# /etc/init.d/nfslock start
# 一般來說,系統(tǒng)預設會啟動 portmap
# 另外,如果服務器端有啟動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


  接下來我想要將遠端主機的/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 客戶端可處理的掛載參數與開機掛載

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

  所以說,除了NFS服務器需要保護之外,我們取用人家的NFS文件系統(tǒng)也需要自我保護才行。 那要如何自我保護???可以透過mount的指令參數!包括底下這些主要的參數可以嘗試加入:

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

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

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

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

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

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

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

# 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)就只能作為文件存取之用,相對來說,對于客戶端是比較安全一些的。

  關于NFS特殊的掛載參數

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

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

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

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

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

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

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

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

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


  則當你的 192.168.0.2這個服務器因為某些因素離線時,你的NFS可以繼續(xù)在后臺中重復的呼叫!直到NFS服務器再度上線為止。這對于系統(tǒng)的持續(xù)操作還是有幫助的, rsize與wsize的大小則需要依據你的實際網路環(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
# 注意!上面的設定是同一行

4.3 自動掛載 autofs 的使用

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

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

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

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

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

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

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

            
         
  圖四、自動掛載的設定檔內容


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

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

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

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

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


  建立資料對應文件內的掛載資訊

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

[本地端目錄] [-掛載參數] [服務器所提供的目錄]

參數:

本地端目錄:指的就是在 /etc/auto.master 內指定的目錄之次目錄
-掛載參數 :就是前一小節(jié)提到的 rw,bg,soft 等等的參數;
服務器所提供的目錄 :例如 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

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


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

  實際運作與觀察

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

# /etc/init.d/autofs start


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

# mount; df
# 你不會看到任何跟192.168.0.2這個主機有關的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
# 文件的掛載也出現沒錯!

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

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

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

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


  服務器或客戶端某些服務未啟動:

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

# 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


  被防火墻阻擋

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

5、案例演練

  假設環(huán)境:

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

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

# 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)、再來,就是要建立每個對應的目錄的實際Linux權限:

  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
# 修改較為嚴格的文件權限將目錄與文件設定成只讀!不能寫入的狀態(tài),會更保險一點!


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

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


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

  a. 確認遠端服務器的可用目錄:
# /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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多