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