乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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)中進入/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īng)由socket pair的概念你會知道NFS應(yīng)該會使用一些port吧?那么NFS使用哪個 port來進行傳輸呢?答案是....不知道?因為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ù)是進行文件系統(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ù)并沒有進行身份登入的識別,所以說,當(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進入到該目錄后,會參照NFS client 1的使用者與群組名稱。 但是由于該目錄的文件主要來自NFS server,所以可能就會發(fā)現(xiàn)幾個情況:

        NFS server/NFS client剛好有相同的賬號與群組
        則此時使用者可以直接以dmtsai的身份進行服務(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ù)器端的資料哪有什么保護性?所以在預(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
        這個是維護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這個目錄進行存取。

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

        我要讓*.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來進行限制。

      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è)防火墻來保護自己的文件系統(tǒng),那么客戶端掛載該文件系統(tǒng)后,難道不需要保護自己? 所以下面我們要來談一談幾個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,所以我就得要在本地端主機先建立起這個掛載點目錄才行啊!然后就可以用mount這個命令直接掛載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ù)器需要保護之外,我們?nèi)∮萌思业腘FS文件系統(tǒng)也需要自我保護才行。 那要如何自我保護???可以透過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
        是否允許使用者進行文件的掛載與卸載功能。如果要保護文件系統(tǒng),最好不要提供使用者進行掛載與卸載。
        系統(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ù)器兩者之間進行呼叫,此時如果有一個主機失去連接,那么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ù)多次進行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守護進程來管理你的掛載點,它只在文件系統(tǒng)被訪問時才動態(tài)地掛載它們。 autofs查詢主配置文件 /etc/auto.master來決定要定義哪些掛載點。然后,它使用適用于各個掛載點的參數(shù)來啟動automount進程。主配置中的每一行都定義一個掛載點,然后用單獨的配置文件定義在該掛載點下要掛載的文件系統(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ù)器的目錄, 讓我們實際來看看,如果我要進入 /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)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多