鸟哥的Linux私房菜(服务器)- 第十三章、文件服务器之一:NFS 服务器
最近更新日期:2011/07/27
| NFS為 Network FileSystem 的簡稱,它的目的就是想讓不同的機器、不同的操作系統(tǒng)可以彼此分享個別的檔案啦!目前在 Unix Like 當中用來做為文件服務器是相當不錯的一個方案喔!基本上, Unix Like 主機連接到另一部 Unix Like 主機來分享彼此的檔案時,使用 NFS 要比 SAMBA 這個服務器快速且方便的多了!此外, NFS 的設定真的很簡單,幾乎只要記得啟動 Remote Procedure Call 這個咚咚 (RPC, 就是 rpcbind 這個軟件啦!) 就一定可以架設的起來!真是不錯啊! 如果是在 Linux PC cluster 的環(huán)境下,這個服務器被使用的機率更是高的多喔!所以得來玩一玩啊! |
13.1?NFS 的由來與其功能
13.1.1?什么是 NFS ( Network FileSystem )
13.1.2?什么是 RPC ( Remote Procedure Call )
13.1.3?NFS 啟動的 RPC daemons
13.1.4?NFS 的檔案訪問權限
13.2?NFS Server 端的設定
13.2.1?所需要的軟件
13.2.2?NFS 的軟件結構
13.2.3?/etc/exports 配置文件的語法與參數(shù)
13.2.4?啟動 NFS:?rpcinfo
13.2.5?NFS 的聯(lián)機觀察:?showmount,?/var/lib/nfs/etab,?exportfs
13.2.6?NFS 的安全性:?防火墻與埠口,?關機注意事項
13.3?NFS 客戶端的設定
13.3.1?手動掛載 NFS 服務器分享的資源
13.3.2?客戶端可處理的掛載參數(shù)與開機掛載:?特殊參數(shù)
13.3.3?無法掛載的原因分析
13.3.4?自動掛載 autofs 的使用
13.4?案例演練
13.5?重點回顧
13.6?本章習題
13.7?參考數(shù)據(jù)與延伸閱讀
13.8?針對本文的建議:http://phorum.vbird.org/viewtopic.php?p=114695
13.1 NFS 的由來與其功能
NFS 這個藉由網(wǎng)絡分享文件系統(tǒng)的服務在架設的時候是很簡單的,不過,它最大的問題在于『權限』方面的概念! 因為在客戶端與服務器端可能必須要具備相同的賬號才能夠存取某些目錄或檔案。 另外,NFS 的啟動需要透過所謂的遠程過程調用 (RPC),也就是說,我們并不是只要啟動 NFS 就好了, 還需要啟動 RPC 這個服務才行啊!
因此,在開始進行 NFS 的設定之前,我們得先來了解一下,什么是 NFS 呢?不然講了一堆也沒有用,對吧! ^_^! 底下就來談一談什么是 NFS ,且 NFS 的啟動還需要什么樣的協(xié)議啊!
13.1.1 什么是 NFS (Network FileSystem)
NFS 就是?Network?FileSystem 的縮寫,最早之前是由?Sun?這家公司所發(fā)展出來的 (注1)。 它最大的功能就是可以透過網(wǎng)絡,讓不同的機器、不同的操作系統(tǒng)、可以彼此分享個別的檔案 (share files)。所以,你也可以簡單的將他看做是一個文件服務器 (file server) 呢!這個 NFS 服務器可以讓你的 PC 來將網(wǎng)絡遠程的 NFS 服務器分享的目錄,掛載到本地端的機器當中, 在本地端的機器看起來,那個遠程主機的目錄就好像是自己的一個磁盤分區(qū)槽一樣 (partition)!使用上面相當?shù)谋憷?#xff01;
圖 13.1-1、NFS 服務器分享目錄與 Client 掛載示意圖
就如同上面的圖示一般,當我們的 NFS 服務器設定好了分享出來的 /home/sharefile 這個目錄后,其他的 NFS 客戶端就可以將這個目錄掛載到自己系統(tǒng)上面的某個掛載點 (掛載點可以自定義),例如前面圖示中的 NFS client 1 與 NFS client 2 掛載的目錄就不相同。我只要在 NFS client 1 系統(tǒng)中進入 /home/data/sharefile 內,就可以看到 NFS 服務器系統(tǒng)內的 /home/sharefile 目錄下的所有數(shù)據(jù)了 (當然,權限要足夠啊!^_^)!這個 /home/data/sharefile 就好像 NFS client 1 自己機器里面的一個 partition 喔!只要權限對了,那么你可以使用 cp, cd, mv, rm... 等等磁盤或檔案相關的指令!真是他 X 的方便吶!
好的,既然 NFS 是透過網(wǎng)絡來進行數(shù)據(jù)的傳輸,那么經(jīng)由第二章談到的 socket pair?的概念你會知道 NFS 應該會使用一些埠口吧?那么 NFS 使用哪個埠口來進行傳輸呢?基本上 NFS 這個服務的埠口開在 2049 ,但是由于文件系統(tǒng)非常復雜,因此 NFS 還有其他的程序去啟動額外的端口,但這些額外的端口啟動的號碼是? 答案是....不知道! @_@ !因為預設 NFS 用來傳輸?shù)牟嚎谑请S機選擇小于 1024 以下的埠口來使用的。咦!那客戶端怎么知道你服務器端使用那個埠口啊?此時就得要?遠程過程調用 (Remote Procedure Call, RPC)?的協(xié)定來輔助啦!底下我們就來談談什么是 RPC?
13.1.2 什么是 RPC (Remote Procedure Call)
因為 NFS 支持的功能相當?shù)亩?#xff0c;而不同的功能都會使用不同的程序來啟動, 每啟動一個功能就會啟用一些端口來傳輸數(shù)據(jù),因此, NFS 的功能所對應的端口才沒有固定住, 而是隨機取用一些未被使用的小于 1024 的埠口來作為傳輸之用。但如此一來又造成客戶端想要連上服務器時的困擾, 因為客戶端得要知道服務器端的相關埠口才能夠聯(lián)機吧!
此時我們就得需要遠程過程調用 (RPC) 的服務啦!RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,并且回報給客戶端,讓客戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當服務器在啟動 NFS 時會隨機取用數(shù)個埠口,并主動的向 RPC 注冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然后 RPC 又是固定使用 port 111 來監(jiān)聽客戶端的需求并回報客戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕松愉快了!
| Tips: 所以你要注意,要啟動 NFS 之前,RPC 就要先啟動了,否則 NFS 會無法向 RPC 注冊。 另外,RPC 若重新啟動時,原本注冊的數(shù)據(jù)會不見,因此 RPC 重新啟動后,它管理的所有服務都需要重新啟動來重新向 RPC 注冊。 |
圖 13.1-2、NFS 與 RPC 服務及文件系統(tǒng)操作的相關性
如上圖所示,當客戶端有 NFS 檔案存取需求時,他會如何向服務器端要求數(shù)據(jù)呢?
由于 NFS 的各項功能都必須要向 RPC 來注冊,如此一來 RPC 才能了解 NFS 這個服務的各項功能之 port number, PID, NFS 在服務器所監(jiān)聽的 IP 等等,而客戶端才能夠透過 RPC 的詢問找到正確對應的埠口。 也就是說,NFS 必須要有 RPC 存在時才能成功的提供服務,因此我們稱 NFS 為 RPC server 的一種。事實上,有很多這樣的服務器都是向 RPC 注冊的,舉例來說,NIS (Network Information Service) 也是 RPC server 的一種呢。此外,由圖 13.1-2 你也會知道,不論是客戶端還是服務器端,要使用 NFS 時,兩者都需要啟動 RPC 才行喔!
更多的 NFS 相關協(xié)議信息你可以參考底下網(wǎng)頁:
- RFC 1094, NFS 協(xié)議解釋?http://www.faqs.org/rfcs/rfc1094.html
- Linux NFS-HOWTO:http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
13.1.3 NFS 啟動的 RPC daemons
我們現(xiàn)在知道 NFS 服務器在啟動的時候就得要向 RPC 注冊,所以 NFS 服務器也被稱為 RPC server 之一。 那么 NFS 服務器主要的任務是進行文件系統(tǒng)的分享,文件系統(tǒng)的分享則與權限有關。 所以 NFS 服務器啟動時至少需要兩個 daemons ,一個管理客戶端是否能夠登入的問題, 一個管理客戶端能夠取得的權限。如果你還想要管理 quota 的話,那么 NFS 還得要再加載其他的 RPC 程序就是了。我們以較單純的 NFS 服務器來說:
- rpc.nfsd:
最主要的 NFS 服務器服務提供商。這個 daemon 主要的功能就是在管理客戶端是否能夠使用服務器文件系統(tǒng)掛載信息等, 其中還包含這個登入者的 ID 的判別喔!
- rpc.mountd
這個 daemon 主要的功能,則是在管理 NFS 的文件系統(tǒng)哩!當客戶端順利的通過 rpc.nfsd 而登入服務器之后,在他可以使用 NFS 服務器提供的檔案之前,還會經(jīng)過檔案權限 (就是那個 -rwxrwxrwx 與 owner, group 那幾個權限啦) 的認證程序!他會去讀 NFS 的配置文件?/etc/exports?來比對客戶端的權限,當通過這一關之后客戶端就可以取得使用 NFS 檔案的權限啦!(注:這個也是我們用來管理 NFS 分享之目錄的權限與安全設定的地方哩!)
- rpc.lockd (非必要)
這個玩意兒可以用在管理檔案的鎖定 (lock) 用途。為何檔案需要『鎖定』呢? 因為既然分享的 NFS 檔案可以讓客戶端使用,那么當多個客戶端同時嘗試寫入某個檔案時, 就可能對于該檔案造成一些問題啦!這個 rpc.lockd 則可以用來克服這個問題。 但 rpc.lockd 必須要同時在客戶端與服務器端都開啟才行喔!此外, rpc.lockd 也常與 rpc.statd 同時啟用。
- rpc.statd (非必要)
可以用來檢查檔案的一致性,與 rpc.lockd 有關!若發(fā)生因為客戶端同時使用同一檔案造成檔案可能有所損毀時, rpc.statd 可以用來檢測并嘗試回復該檔案。與 rpc.lockd 同樣的,這個功能必須要在服務器端與客戶端都啟動才會生效。
上述這幾個 RPC 所需要的程序,其實都已經(jīng)寫入到兩個基本的服務啟動腳本中了,那就是 nfs 以及 nfslock 啰! 亦即是在 /etc/init.d/nfs, /etc/init.d/nfslock,與服務器較有關的寫入在 nfs 服務中,而與客戶端的 rpc.lockd 之類的,就設定于 nfslock 服務中。
13.1.4 NFS 的檔案訪問權限
不知道你有沒有想過這個問題,在圖 13.1-1?的環(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)。這時有個有趣的問題就產(chǎn)生啦! 那就是如果客戶端與服務器端的使用者身份并不一致怎么辦??我們以底下這個圖示來說明一下好了:
圖 13.1-3、NFS 的服務器端與客戶端的使用者身份確認機制
當我以 dmtsai 這個一般身份使用者要去存取來自服務器端的檔案時,你要先注意到的是:?文件系統(tǒng)的 inode 所記錄的屬性為 UID, GID 而非賬號與群組名。 那一般 Linux 主機會主動的以自己的 /etc/passwd, /etc/group 來查詢對應的使用者、組名。 所以當 dmtsai 進入到該目錄后,會參照 NFS client 1 的使用者與組名。 但是由于該目錄的檔案主要來自 NFS server ,所以可能就會發(fā)現(xiàn)幾個情況:
- NFS server/NFS client 剛好有相同的賬號與群組
則此時使用者可以直接以 dmtsai 的身份進行服務器所提供的文件系統(tǒng)之存取。
- NFS server 的 501 這個 UID 賬號對應為 vbird
若 NFS 服務器上的 /etc/passwd 里面 UID 501 的使用者名稱為 vbird 時, 則客戶端的 dmtsai 可以存取服務器端的 vbird 這個使用者的檔案喔!只因為兩者具有相同的 UID 而已。這就造成很大的問題了!因為沒有人可以保證客戶端的 UID 所對應的賬號會與服務器端相同, 那服務器所提供的數(shù)據(jù)不就可能會被錯誤的使用者亂改?
- NFS server 并沒有 501 這個 UID
另一個極端的情況是,在服務器端并沒有 501 這個 UID 的存在,則此時 dmtsai 的身份在該目錄下會被壓縮成匿名者, 一般 NFS 的匿名者會以 UID 為 65534 為其使用者,早期的 Linux distributions 這個 65534 的賬號名稱通常是 nobody ,我們的 CentOS 則取名為 nfsnobody 。但有時也會有特殊的情況,例如在服務器端分享 /tmp 的情況下, dmtsain 的身份還是會保持 501 但建立的各項數(shù)據(jù)在服務器端來看,就會屬于無擁有者的資料。
- 如果使用者身份是 root 時
有個比較特殊的使用者,那就是每個 Linux 主機都有的 UID 為 0 的 root 。 想一想,如果客戶端可以用 root 的身份去存取服務器端的文件系統(tǒng)時,那服務器端的數(shù)據(jù)哪有什么保護性? 所以在預設的情況下, 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 (十四章)?這一個可以確認客戶端與服務器端身份一致的服務搭配使用,以避免身份的錯亂啊! ^_^
| Tips: 老實說,這個小節(jié)的數(shù)據(jù)比較難懂~尤其是剛剛接觸到 NFS server 的朋友。因此,你可以先略過 13.1.4 這個小節(jié)。 但是,在你讀完與做完本章后續(xù)所有的實作之后,記得回到這個小節(jié)來再查閱一次文章內容,相信會有進一步的認識的! |
13.2 NFS Server 端的設定
既然要使用 NFS 的話,就得要安裝 NFS 所需要的軟件了!底下讓我們查詢一下系統(tǒng)有無安裝所需要的軟件, NFS 軟件的架構以及如何設定 NFS 服務器吧! ^_^
13.2.1 所需要的軟件
以 CentOS 6.x 為例的話,要設定好 NFS 服務器我們必須要有兩個軟件才行,分別是:
- RPC 主程序:rpcbind
就如同剛剛提的到,我們的 NFS 其實可以被視為一個 RPC 服務,而要啟動任何一個 RPC 服務之前,我們都需要做好 port 的對應 (mapping) 的工作才行,這個工作其實就是『 rpcbind 』這個服務所負責的!也就是說,?在啟動任何一個 RPC 服務之前,我們都需要啟動 rpcbind 才行! (在 CentOS 5.x 以前這個軟件稱為 portmap,在 CentOS 6.x 之后才稱為 rpcbind 的!)
- NFS 主程序:nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 這兩個 NFS daemons 與其他相關 documents 與說明文件、執(zhí)行文件等的軟件!這個就是 NFS 服務所需要的主要軟件啦!一定要有喔!
好了,知道我們需要這兩個軟件之后,現(xiàn)在干嘛?趕快去你的系統(tǒng)先用 RPM 看一下有沒有這兩個軟件啦! 沒有的話趕快用 RPM 或 yum 去安裝喔!不然就玩不下去了!
| 例題: 請問我的主機是以 RPM 為套件管理的 Linux distribution ,例如 Red Hat, CentOS 與 SuSE 等版本,那么我要如何知道我的主機里面是否已經(jīng)安裝了 rpcbind 與 nfs 相關的軟件呢? 答: 簡單的使用『 rpm -qa | grep nfs 』與『 rpm -qa | grep rpcbind 』即可知道啦!如果沒有安裝的話, 在 CentOS 內可以使用『?yum?install nfs-utils 』來安裝! |
13.2.2 NFS 的軟件結構
NFS 這個咚咚真的是很簡單,上面我們提到的 NFS 軟件中,配置文件只有一個,執(zhí)行檔也不多, 記錄文件也三三兩兩而已吶!趕緊先來看一看吧! ^_^
- 主要配置文件:/etc/exports
這個檔案就是 NFS 的主要配置文件了!不過,系統(tǒng)并沒有默認值,所以這個檔案『?不一定會存在』,你可能必須要使用 vim 主動的建立起這個檔案喔!我們等一下要談的設定也僅只是這個檔案而已吶!
- NFS 文件系統(tǒng)維護指令:/usr/sbin/exportfs
這個是維護 NFS 分享資源的指令,我們可以利用這個指令重新分享 /etc/exports 變更的目錄資源、將 NFS Server 分享的目錄卸除或重新分享等等,這個指令是 NFS 系統(tǒng)里面相當重要的一個喔!至于指令的用法我們在底下會介紹。
- 分享資源的登錄檔:/var/lib/nfs/*tab
在 NFS 服務器的登錄文件都放置到 /var/lib/nfs/ 目錄里面,在該目錄下有兩個比較重要的登錄檔, 一個是 etab ,主要記錄了 NFS 所分享出來的目錄的完整權限設定值;另一個 xtab 則記錄曾經(jīng)鏈接到此 NFS 服務器的相關客戶端數(shù)據(jù)。
- 客戶端查詢服務器分享資源的指令:/usr/sbin/showmount
這是另一個重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 則主要用在 Client 端。這個 showmount 可以用來察看 NFS 分享出來的目錄資源喔!
就說不難吧!主要就是這幾個啰!
13.2.3 /etc/exports 配置文件的語法與參數(shù)
在開始 NFS 服務器的設定之前,你必須要了解的是,NFS 會直接使用到核心功能,所以你的核心必須要有支持 NFS 才行。萬一如果你的核心版本小于 2.2 版,或者重新自行編譯過核心的話,那么就得要很注意啦!因為你可能會忘記選擇 NFS 的核心支持啊!
還好,我們 CentOS 或者是其他版本的 Linux ,預設核心通常是支持 NFS 功能的,所以你只要確認你的核心版本是目前新的 2.6.x 版,并且使用你的 distribution 所提供的核心,那應該就不會有問題啦!
| Tips: 上面會提醒您這個問題的原因是,以前鳥哥都很喜歡自行編譯一個特別的核心,但是某次編譯核心時,卻忘記加上了 NFS 的核心功能,結果 NFS server 無論如何也搞不起來~最后才想到原來俺的核心是非正規(guī)的... |
至于 NFS 服務器的架設實在很簡單,你只要編輯好主要配置文件 /etc/exports 之后,先啟動 rpcbind (若已經(jīng)啟動了,就不要重新啟動),然后再啟動 nfs ,你的 NFS 就成功了!?不過這樣的設定能否對客戶端生效?那就得要考慮你權限方面的設定能力了。廢話少說,我們就直接來看看那個 /etc/exports 應該如何設定吧!某些 distributions 并不會主動提供 /etc/exports 檔案,所以請你自行手動建立它吧。
| [root@www ~]# vim /etc/exports /tmp 192.168.100.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync) [分享目錄] [第一部主機(權限)] [可用主機名] [可用通配符] |
你看看,這個配置文件有夠簡單吧!每一行最前面是要分享出來的目錄,注意喔!是以目錄為單位啊! 然后這個目錄可以依照不同的權限分享給不同的主機,像鳥哥上面的例子說明是: 要將 /tmp 分別分享給三個不同的主機或網(wǎng)域的意思。記得主機后面以小括號 () 設計權限參數(shù), 若權限參數(shù)不止一個時,則以逗號 (,) 分開。且主機名與小括號是連在一起的喔!在這個檔案內也可以利用 # 來批注呢。
至于主機名的設定主要有幾個方式:
- 可以使用完整的 IP 或者是網(wǎng)域,例如 192.168.100.10 或 192.168.100.0/24 ,或 192.168.100.0/255.255.255.0 都可以接受!
- 也可以使用主機名,但這個主機名必須要在 /etc/hosts 內,或可使用 DNS 找到該名稱才行啊!反正重點是可找到 IP 就是了。如果是主機名的話,那么他可以支持通配符,例如 * 或 ? 均可接受。
至于權限方面 (就是小括號內的參數(shù)) 常見的參數(shù)則有:
| 參數(shù)值 | 內容說明 |
| rw ro | 該目錄分享的權限是可擦寫 (read-write) 或只讀 (read-only),但最終能不能讀寫,還是與文件系統(tǒng)的 rwx 及身份有關。 |
| sync async | sync 代表數(shù)據(jù)會同步寫入到內存與硬盤中,async 則代表數(shù)據(jù)會先暫存于內存當中,而非直接寫入硬盤! |
| no_root_squash root_squash | 客戶端使用 NFS 文件系統(tǒng)的賬號若為 root 時,系統(tǒng)該如何判斷這個賬號的身份?預設的情況下,客戶端 root 的身份會由 root_squash 的設定壓縮成 nfsnobody, 如此對服務器的系統(tǒng)會較有保障。但如果你想要開放客戶端使用 root 身份來操作服務器的文件系統(tǒng),那么這里就得要開 no_root_squash 才行! |
| all_squash | 不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名用戶,通常也就是 nobody(nfsnobody) 啦! |
| anonuid anongid | anon 意指 anonymous (匿名者) 前面關于 *_squash 提到的匿名用戶的 UID 設定值,通常為 nobody(nfsnobody),但是你可以自行設定這個 UID 的值!當然,這個 UID 必需要存在于你的 /etc/passwd 當中! anonuid 指的是 UID 而 anongid 則是群組的 GID 啰。 |
這是幾個比較常見的權限參數(shù),如果你有興趣玩其他的參數(shù)時,請自行 man exports 可以發(fā)現(xiàn)很多有趣的數(shù)據(jù)。 接下來我們利用上述的幾個參數(shù)來實際思考一下幾個有趣的小習題:
例題一:讓 root 保有 root 的權限 我想將 /tmp 分享出去給大家使用,由于這個目錄本來就是大家都可以讀寫的,因此想讓所有的人都可以存取。此外,我要讓 root 寫入的檔案還是具有 root 的權限,那如何設計配置文件? 答:
|
例題二:同一目錄針對不同范圍開放不同權限 我要將一個公共的目錄 /home/public 公開出去,但是只有限定我的局域網(wǎng)絡 192.168.100.0/24 這個網(wǎng)域且加入 vbirdgroup (第一章的例題建立的群組) 的用戶才能夠讀寫,其他來源則只能讀取。 答:
需要注意的是,通配符僅能用在主機名的分辨上面,IP 或網(wǎng)段就只能用 192.168.100.0/24 的狀況, 不可以使用 192.168.100.* 喔! |
例題三:僅給某個單一主機使用的目錄設定 我要將一個私人的目錄 /home/test 開放給 192.168.100.10 這個 Client 端的機器來使用時,該如何設定? 假設使用者的身份是 dmtsai 才具有完整的權限時。 答:
|
例題四:開放匿名登錄的情況 我要讓 *.centos.vbird 網(wǎng)域的主機,登入我的 NFS 主機時,可以存取 /home/linux ,但是他們存數(shù)據(jù)的時候,我希望他們的 UID 與 GID 都變成 45 這個身份的使用者,假設我 NFS 服務器上的 UID 45 與 GID 45 的用戶/組名為 nfsanon。 答:
|
上面四個案例的權限如果依照13.1.4 存取設定權限來思考的話, 那么權限會是什么情況呢?讓我們來檢查一下:
-
客戶端與服務器端具有相同的 UID 與賬號:
假設我在 192.168.100.10 登入這部 NFS (IP 假設為 192.168.100.254) 服務器,并且我在 192.168.100.10 的賬號為 dmtsai 這個身份,同時,在這部 NFS 上面也有 dmtsai 這個賬號, 并具有相同的 UID ,果真如此的話,那么:
-
客戶端與服務器端的賬號并未相同時:
假如我在 192.168.100.10 的身份為 vbird (uid 為 600),但是 192.168.100.254 這部 NFS 主機卻沒有 uid=600 的賬號時,情況會變成怎樣呢?
-
當客戶端的身份為 root 時:
假如我在 192.168.100.10 的身份為 root 呢? root 這個賬號每個系統(tǒng)都會有呀!權限變成怎樣呢?
這樣的權限講解之后,你可以了解了嗎?這里是最重要的地方,如果這一關通過了,底下的咚咚就沒有問題啦! ^_^! 在你將本文讀完后,最好還是回到13.1.4 NFS 的檔案訪問權限好好的瞧一瞧, 才能解決 NFS 的問題喔!
13.2.4 啟動 NFS
配置文件搞定后,當然要開始來啟動才行啊!而前面我們也提到過,NFS 的啟動還需要 rpcbind 的協(xié)助才行啊! 所以趕緊來啟動吧!
| [root@www ~]# /etc/init.d/rpcbind start # 如果 rpcbind 本來就已經(jīng)在執(zhí)行了,那就不需要啟動啊![root@www ~]# /etc/init.d/nfs start # 有時候某些 distributions 可能會出現(xiàn)如下的警告訊息: exportfs: /etc/exports [3]: No 'sync' or 'async' option specified for export "192.168.100.10:/home/test".Assuming default behaviour ('sync'). # 上面的警告訊息僅是在告知因為我們沒有指定 sync 或 async 的參數(shù), # 則 NFS 將默認會使用 sync 的信息而已。你可以不理他,也可以加入 /etc/exports。[root@www ~]# /etc/init.d/nfslock start [root@www ~]# chkconfig rpcbind on [root@www ~]# chkconfig nfs on [root@www ~]# chkconfig nfslock on |
那個 rpcbind 根本就不需要設定!只要直接啟動它就可以啦!啟動之后,會出現(xiàn)一個 port 111 的 sunrpc 的服務,那就是 rpcbind 啦!至于 nfs 則會啟動至少兩個以上的 daemon 出現(xiàn)!然后就開始在監(jiān)聽 Client 端的需求啦!你必須要很注意屏幕上面的輸出信息, 因為如果配置文件寫錯的話,屏幕上會顯示出錯誤的地方喔!
此外,如果你想要增加一些 NFS 服務器的數(shù)據(jù)一致性功能時,可能需要用到 rpc.lockd 及 rpc.statd 等 RPC 服務, 那么或許你可以增加一個服務,那就是 nfslock 啰!啟動之后,請趕快到 /var/log/messages 里面看看有沒有被正確的啟動呢?
| [root@www ~]# tail /var/log/messages Jul 27 17:10:39 www kernel: Installing knfsd (copyright (C) 1996 okir@monad.swb.de). Jul 27 17:10:54 www kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory Jul 27 17:10:54 www kernel: NFSD: starting 90-second grace period Jul 27 17:11:32 www rpc.statd[3689]: Version 1.2.2 starting |
在確認啟動沒有問題之后,接下來我們來瞧一瞧那么 NFS 到底開了哪些埠口?
| [root@www ~]# netstat -tulnp| grep -E '(rpc|nfs)' Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:875 0.0.0.0:* LISTEN 3631/rpc.rquotad tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3601/rpcbind tcp 0 0 0.0.0.0:48470 0.0.0.0:* LISTEN 3647/rpc.mountd tcp 0 0 0.0.0.0:59967 0.0.0.0:* LISTEN 3689/rpc.statd tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - udp 0 0 0.0.0.0:875 0.0.0.0:* 3631/rpc.rquotad udp 0 0 0.0.0.0:111 0.0.0.0:* 3601/rpcbind udp 0 0 0.0.0.0:897 0.0.0.0:* 3689/rpc.statd udp 0 0 0.0.0.0:46611 0.0.0.0:* 3647/rpc.mountd udp 0 0 0.0.0.0:808 0.0.0.0:* 3601/rpcbind udp 0 0 0.0.0.0:46011 0.0.0.0:* 3689/rpc.statd |
注意看到上面喔!總共產(chǎn)生了好多的 port 喔!真是可怕!不過主要的埠口是:
- rpcbind 啟動的 port 在 111 ,同時啟動在 UDP 與 TCP;
- nfs 本身的服務啟動在 port 2049 上頭!
- 其他 rpc.* 服務啟動的 port 則是隨機產(chǎn)生的,因此需向 port 111 注冊。
好了,那我怎么知道每個 RPC 服務的注冊狀況?沒關系,你可以使用 rpcinfo 來觀察的。
| [root@www ~]# rpcinfo -p [IP|hostname] [root@www ~]# rpcinfo -t|-u IP|hostname 程序名稱 選項與參數(shù): -p :針對某 IP (未寫則預設為本機) 顯示出所有的 port 與 porgram 的信息; -t :針對某主機的某支程序檢查其 TCP 封包所在的軟件版本; -u :針對某主機的某支程序檢查其 UDP 封包所在的軟件版本;# 1. 顯示出目前這部主機的 RPC 狀態(tài) [root@www ~]# rpcinfo -p localhostprogram vers proto port service100000 4 tcp 111 portmapper100000 3 tcp 111 portmapper100000 2 tcp 111 portmapper100000 4 udp 111 portmapper100000 3 udp 111 portmapper100000 2 udp 111 portmapper100011 1 udp 875 rquotad100011 2 udp 875 rquotad100011 1 tcp 875 rquotad100011 2 tcp 875 rquotad100003 2 tcp 2049 nfs ....(底下省略).... # 程序代號 NFS版本 封包類型 埠口 服務名稱# 2. 針對 nfs 這個程序檢查其相關的軟件版本信息 (僅察看 TCP 封包) [root@www ~]# rpcinfo -t localhost nfs program 100003 version 2 ready and waiting program 100003 version 3 ready and waiting program 100003 version 4 ready and waiting # 可發(fā)現(xiàn)提供 nfs 的版本共有三種,分別是 2, 3, 4 版呦! |
仔細瞧瞧,上面出現(xiàn)的信息當中除了程序名稱與埠口的對應可以與 netstat -tlunp 輸出的結果作比對之外,還需要注意到 NFS 的版本支持!新的 NFS 版本傳輸速度較快,由上表看起來,我們的 NFS 至少支持到第 4 版,應該還算合理啦! ^_^!?如果你的 rpcinfo 無法輸出,那就表示注冊的數(shù)據(jù)有問題啦!可能需要重新啟動 rpcbind 與 nfs 喔!
13.2.5 NFS 的聯(lián)機觀察
在你的 NFS 服務器設定妥當之后,我們可以在 server 端先自我測試一下是否可以聯(lián)機喔!就是利用 showmount 這個指令來查閱!
| [root@www ~]# showmount [-ae] [hostname|IP] 選項與參數(shù): -a :顯示目前主機與客戶端的 NFS 聯(lián)機分享的狀態(tài); -e :顯示某部主機的 /etc/exports 所分享的目錄數(shù)據(jù)。# 1. 請顯示出剛剛我們所設定好的相關 exports 分享目錄信息 [root@www ~]# showmount -e localhost Export list for localhost: /tmp * /home/linux *.centos.vbird /home/test 192.168.100.10 /home/public (everyone) |
很簡單吧!所以,當你要掃瞄某一部主機他提供的 NFS 分享的目錄時,就使用 showmount -e IP (或hostname) 即可!非常的方便吧!這也是 NFS client 端最常用的指令喔!?另外, NFS 關于目錄權限設定的數(shù)據(jù)非常之多!在 /etc/exports 只是比較特別的權限參數(shù)而已,還有很多預設參數(shù)呢! 這些預設參數(shù)在哪?我們可以檢查一下 /var/lib/nfs/etab 就知道了!
| [root@www ~]# tail /var/lib/nfs/etab /home/public 192.168.100.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash, no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534) # 上面是同一行,可以看出除了 rw, sync, root_squash 等等, # 其實還有 anonuid 及 anongid 等等的設定! |
上面僅僅是一個小范例,透過分析 anonuid=65534 對比 /etc/passwd 后,會發(fā)現(xiàn) CentOS 出現(xiàn)的是 nfsnobody 啦!這個賬號在不同的版本都可能會不一樣的!另外,如果有其他客戶端掛載了你的 NFS 文件系統(tǒng)時,那么該客戶端與文件系統(tǒng)信息就會被記錄到 /var/lib/nfs/xtab 里頭去的!
另外,如果你想要重新處理 /etc/exports 檔案,當重新設定完 /etc/exports 后需不需要重新啟動 nfs ? 不需要啦!如果重新啟動 nfs 的話,要得再向 RPC 注冊!很麻煩~這個時候我們可以透過 exportfs 這個指令來幫忙喔!
| [root@www ~]# exportfs [-aruv] 選項與參數(shù): -a :全部掛載(或卸除) /etc/exports 檔案內的設定 -r :重新掛載 /etc/exports 里面的設定,此外,亦同步更新 /etc/exports及 /var/lib/nfs/xtab 的內容! -u :卸除某一目錄 -v :在 export 的時候,將分享的目錄顯示到屏幕上!# 1. 重新掛載一次 /etc/exports 的設定 [root@www ~]# exportfs -arv exporting 192.168.100.10:/home/test exporting 192.168.100.0/24:/home/public exporting *.centos.vbird:/home/linux exporting *:/home/public exporting *:/tmp# 2. 將已經(jīng)分享的 NFS 目錄資源,通通都卸除 [root@www ~]# exportfs -auv # 這時如果你再使用 showmount -e localhost 就會看不到任何資源了! |
要熟悉一下這個指令的用法喔!這樣一來,就可以直接重新 exportfs 我們的記錄在 /etc/exports 的目錄數(shù)據(jù)啰!但是要特別留意,如果你僅有處理配置文件,但并沒有相對應的目錄 (/home/public 等目錄) 可以提供使用啊! 那可能會出現(xiàn)一些警告訊息喔!所以記得要建立分享的目錄才對!
13.2.6 NFS 的安全性
在 NFS 的安全性上面,有些地方是你必須要知道的喔!底下我們分別來談一談:
-
防火墻的設定問題與解決方案:
一般來說, NFS 的服務僅會對內部網(wǎng)域開放,不會對因特網(wǎng)開放的。然而,如果你有特殊需求的話, 那么也可能會跨不同網(wǎng)域就是了。但是,NFS 的防火墻特別難搞,為什么呢?因為除了固定的 port 111, 2049 之外, 還有很多不固定的埠口是由 rpc.mountd, rpc.rquotad 等服務所開啟的,所以,你的 iptables 就很難設定規(guī)則! 那怎辦?難道整個防火墻機制都要取消才可以?
為了解決這個問題, CentOS 6.x 有提供一個固定特定 NFS 服務的埠口配置文件,那就是 /etc/sysconfig/nfs 啦! 你在這個檔案里面就能夠指定特定的埠口,這樣每次啟動 nfs 時,相關服務啟動的埠口就會固定,如此一來, 我們就能夠設定正確的防火墻啰!這個配置文件內容很多,絕大部分的數(shù)據(jù)你都不要去更改,只要改跟 PORT 這個關鍵詞有關的數(shù)據(jù)即可。 那么需要更改的 rpc 服務有哪些呢?主要有 mountd, rquotad, nlockmgr 這三個,所以你應該要這樣改:
| [root@www ~]# vim /etc/sysconfig/nfs RQUOTAD_PORT=1001 <==約在 13 行左右 LOCKD_TCPPORT=30001 <==約在 21 行左右 LOCKD_UDPPORT=30001 <==約在 23 行左右 MOUNTD_PORT=1002 <==約在 41 行左右 # 記得設定值最左邊的批注服務要拿掉之外,埠口的值你也可以自行決定。[root@www ~]# /etc/init.d/nfs restart [root@www ~]# rpcinfo -p | grep -E '(rquota|mount|nlock)'100011 2 udp 1001 rquotad100011 2 tcp 1001 rquotad100021 4 udp 30001 nlockmgr100021 4 tcp 30001 nlockmgr100005 3 udp 1002 mountd100005 3 tcp 1002 mountd # 上述的輸出數(shù)據(jù)已經(jīng)被鳥哥匯整過了,沒用到的埠口先挪掉了啦! |
很可怕吧!如果想要開放 NFS 給別的網(wǎng)域的朋友使用,又不想要讓對方擁有其他服務的登入功能, 那你的防火墻就得要開放上述的十個埠口啦!有夠麻煩的~假設你想要開放 120.114.140.0/24 這個網(wǎng)域的人能夠使用你這部服務器的 NFS 的資源,且假設你已經(jīng)使用第九章提供的防火墻腳本, 那么你還得要這樣做才能夠針對該網(wǎng)域放行喔:
| [root@www ~]# vim /usr/local/virus/iptables/iptables.allow iptables -A INPUT -i $EXTIF -p tcp -s 120.114.140.0/24 -m multiport \--dport 111,2049,1001,1002,30001 -j ACCEPT iptables -A INPUT -i $EXTIF -p udp -s 120.114.140.0/24 -m multiport \--dport 111,2049,1001,1002,30001 -j ACCEPT[root@www ~]# /usr/local/virus/iptables/iptables.rule # 總是要重新執(zhí)行這樣防火墻規(guī)則才會順利的生效啊!別忘記!別忘記! |
-
使用 /etc/exports 設定更安全的權限:
這就牽涉到你的邏輯思考了!怎么設定都沒有關系,但是在『便利』與『安全』之間,要找到你的平衡點吶!善用root_squash 及 all_squash 等功能,再利用 anonuid?等等的設定來規(guī)范登入你主機的用戶身份!應該還是有辦法提供一個較為安全的 NFS 服務器的!
另外,當然啦,你的 NFS 服務器的文件系統(tǒng)之權限設定也需要很留意! 不要隨便設定成為 -rwxrwxrwx ,這樣會造成你的系統(tǒng)『很大的困擾』的啊!
-
更安全的 partition 規(guī)劃:
如果你的工作環(huán)境中,具有多部的 Linux 主機,并且預計彼此分享出目錄時,那么在安裝 Linux 的時候,最好就可以規(guī)劃出一塊 partition 作為預留之用。因為『?NFS 可以針對目錄來分享』,因此,你可以將預留的 partition 掛載在任何一個掛載點,再將該掛載點 (就是目錄啦!)由 /etc/exports 的設定中分享出去,那么整個工作環(huán)境中的其他 Linux 主機就可以使用該 NFS 服務器的那塊預留的 partition 了!所以,在主機的規(guī)劃上面,主要需要留意的只有 partition 而已。此外,由于分享的 partition 可能較容易被入侵,最好可以針對該 partition 設定比較嚴格的參數(shù)在 /etc/fstab 當中喔!
此外,如果你的分割做的不夠好,舉例來說,很多人都喜歡使用懶人分割法,亦即整個系統(tǒng)中只有一個根目錄的 partition 而已。這樣做會有什么問題呢?假設你分享的是 /home 這個給一般用戶的目錄好了,有些用戶覺得這個 NFS 的磁盤太好用了, 結果使用者就將他的一大堆暫存數(shù)據(jù)通通塞進這個 NFS 磁盤中。想一想,如果整個根目錄就因為這個 /home 被塞爆了, 那么你的系統(tǒng)將會造成無法讀寫的困擾。因此,一個良好的分割規(guī)劃,或者是利用磁盤配額來限制還是很重要的工作。
-
NFS 服務器關機前的注意事項:
需要注意的是,由于 NFS 使用的這個 RPC 服務,當客戶端連上服務器時,那么你的服務器想要關機, 那可就會成為『不可能的任務』!如果你的服務器上面還有客戶端在聯(lián)機,那么你要關機, 可能得要等到數(shù)個鐘頭才能夠正常的關機成功!嗄!真的假的!不相信嗎?不然你自個兒試試看!^_^!
所以啰,建議你的 NFS Server 想要關機之前,能先『關掉 rpcbind 與 nfs 』這兩個東西! 如果無法正確的將這兩個 daemons 關掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 將他關掉先!這樣才有辦法正常的關機成功喔!這個請?zhí)貏e特別的注意呢!
當然啦,你也可以利用?showmount?-a localhost 來查出來那個客戶端還在聯(lián)機? 或者是查閱 /var/lib/nfs/rmtab 或 xtab 等檔案來檢查亦可。找到這些客戶端后, 可以直接 call 他們啊!讓他們能夠幫幫忙先! ^_^
事實上,客戶端以 NFS 聯(lián)機到服務器端時,如果他們可以下達一些比較不那么『硬』的掛載參數(shù)時, 就能夠減少這方面的問題喔!相關的安全性可以參考下一小節(jié)的?客戶端可處理的掛載參數(shù)與開機掛載。
13.3 NFS 客戶端的設定
既然 NFS 服務器最主要的工作就是分享文件系統(tǒng)給網(wǎng)絡上其他的客戶端,所以客戶端當然得要掛載這個玩意兒啰! 此外,服務器端可以加設防火墻來保護自己的文件系統(tǒng),那么客戶端掛載該文件系統(tǒng)后,難道不需要保護自己? 呵呵!所以底下我們要來談一談幾個 NFS 客戶端的課題。
13.3.1 手動掛載 NFS 服務器分享的資源
你要如何掛載 NFS 服務器所提供的文件系統(tǒng)呢?基本上,可以這樣做:
好,現(xiàn)在假設客戶端在 192.168.100.10 這部機器上,而服務器是 192.168.100.254 , 那么趕緊來檢查一下我們是否已經(jīng)有 rpcbind 的啟動,另外遠程主機有什么可用的目錄呢!
| # 1. 啟動必備的服務:若沒有啟動才啟動,有啟動則保持原樣不動。 [root@clientlinux ~]# /etc/init.d/rpcbind start [root@clientlinux ~]# /etc/init.d/nfslock start # 一般來說,系統(tǒng)默認會啟動 rpcbind ,不過鳥哥之前關閉過,所以要啟動。 # 另外,如果服務器端有啟動 nfslock 的話,客戶端也要啟動才能生效!# 2. 查詢服務器提供哪些資源給我們使用呢? [root@clientlinux ~]# showmount -e 192.168.100.254 Export list for 192.168.100.254: /tmp * /home/linux *.centos.vbird /home/test 192.168.100.10 /home/public (everyone) <==這是等一下我們要掛載的目錄 |
接下來我想要將遠程主機的 /home/public 掛載到本地端主機的 /home/nfs/public , 所以我就得要在本地端主機先建立起這個掛載點目錄才行啊!然后就可以用 mount 這個指令直接掛載 NFS 的文件系統(tǒng)啰!
| # 3. 建立掛載點,并且實際掛載看看啰! [root@clientlinux ~]# mkdir -p /home/nfs/public [root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/public \ > /home/nfs/public # 注意一下掛載的語法!『 -t nfs 』指定文件系統(tǒng)類型, # IP:/dir 則是指定某一部主機的某個提供的目錄!另外,如果出現(xiàn)如下錯誤: mount: 192.168.100.254:/home/public failed, reason given by server: No such file or directory # 這代表你在 Server 上面并沒有建立 /home/public 啦!自己在服務器端建立他吧!# 4. 總是得要看看掛載之后的情況如何,可以使用 df 或 mount 啦! [root@clientlinux ~]# df 文件系統(tǒng) 1K-區(qū)段 已用 可用 已用% 掛載點 ....(中間省略).... 192.168.100.254:/home/public7104640 143104 6607104 3% /home/nfs/public |
先注意一下掛載 NFS 檔案的格式范例喔!呵呵!這樣就可以將數(shù)據(jù)掛載進來啦!請注意喔! 以后,只要你進入你的目錄 /home/nfs/public 就等于到了 192.168.100.254 那部遠程主機的 /home/public 那個目錄中啰!很不錯吧!至于你在該目錄下有什么權限? 那就請你回去前一小節(jié)查一查權限的思考吧! ^_^ !那么如何將掛載的 NFS 目錄卸除呢?就使用 umount 啊!
| [root@clientlinux ~]# umount /home/nfs/public |
13.3.2 客戶端可處理的掛載參數(shù)與開機掛載
瞧!客戶端的掛載工作很簡單吧!不過不曉得你有沒有想過,如果你剛剛掛載到本機 /home/nfs/public 的文件系統(tǒng)當中,含有一支 script ,且這支 script 的內容為『 rm -rf / 』且該檔案權限為 555 , 夭壽~如果你因為好奇給他執(zhí)行下去,可有的你受的了~因為整個系統(tǒng)都會被殺光光!真可憐!
所以說,除了 NFS 服務器需要保護之外,我們取用人家的 NFS 文件系統(tǒng)也需要自我保護才行啊! 那要如何自我保護啊?可以透過 mount 的指令參數(shù)喔!包括底下這些主要的參數(shù)可以嘗試加入:
| 參數(shù) | 參數(shù)代表意義 | 系統(tǒng)默認值 |
| suid nosuid | 曉得啥是 SUID 吧?如果掛載的 partition 上面有任何 SUID 的 binary 程序時, 你只要使用 nosuid 就能夠取消 SUID 的功能了!嗄?不知道什么是 SUID ?那就不要學人家架站嘛!@_@! 趕緊回去基礎學習篇第三版復習一下第十七章、程序與資源管理啦! | suid |
| rw ro | 你可以指定該文件系統(tǒng)是只讀 (ro) 或可擦寫喔!服務器可以提供給你可擦寫, 但是客戶端可以僅允許只讀的參數(shù)設定值! | rw |
| dev nodev | 是否可以保留裝置檔案的特殊功能?一般來說只有 /dev 這個目錄才會有特殊的裝置,因此你可以選擇 nodev 喔! | dev |
| exec noexec | 是否具有執(zhí)行 binary file 的權限? 如果你想要掛載的僅是數(shù)據(jù)區(qū) (例如 /home),那么可以選擇 noexec 啊! | exec |
| user nouser | 是否允許使用者進行檔案的掛載與卸除功能? 如果要保護文件系統(tǒng),最好不要提供使用者進行掛載與卸除吧! | nouser |
| auto noauto | 這個 auto 指的是『mount -a』時,會不會被掛載的項目。 如果你不需要這個 partition 隨時被掛載,可以設定為 noauto。 | auto |
一般來說,如果你的 NFS 服務器所提供的只是類似 /home 底下的個人資料, 應該不需要可執(zhí)行、SUID 與裝置檔案,因此當你在掛載的時候,可以這樣下達指令喔:
| [root@clientlinux ~]# umount /home/nfs/public [root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \ > 192.168.100.254:/home/public /home/nfs/public[root@clientlinux ~]# mount | grep addr 192.168.100.254:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid, nodev,vers=4,addr=192.168.100.254,clientaddr=192.168.100.10) |
這樣一來你所掛載的這個文件系統(tǒng)就只能作為資料存取之用,相對來說,對于客戶端是比較安全一些的。 所以說,這個nosuid, noexec, nodev?等等的參數(shù)可得記得啊!
-
關于 NFS 特殊的掛載參數(shù)
除了上述的 mount 參數(shù)之外,其實針對 NFS 服務器,咱們的 Linux 還提供不少有用的額外參數(shù)喔!這些特殊參數(shù)還非常有用呢! 為什么呢?舉例來說,由于文件系統(tǒng)對 Linux 是非常重要的東西,因為我們進行任何動作時,只要有用到文件系統(tǒng), 那么整個目錄樹系統(tǒng)就會主動的去查詢全部的掛載點。如果你的 NFS 服務器與客戶端之間的聯(lián)機因為網(wǎng)絡問題, 或者是服務器端先關機了,卻沒有通知客戶端,那么客戶端只要動到文件系統(tǒng)的指令 (例如 df, ls, cp 等等) ,整個系統(tǒng)就會慢到爆!因為你必須要等到文件系統(tǒng)搜尋等待逾時后,系統(tǒng)才會饒了你!(鳥哥等過 df 指令 30 分鐘過...)
為了避免這些困擾,我們還有一些額外的 NFS 掛載參數(shù)可用!例如:
| 參數(shù) | 參數(shù)功能 | 預設參數(shù) |
| fg bg | 當執(zhí)行掛載時,該掛載的行為會在前景 (fg) 還是在背景 (bg) 執(zhí)行? 若在前景執(zhí)行時,則 mount 會持續(xù)嘗試掛載,直到成功或 time out 為止,若為背景執(zhí)行, 則 mount 會在背景持續(xù)多次進行 mount ,而不會影響到前景的程序操作。 如果你的網(wǎng)絡聯(lián)機有點不穩(wěn)定,或是服務器常常需要開關機,那建議使用 bg 比較妥當。 | fg |
| soft hard | 如果是 hard 的情況,則當兩者之間有任何一部主機脫機,則 RPC 會持續(xù)的呼叫,直到對方恢復聯(lián)機為止。如果是 soft 的話,那 RPC 會在 time out 后『重復』呼叫,而非『持續(xù)』呼叫, 因此系統(tǒng)的延遲會比較不這么明顯。同上,如果你的服務器可能開開關關,建議用 soft 喔! | hard |
| intr | 當你使用上頭提到的 hard 方式掛載時,若加上 intr 這個參數(shù), 則當 RPC 持續(xù)呼叫中,該次的呼叫是可以被中斷的 (interrupted)。 | 沒有 |
| rsize wsize | 讀出(rsize)與寫入(wsize)的區(qū)塊大小 (block size)。 這個設定值可以影響客戶端與服務器端傳輸數(shù)據(jù)的緩沖記憶容量。一般來說, 如果在局域網(wǎng)絡內 (LAN) ,并且客戶端與服務器端都具有足夠的內存,那這個值可以設定大一點, 比如說 32768 (bytes) 等,提升緩沖記憶區(qū)塊將可提升 NFS 文件系統(tǒng)的傳輸能力! 但要注意設定的值也不要太大,最好是達到網(wǎng)絡能夠傳輸?shù)淖畲笾禐橄蕖?/td> | rsize=1024 wsize=1024 |
更多的參數(shù)可以參考 man nfs 的輸出數(shù)據(jù)喔! 通常如果你的 NFS 是用在高速運作的環(huán)境當中的話,那么可以建議加上這些參數(shù)的說:
| [root@clientlinux ~]# umount /home/nfs/public [root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \ > -o bg,soft,rsize=32768,wsize=32768 \ > 192.168.100.254:/home/public /home/nfs/public |
則當你的 192.168.100.254 這部服務器因為某些因素而脫機時,你的 NFS 可以繼續(xù)在背景當中重復的呼叫! 直到 NFS 服務器再度上線為止。這對于系統(tǒng)的持續(xù)操作還是有幫助的啦! 當然啦,那個 rsize 與 wsize 的大小則需要依據(jù)你的實際網(wǎng)絡環(huán)境而定喔!
| Tips: 在鳥哥的實際案例中,某些大型的模式運算并不允許 soft 這個參數(shù)喔!舉例來說,鳥哥慣用的 CMAQ 空氣質量模式, 這個模式的叢集架構分享文件系統(tǒng)中,就不允許使用 soft 參數(shù)!這點需要特別留意喔! |
-
將 NFS 開機即掛載
我們知道開機就掛載的掛載點與相關參數(shù)是寫入 /etc/fstab 中的,那 NFS 能不能寫入 /etc/fstab 當中呢?非常可惜的是, 不可以呢!為啥呢?分析一下開機的流程,我們可以發(fā)現(xiàn)網(wǎng)絡的啟動是在本機掛載之后,因此當你利用 /etc/fstab 嘗試掛載 NFS 時,系統(tǒng)由于尚未啟動網(wǎng)絡,所以肯定是無法掛載成功的啦!那怎辦?簡單!就寫入 /etc/rc.d/rc.local 即可!
| [root@clientlinux ~]# vim /etc/rc.d/rc.local mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \ 192.168.100.254:/home/public /home/nfs/public |
13.3.3 無法掛載的原因分析
如果客戶端就是無法掛載服務器端所分享的目錄時,到底是發(fā)生什么問題?你可以這樣分析看看:
-
客戶端的主機名或 IP 網(wǎng)段不被允許使用:
以上面的例子來說明,我的 /home/test 只能提供 192.168.100.0/24 這個網(wǎng)域,所以如果我在 192.168.100.254 這部服務器中,以 localhost (127.0.0.1) 來掛載時,就會無法掛載上,這個權限概念沒問題吧!不然你可以在服務器上試試看:
| [root@www ~]# mount -t nfs localhost:/home/test /mnt mount.nfs: access denied by server while mounting localhost:/home/test |
看到 access denied 了吧?沒錯啦~權限不符啦!如果確定你的 IP 沒有錯誤,那么請通知服務器端,請管理員將你的 IP 加入 /etc/exports 這個檔案中。
-
服務器或客戶端某些服務未啟動:
這個最容易被忘記了!就是忘記了啟動 rpcbind 這個服務啦!如果你在客戶端發(fā)現(xiàn) mount 的訊息是這樣:
| [root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/test /mnt mount: mount to NFS server '192.168.100.254' failed: System Error: Connection refused. # 如果你使用 ping 卻發(fā)現(xiàn)網(wǎng)絡與服務器都是好的,那么這個問題就是 rpcbind 沒有開啦![root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/test /home/nfs mount: mount to NFS server '192.168.100.254' failed: RPC Error: Program not registered. # 注意看最后面的數(shù)據(jù),確實有連上 RPC ,但是服務器的 RPC 告知我們,該程序無注冊 |
要嘛就是 rpcbind 忘記開 (第一個錯誤),要嘛就是服務器端的 nfs 忘記開。最麻煩的是, 重新啟動了 rpcbind 但是卻忘記重新啟動其他服務 (上述第二個錯誤)!解決的方法就是去重新啟動 rpcbind 管理的其他所有服務就是了!
-
被防火墻檔掉了:
由于 NFS 幾乎不對外開放,而內部網(wǎng)域又通常是全部的資源都放行,因此過去玩 NFS 的朋友 (包括鳥哥本人啦!) 都沒有注意過 NFS 的防火墻問題。最近這幾年鳥哥在管理計算機教室時,有掌管一部計算機教室主控防火墻, 為了擔心太厲害的學生給鳥哥亂搞,因此該 Linux 防火墻預設是僅放行部分資源而已。但由于計算機教室的區(qū)網(wǎng)內需要用到 Linux 的 NFS 資源,結果呢?竟然沒辦法放行啊!原來就是 iptables 沒有放行 NFS 所使用到的埠口~
所以,當你一直無法順利的連接 NFS 服務器,請先到服務器端,將客戶端的 IP 完全放行,若確定這樣就連的上, 那代表就是防火墻有問題啦!怎么解決呢?上一小節(jié)介紹過了,參考將 NFS 服務器埠口固定的方式吧!
13.3.4 自動掛載 autofs 的使用
在一般 NFS 文件系統(tǒng)的使用情況中,如果客戶端要使用服務器端所提供的 NFS 文件系統(tǒng)時,要嘛就是得在 /etc/rc.d/rc.local 當中設定開機時掛載,要嘛就得要登入系統(tǒng)后手動利用 mount 來掛載。 此外,客戶端得要預先手動的建立好掛載點目錄,然后掛載上來。但是這樣的使用情況恐怕有點小問題。
-
NFS 文件系統(tǒng)與網(wǎng)絡聯(lián)機的困擾:
我們知道 NFS 服務器與客戶端的聯(lián)機或許不會永遠存在,而 RPC 這個服務又挺討厭的,如果掛載了 NFS 服務器后,任何一方脫機都可能造成另外一方老是在等待逾時~而且,掛載的 NFS 文件系統(tǒng)可能又不是常常被使用,但若不掛載的話,有時候緊急要使用時又得通知系統(tǒng)管理員, 這又很不方便...啊!好討厭的感覺啊~@_@
所以,讓我們換個思考的角度來討論一下使用 NFS 的情境:
- 可不可以讓客戶端在有使用到 NFS 文件系統(tǒng)的需求時才讓系統(tǒng)自動掛載?
- 當 NFS 文件系統(tǒng)使用完畢后,可不可以讓 NFS 自動卸除,以避免可能的 RPC 錯誤?
如果能達到上述的功能,那就太完美啦!有沒有這東西呢?有的,在現(xiàn)在的 Linux 環(huán)境下這是可以達成的理想!用的就是 autofs 這個服務啦!
-
autofs 的設定概念:
autofs 這個服務在客戶端計算機上面,會持續(xù)的偵測某個指定的目錄, 并預先設定當使用到該目錄下的某個次目錄時,將會取得來自服務器端的 NFS 文件系統(tǒng)資源,并進行自動掛載的動作。?講這樣或許你有點模糊,讓我們拿底下這個圖示來看看:
圖 13.3-1、autofs 自動掛載的配置文件內容示意圖
如上圖所示,我們的?autofs 主要配置文件為 /etc/auto.master,這個檔案的內容很簡單, 如上所示,我只要定義出最上層目錄 (/home/nfsfile) 即可,這個目錄就是 autofs 會一直持續(xù)偵測的目錄啦。 至于后續(xù)的檔案則是該目錄底下各次目錄的對應。在 /etc/auto.nfs (這個檔案的檔名可自定義) 里面則可以定義出每個次目錄所欲掛載的遠程服務器的 NFS 目錄資源!
舉例來說:『當我們在客戶端要使用 /home/nfsfile/public 的數(shù)據(jù)時,此時 autofs 才會去 192.168.100.254 服務器上掛載 /home/public !』且『當隔了 5 分鐘沒有使用該目錄下的數(shù)據(jù)后,則客戶端系統(tǒng)將會主動的卸除 /home/nfsfile/public 』。
很不錯用的一個工具吧!因為有用到服務器的數(shù)據(jù)時才自動掛載,沒有使用了就會自動卸除! 而不是傳統(tǒng)的情況一直是掛載的!既然這么好用,那就讓我們實際來操演一下:
-
建立主配置文件 /etc/auto.master ,并指定偵測的特定目錄
這個主要配置文件的內容很簡單,只要有要被持續(xù)偵測的目錄及『數(shù)據(jù)對應文件』即可。 那個數(shù)據(jù)對應文件的文件名是可以自行設定的,在鳥哥這個例子當中我使用 /etc/auto.nfs 來命名。
| [root@clientlinux ~]# vim /etc/auto.master /home/nfsfile /etc/auto.nfs |
上述數(shù)據(jù)中比較需要注意的是,那個 /home/nfsfile 目錄不需要存在,因為 autofs 會主動的建立該目錄! 如果你建立了,可能反而會出問題~因此,先確定一下沒有該目錄吧!
-
建立數(shù)據(jù)對應文件內 (/etc/auto.nfs) 的掛載信息與服務器對應資源
剛剛我們所指定的 /etc/auto.nfs 是自行設定的,所以這個檔案是不存在的。那么這個檔案的格式是如何呢?你可以這樣看:
| [本地端次目錄] [-掛載參數(shù)] [服務器所提供的目錄] 選項與參數(shù): [本地端次目錄] :指的就是在 /etc/auto.master 內指定的目錄之次目錄 [-掛載參數(shù)] :就是前一小節(jié)提到的 rw,bg,soft 等等的參數(shù)啦!可有可無; [服務器所提供的目錄] :例如 192.168.100.254:/home/public 等[root@clientlinux ~]# vim /etc/auto.nfs public -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/public testing -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/test temp -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/tmp # 參數(shù)部分,只要最前面加個 - 符號即可! |
這樣就可以建立對應了!要注意的是,那些 /home/nfsfile/public 是不需要事先建立的! 咱們的 autofs 會事情況來處理喔!好了,接下來讓我們看看如何實際運作吧!
-
實際運作與觀察
配置文件設定妥當后,當然就是要啟動 autofs 啦!
| [root@clientlinux ~]# /etc/init.d/autofs stop [root@clientlinux ~]# /etc/init.d/autofs start # 很奇怪!非常怪!CentOS 6.x 的 autofs 使用 restart 會失效!所以鳥哥才進行兩次 |
假設你目前并沒有掛載任何來自 192.168.100.254 這部 NFS 服務器的資源目錄。好了, 那讓我們實際來觀察看看幾個重要的數(shù)據(jù)吧!先看看 /home/nfsfile 會不會主動的被建立? 然后,如果我要進入 /home/nfsfile/public 時,文件系統(tǒng)會如何變化呢?
| [root@clientlinux ~]# ll -d /home/nfsfile drwxr-xr-x. 2 root root 0 2011-07-28 00:07 /home/nfsfile # 仔細看,妳會發(fā)現(xiàn) /home/nfsfile 容量是 0 喔!那是正常的!因為是 autofs 建立的[root@clientlinux ~]# cd /home/nfsfile/public [root@clientlinux public]# mount | grep nfsfile 192.168.100.254:/home/public on /home/nfsfile/public type nfs (rw,soft,rsize=32768, wsize=32768,sloppy,vers=4,addr=192.168.100.254,clientaddr=192.168.100.10) # 上面的輸出是同一行!瞧!突然出現(xiàn)這個玩意兒!因為是自動掛載的嘛![root@clientlinux public]# df /home/nfsfile/public 文件系統(tǒng) 1K-區(qū)段 已用 可用 已用% 掛載點 192.168.100.254:/home/public7104640 143104 6607040 3% /home/nfsfile/public # 檔案的掛載也出現(xiàn)沒錯! |
呵呵!真是好啊!如此一來,如果真的有需要用到該目錄時,系統(tǒng)才會去相對的服務器上面掛載! 若是一陣子沒有使用,那么該目錄就會被卸除呢!這樣就減少了很多不必要的使用時機啦!還不錯用吧! ^_^
13.4 案例演練
讓我們來做個實際演練,在練習之前,請將服務器的 NFS 設定數(shù)據(jù)都清除,但是保留 rpcbind 不可關閉。至于客戶端的環(huán)境下, 先關閉 autofs 以及取消之前在 /etc/rc.d/rc.local 里面寫入的開機自動掛載項目。同時刪除 /home/nfs 目錄呦! 接下來請看看我們要處理的環(huán)境為何:
模擬的環(huán)境狀態(tài)中,服務器端的想法如下:
服務器端設定的實地演練:
好了,那么請你先不要看底下的答案,先自己動筆或者直接在自己的機器上面動手作作看,等到得到你要的答案之后, 再看底下的說明吧!
| [root@www ~]# vim /etc/exports /tmp 192.168.100.0/24(rw,no_root_squash) /home/nfs 192.168.100.0/24(ro) *(ro,all_squash) /home/upload 192.168.100.0/24(rw,all_squash,anonuid=210,anongid=210) /home/andy 192.168.100.10(rw) |
| # 1. /tmp [root@www ~]# ll -d /tmp drwxrwxrwt. 12 root root 4096 2011-07-27 23:49 /tmp# 2. /home/nfs [root@www ~]# mkdir -p /home/nfs [root@www ~]# chmod 755 -R /home/nfs # 修改較為嚴格的檔案權限將目錄與檔案設定成只讀!不能寫入的狀態(tài),會更保險一點!# 3. /home/upload [root@www ~]# groupadd -g 210 nfs-upload [root@www ~]# useradd -g 210 -u 210 -M nfs-upload # 先建立對應的賬號與組名及 UID 喔! [root@www ~]# mkdir -p /home/upload [root@www ~]# chown -R nfs-upload:nfs-upload /home/upload # 修改擁有者!如此,則用戶與目錄的權限都設定妥當啰!# 4. /home/andy [root@www ~]# useradd andy [root@www ~]# ll -d /home/andy drwx------. 4 andy andy 4096 2011-07-28 00:15 /home/andy |
| [root@www ~]# /etc/init.d/nfs restart |
| # 1. 確認遠程服務器的可用目錄: [root@clientlinux ~]# showmount -e 192.168.100.254 Export list for 192.168.100.254: /home/andy 192.168.100.10 /home/upload 192.168.100.0/24 /home/nfs (everyone) /tmp 192.168.100.0/24# 2. 建立掛載點: [root@clientlinux ~]# mkdir -p /mnt/{tmp,nfs,upload,andy}# 3. 實際掛載: [root@clientlinux ~]# mount -t nfs 192.168.100.254:/tmp /mnt/tmp [root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/nfs /mnt/nfs [root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/upload /mnt/upload [root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/andy /mnt/andy |
整個步驟大致上就是這樣吶!加油喔!
13.5 重點回顧
- Network FileSystem (NFS) 可以讓主機之間透過網(wǎng)絡分享彼此的檔案與目錄;
- NFS 主要是透過 RPC 來進行 file share 的目的,所以 Server 與 Client 的 RPC 一定要啟動才行!
- NFS 的配置文件就是 /etc/exports 這個檔案;
- NFS 的權限可以觀察 /var/lib/nfs/etab,至于的重要登錄檔可以參考 /var/lib/nfs/xtab 這個檔案,還包含相當多有用的信息在其中!
- NFS 服務器與客戶端的使用者賬號名稱、UID 最好要一致,可以避免權限錯亂:
- NFS 服務器預設對客戶端的 root 進行權限壓縮,通常壓縮其成為 nfsnobody 或 nobody。
- NFS 服務器在更動 /etc/exports 這個檔案之后,可以透過 exportfs 這個指令來重新掛載分享的目錄!
- 可以使用 rpcinfo 來觀察 RPC program 之間的關系!!!
- NFS 服務器在設定之初,就必須要考慮到 client 端登入的權限問題,很多時候無法寫入或者無法進行分享,主要是 Linux 實體檔案的權限設定問題所致!
- NFS 客戶端可以透過使用 showmount, mount 與 umount 來使用 NFS 主機提供的分享的目錄!
- NFS 亦可以使用掛載參數(shù),如 bg, soft, rsize, wsize, nosuid, noexec, nodev 等參數(shù), 來達到保護自己文件系統(tǒng)的目標!
- 自動掛載的 autofs 服務可以在客戶端需要 NFS 服務器提供的資源時才掛載。
13.6 本章習題
- NFS 的主要配置文件為何?而在該檔案內主要設定項目為何? 主要的配置文件為 /etc/exports 而至于其設定的內容項目在每一行當中則為:
- 分享的目錄
- 針對此分享目錄開放的主機或 IP或網(wǎng)域
- 針對這部主機所開放的權限參數(shù)!
- 在 NFS 主要的配置文件當中僅有少許的參數(shù)說明,至于預設的參數(shù)說明則沒有在該檔案當中出現(xiàn), 請問,如果要查閱更詳細的分享出來的檔案的屬性,要看那個檔案? /var/lib/nfs/etab
- 在 client 端如果要掛載 NFS 所提供分享的檔案,可以使用那個指令? 那自然就是 mount 啦!還有卸除是 umount 喔!
- 在 NFS 主要配置文件當中,可以透過那個參數(shù)來控制不讓 client 端以 root 的身份使用你所分享出來的目錄與檔案? 可以在 /etc/exports 當中的參數(shù)項目,設定『 root_squash 』來控制壓縮 root 的身份喔!
- 我在 client 端掛載了 NFS Server 的某個目錄在我的 /home/data 底下,當我執(zhí)行其中某個程序時,卻發(fā)現(xiàn)我的系統(tǒng)被破壞了?你認為可能的原因為何? 該如何克服這樣的問題,尤其是當我的 Client 端主機其實是多人共享的環(huán)境, 怕其他的使用者也同樣發(fā)生類似的問題呢?!
- 可能由于你掛載進來的 NFS Server 的 partition 當中具有 SUID 的文件屬性,而你不小心使用了該執(zhí)行檔,因此就可能會發(fā)生系統(tǒng)被破壞的問題了!
- 可以將掛載進來的 NFS 目錄的 SUID 功能取消!例如:
- 可能由于你掛載進來的 NFS Server 的 partition 當中具有 SUID 的文件屬性,而你不小心使用了該執(zhí)行檔,因此就可能會發(fā)生系統(tǒng)被破壞的問題了!
- 可以將掛載進來的 NFS 目錄的 SUID 功能取消!例如:
mount -t nfs -o nosuid,ro server:/directory /your/directory
13.7 參考數(shù)據(jù)與延伸閱讀
- 注1:Sun (升陽) 公司已經(jīng)被甲骨文 (Oracle) 公司合并了,因此公司網(wǎng)址改于:
http://www.oracle.com/us/sun/index.html - http://www.faqs.org/rfcs/rfc1094.html
鳥哥這里的備份:http://linux.vbird.org/linux_server/0330nfs/0330nfs_rpc.html - http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
- man exports
- man autofs
總結
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(服务器)- 第十三章、文件服务器之一:NFS 服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(服务器)- 第十
- 下一篇: 鸟哥的Linux私房菜(服务器)- 第十