1. 準(zhǔn)備工作
2. NFS的由來(lái)與其功能
2.1 什么是NFS ( Network FileSystem )
2.2 什么是RPC ( Remote Procedure Call )
2.3 NFS啟動(dòng)的RPC daemons
2.4 NFS的文件存取權(quán)限
3. NFS Server 端的設(shè)定
3.1 所需要的套件
3.2 NFS的套件結(jié)構(gòu)
3.3 /etc/exports 配置文件的語(yǔ)法與參數(shù)
3.4 NFS服務(wù)的啟動(dòng):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ù)與開(kāi)機(jī)掛載
4.3 無(wú)法掛載的原因分析
4.4 自動(dòng)掛載 autofs 的使用
5. 案例演練
6. 參考資料
1、準(zhǔn)備工作
NFS 這個(gè)借由網(wǎng)路分享文件系統(tǒng)的服務(wù)在架設(shè)的時(shí)候是很簡(jiǎn)單的,不過(guò),他最大的問(wèn)題在于『權(quán)限』方面的概念!因?yàn)樵诳蛻舳伺c服務(wù)器端可能必須要具備相同的賬號(hào)才能夠存取某些目錄或檔案。 另外,NFS的啟動(dòng)需要透過(guò)所謂的遠(yuǎn)端程序呼叫 (RPC),也就是說(shuō),我們并不是只要啟動(dòng)NFS就好了,還需要啟動(dòng)RPC這個(gè)服務(wù)才行!
2、 NFS的由來(lái)與其功能
2.1 什么是 NFS (Network FileSystem)
NFS(Network File System)是一種分布式文件系統(tǒng),允許網(wǎng)絡(luò)中的安裝不同操作系統(tǒng)的計(jì)算機(jī)間共享文件和外設(shè),所以它的通訊協(xié)定設(shè)計(jì)與主機(jī)及操作系統(tǒng)無(wú)關(guān). 它是由SUN公司于1984年推出,使得可以本地機(jī)一樣的使用另一臺(tái)聯(lián)網(wǎng)計(jì)算機(jī)的文件和外設(shè)。NFS在文件傳送或信息傳送過(guò)程中依賴于RPC協(xié)議。
圖一、NFS 主機(jī)分享目錄與 Client 掛載示意圖
就如同上面的圖示一般,當(dāng)我們的NFS Server設(shè)定好共享出來(lái)的/home/sharefile這個(gè)目錄后,其他的NFS Client端就可以將這個(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 Server系統(tǒng)內(nèi)的/home/sharefile目錄下的所有資料了 (當(dāng)然,權(quán)限要足夠)。這個(gè) /home/data/sharefile 就好像 NFS client 1自己機(jī)器里面的一個(gè) partition。只要權(quán)限對(duì)了,那么您可以使用 cp, cd, mv, rm... 等等磁盤或文件相關(guān)的命令。
好的,既然NFS是通過(guò)網(wǎng)絡(luò)來(lái)進(jìn)行文件的傳輸,那么經(jīng)由socket pair的概念你會(huì)知道NFS應(yīng)該會(huì)使用一些port吧?那么NFS使用哪個(gè) port來(lái)進(jìn)行傳輸呢?答案是....不知道?因?yàn)镹FS用來(lái)傳輸?shù)膒ort是隨機(jī)選擇小于1024以下的端口來(lái)使用的。那客戶端怎么知道你服務(wù)器端使用那個(gè)port呢?此時(shí)就得要遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call, RPC)的協(xié)議來(lái)輔助,下面我們就來(lái)談?wù)勈裁词?RPC?
2.2 什么是 RPC (Remote Procedure Call)
RPC, 遠(yuǎn)程過(guò)程調(diào)用 (remote procedure call)是能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機(jī)制。由于使用 RPC 的程序不必了解支持通信的網(wǎng)絡(luò)協(xié)議的情況,因此 RPC 提高了程序的互操作性。常用于分布式客戶端/服務(wù)器模型,發(fā)出請(qǐng)求的程序是客戶程序,而提供服務(wù)的程序是服務(wù)器。
因?yàn)镹FS支持的功能相當(dāng)?shù)亩?,而不同的功能都?huì)使用不同的程序來(lái)啟動(dòng),每啟動(dòng)一個(gè)功能就會(huì)啟用一些 port 來(lái)傳輸文件,因此, NFS 的功能所對(duì)應(yīng)的 port 才沒(méi)有固定, 而是采用隨機(jī)取用一些未被使用的小于 1024 的端口來(lái)作為傳輸之用。但如此一來(lái)又造成客戶端想要連上服務(wù)器時(shí)的困攏, 因?yàn)榭蛻舳说靡婪?wù)器端的相關(guān)端口才能夠連接!
此時(shí)我們就得需要遠(yuǎn)程過(guò)程調(diào)用(RPC) 的服務(wù),RPC 最主要的功能就是在指定每個(gè) NFS 功能所對(duì)應(yīng)的 port number ,并且返回給客戶端,讓客戶端可以連結(jié)到正確的端口上去。 那 RPC 又是如何知道每個(gè) NFS 的端口呢?這是因?yàn)楫?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)客戶端的需求并返回客戶端正確的端口。
注:在啟動(dòng) NFS 之前,RPC 就要先啟動(dòng)了,否則NFS會(huì)無(wú)法向 RPC 注冊(cè)。 另外,RPC若重新啟動(dòng)時(shí),原來(lái)注冊(cè)的資料會(huì)不見(jiàn),因此RPC重新啟動(dòng)后,它管理的所有程序都需要重新啟動(dòng)以重新向RPC注冊(cè)。
圖二、NFS 與 RPC 服務(wù)及文件系統(tǒng)操作的相關(guān)性
如上圖所示,當(dāng)客戶端有NFS文件存取需求時(shí),它會(huì)如何向服務(wù)器端請(qǐng)求文件呢?
1)、客戶端會(huì)向服務(wù)器端的RPC(port 111)發(fā)出NFS檔案存取功能的詢問(wèn)要求;
2)、服務(wù)器端找到對(duì)應(yīng)的已注冊(cè)的NFS daemon端口后,會(huì)返回給客戶端;
3)、客戶端了解正確的端口后,就可以直接與NFS daemon來(lái)建立連接;
由于 NFS 的各項(xiàng)功能都必須要向RPC來(lái)注冊(cè),如此一來(lái)RPC就能了解NFS這個(gè)服務(wù)的各項(xiàng)功能之port number, PID, NFS 在主機(jī)所監(jiān)聽(tīng)的IP等等,而客戶端才能夠通過(guò)RPC的詢問(wèn)找到正確對(duì)應(yīng)的端口。 也就是說(shuō),NFS 必須要有RPC存在時(shí)才能成功的提供服務(wù),因此我們稱NFS為RPC server的一種。事實(shí)上,有很多這樣的服務(wù)器都是向RPC注冊(cè)的,舉例來(lái)說(shuō),NIS (Network Information Service)也是RPC server 的一種。 此外,由圖二你也會(huì)知道,不論是客戶端還是服務(wù)器端,要使用 NFS 時(shí),兩者都需要啟動(dòng) RPC 才行。
更多的 NFS 相關(guān)協(xié)議信息你可以參考下面網(wǎng)頁(yè):
http://www.faqs.org/rfcs/rfc1094.html
http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
2.3 NFS啟動(dòng)的RPC daemons
我們現(xiàn)在知道NFS服務(wù)器在啟動(dòng)的時(shí)候就得要向RPC注冊(cè),所以NFS服務(wù)器也被稱為RPC server之一。那么NFS服務(wù)器主要的任務(wù)是進(jìn)行文件系統(tǒng)的共享,文件系統(tǒng)的共享則與權(quán)限有關(guān)。 所以 NFS 服務(wù)器啟動(dòng)時(shí)至少需要兩個(gè) daemons ,一個(gè)管理client端是否能夠登入的問(wèn)題,一個(gè)管理client端能夠取得的權(quán)限。如果你還想要管理quota的話,那么NFS還得要再載入其他的RPC程序。我們以較單純的NFS主機(jī)來(lái)說(shuō):
rpc.nfsd:
這個(gè) daemon 主要的功能就是在管理 Client 是否能夠登入主機(jī)的權(quán)限,其中還包含這個(gè)登入者的 ID 的判別。
rpc.mountd
這個(gè)daemon主要的功能,則是在管理NFS的文件系統(tǒng),當(dāng)Client端順利的通過(guò)rpc.nfsd而登入主機(jī)之后,在他可以使用NFS服務(wù)器提供的文件之前,還會(huì)經(jīng)過(guò)文件使用權(quán)限 (就是那個(gè)-rwxrwxrwx與owner, group那幾個(gè)權(quán)限)的認(rèn)證程序!它會(huì)去讀NFS的配置文件/etc/exports 來(lái)比對(duì)Client的權(quán)限,當(dāng)通過(guò)這一關(guān)之后Client就可以取得使用NFS文件的權(quán)限(注:這個(gè)也是我們用來(lái)管理NFS共享之目錄的使用權(quán)限與安全設(shè)定的地方)
rpc.lockd (非必要)
這個(gè)玩意兒可以用在管理文件的鎖定(lock)用途。為何文件需要『鎖定』呢?因?yàn)榧热环窒淼腘FS文件可以讓客戶端使用,那么當(dāng)多個(gè)客戶端同時(shí)嘗試寫(xiě)入某個(gè)文件時(shí),就可能對(duì)于該文件造成一些問(wèn)題啦!這個(gè)rpc.lockd則可以用來(lái)克服這個(gè)問(wèn)題。 但rpc.lockd必須要同時(shí)在客戶端與服務(wù)器端都開(kāi)啟才行,此外,rpc.lockd也常與rpc.statd 同時(shí)啟用。
rpc.statd (非必要)
可以用來(lái)檢查文件的一致性,與rpc.lockd有關(guān)!若發(fā)生因?yàn)榭蛻舳送瑫r(shí)使用同一文件造成文件可能有所損毀時(shí), rpc.statd 可以用來(lái)檢測(cè)并嘗試回復(fù)該文件。與 rpc.lockd同樣的,這個(gè)功能必須要在服務(wù)器端與客戶端都啟動(dòng)才會(huì)生效。
2.4 NFS的文件存取權(quán)限
不知道你有沒(méi)有想過(guò)這個(gè)問(wèn)題,在圖一的環(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)镹FS本身的服務(wù)并沒(méi)有進(jìn)行身份登入的識(shí)別,所以說(shuō),當(dāng)你在客戶端以dmtsai的身份想要存取服務(wù)器端的文件系統(tǒng)時(shí),服務(wù)器端會(huì)以客戶端的使用者UID與GID等身份來(lái)嘗試讀取服務(wù)器端的文件系統(tǒng)。這時(shí)有個(gè)有趣的問(wèn)題就產(chǎn)生啦!那就是如果客戶端與服務(wù)器端的使用者身份并不一致怎么辦?
我們以下面這個(gè)圖示來(lái)說(shuō)明一下:
圖三、NFS 的服務(wù)器端與客戶端的使用者身份確認(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)查詢對(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的使用者名稱為vbird時(shí),則客戶端的dmtsai可以存取服務(wù)器端的vbird這個(gè)使用者的文件!只因?yàn)閮烧呔哂邢嗤腢ID而已。這就造成很大的問(wèn)題了!因?yàn)闆](méi)有人可以保證客戶端的UID所對(duì)應(yīng)的賬號(hào)會(huì)與服務(wù)器端相同, 那服務(wù)器所提供的資料就可能會(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)名稱通常是nobody ,我們的RHEL4則取名為nfsnobody 。
如果使用者身份是root時(shí)
有個(gè)比較特殊的使用者,那就是每個(gè) Linux 主機(jī)都有的UID為0的root。想一想,如果客戶端可以用root的身份去存取服務(wù)器端的文件系統(tǒng)時(shí),那服務(wù)器端的資料哪有什么保護(hù)性?所以在預(yù)設(shè)的情況下, root的身份會(huì)被主動(dòng)的壓縮成為匿名者。
總之,客戶端使用者能做的事情是與UID及其GID有關(guān)的,那當(dāng)客戶端與服務(wù)器端的UID及賬號(hào)的對(duì)應(yīng)不一致時(shí),可能就會(huì)造成文件系統(tǒng)使用上的困擾,這個(gè)就是NFS文件系統(tǒng)在使用上面的一個(gè)很重要的地方!而在了解使用者賬號(hào)與UID及文件系統(tǒng)的關(guān)系之后,要實(shí)際在客戶端以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)你滿足了(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)槿绱?,所以NFS通常需要與NIS這一個(gè)可以確認(rèn)客戶端與服務(wù)器端身份一致的服務(wù)搭配使用,以避免身份的錯(cuò)亂
3、NFS Server 端的設(shè)定
既然要使用NFS的話,就得要安裝NFS所需要的套件,下面讓我們查詢一下系統(tǒng)有無(wú)安裝所需要的套件, NFS套件的架構(gòu)以及如何設(shè)定 NFS主機(jī)。^
3.1 所需要的套件
以RHEL 4為例的話,要設(shè)定好NFS服務(wù)器我們必須要有兩個(gè)套件才行,分別是:
NFS 主程序:nfs-utils
RPC 主程序:portmap
portmap
就如同剛剛提的到,我們的NFS其實(shí)可以被視為一個(gè)RPC程序,而要啟動(dòng)任何一個(gè)RPC程序之前,我們都需要做好port的對(duì)應(yīng) (mapping) 的工作才行,這個(gè)工作其實(shí)就是『portmap』這個(gè)服務(wù)所負(fù)責(zé)的!也就是說(shuō), 在啟動(dòng)任何一個(gè)RPC server之前,我們都需要啟動(dòng)portmap才行!
nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 這兩個(gè) NFS daemons 與其他相關(guān) documents 與說(shuō)明文件、執(zhí)行檔等的套件!這個(gè)就是 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
這個(gè)文件就是NFS的主要配置文件。系統(tǒng)可能沒(méi)有預(yù)設(shè),所以這個(gè)文件不一定會(huì)存在,您可能必須要使用 vi 主動(dòng)的建立這個(gè)文件。
/usr/sbin/exportfs
這個(gè)是維護(hù)NFS共享資源的命令,我們可以利用這個(gè)命令重新共享 /etc/exports 變更的目錄資源、將NFS Server分享的目錄卸載或重新分享等等,這個(gè)指令是NFS系統(tǒng)里面相當(dāng)重要的。至于指令的用法我們?cè)谙旅鏁?huì)再介紹。
/usr/sbin/showmount
這是另一個(gè)重要的NFS命令。exportfs是用在NFS Server端,而showmount則主要用在Client端。這個(gè)showmount可以用來(lái)察看NFS共享出來(lái)的目錄資源。
/var/lib/nfs/*tab
在NFS服務(wù)器的登錄檔都放置到/var/lib/nfs/目錄里面,在該目錄下有兩個(gè)比較重要的登錄檔,一個(gè)是etab ,主要記錄了 NFS 所分享出來(lái)的目錄的完整權(quán)限設(shè)定值;另一個(gè)xtab則記錄曾經(jīng)連結(jié)到此NFS主機(jī)的相關(guān)客戶端資料。
/var/lib/nfs/rmtab
狀態(tài)文件,列出了掛接導(dǎo)出文件的遠(yuǎn)程客戶機(jī)清單。
3.3 /etc/exports配置文件的語(yǔ)法與參數(shù)
在開(kāi)始NFS服務(wù)器的設(shè)置之前,您必須要了解的是,NFS會(huì)直接使用到內(nèi)核功能,所以你的內(nèi)核必須要有支持NFS才行。 萬(wàn)一如果你的內(nèi)核版本小于2.2版,或者重新自行編譯過(guò)內(nèi)核的話,那么就得要很注意, 因?yàn)槟憧赡軙?huì)忘記選擇NFS的核心支持。
還好,我們RHEL4或者是其他版本的Linux ,預(yù)設(shè)內(nèi)核通常是支援NFS功能的, 所以你只要確認(rèn)你的內(nèi)核版本是目前新的2.6.x版,并且使用你的distribution所提供的核心,那應(yīng)該就不會(huì)有問(wèn)題。
至于NFS服務(wù)器的架設(shè)實(shí)在很簡(jiǎn)單,你只要編輯好主要配置文件/etc/exports之后, 先啟動(dòng)portmap ,然后再啟動(dòng)nfs ,你的NFS就成功了!不過(guò)這樣的設(shè)定能否對(duì)客戶端生效?那就得要考慮你權(quán)限方面的設(shè)定能力了。 我們就直接來(lái)看看/etc/exports 應(yīng)該如何配置,某些 distributions并不會(huì)主動(dòng)提供 /etc/exports 文件,所以請(qǐng)您自行手動(dòng)建立。
例如:
# vi /etc/exports
/tmp 192.168.1.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync)
[分享目錄](méi) [第一個(gè)主機(jī)(權(quán)限)] [可用主機(jī)名] [可用域名]
這個(gè)文件的內(nèi)容非常簡(jiǎn)單,每一行由共享路徑,客戶端列表以及每個(gè)客戶端后緊跟的訪問(wèn)選項(xiàng)構(gòu)成:
[共享的目錄](méi) [主機(jī)名或IP(參數(shù),參數(shù))]
其中參數(shù)是可選的,當(dāng)不指定參數(shù)時(shí),nfs將使用默認(rèn)選項(xiàng)。默認(rèn)的共享選項(xiàng)是 sync,ro,root_squash,no_delay。
當(dāng)主機(jī)名或IP地址為空時(shí),則代表共享給任意客戶機(jī)提供服務(wù)。
當(dāng)將同一目錄共享給多個(gè)客戶機(jī),但對(duì)每個(gè)客戶機(jī)提供的權(quán)限不同時(shí),可以這樣:
[共享的目錄](méi) [主機(jī)名1或IP1(參數(shù)1,參數(shù)2)] [主機(jī)名2或IP2(參數(shù)3,參數(shù)4)]
下面是一些NFS共享的常用參數(shù):
ro: read-only,只讀訪問(wèn)權(quán)限
rw: read-write,可讀寫(xiě)的權(quán)限
sync: 資料同步寫(xiě)入到內(nèi)存與硬盤中
async: 資料會(huì)先暫存于內(nèi)存中,而非直接寫(xiě)入硬盤
secure: NFS通過(guò)1024以下的安全TCP/IP端口發(fā)送
insecure: NFS通過(guò)1024以上的端口發(fā)送
wdelay: 如果多個(gè)客戶要寫(xiě)入NFS目錄,則歸組寫(xiě)入(默認(rèn))
no_wdelay: 如果多個(gè)客戶要寫(xiě)入NFS目錄,則立即寫(xiě)入,當(dāng)使用async時(shí),無(wú)需此設(shè)置。
hide: 在NFS共享目錄中不共享其子目錄
no_hide: 共享NFS目錄的子目錄
subtree_check: 如果共享/usr/bin之類的子目錄時(shí),強(qiáng)制NFS檢查父目錄的權(quán)限(默認(rèn))
no_subtree_check: 和上面相對(duì),不檢查父目錄權(quán)限
no_all_squash: 保留共享文件的UID和GID(默認(rèn))
all_squash
不論登入 NFS 的使用者身份為何, 他的UID和GID映射匿名客戶anonymous(通常也就是 nobody(nfsnobody)),適合公用目錄。
root_squash
在登入NFS主機(jī)使用共享之目錄的使用者如果是root時(shí),那么這個(gè)使用者的權(quán)限將被映射成為匿名使用者,通常他的 UID 與 GID 都會(huì)變成nobody(nfsnobody) 那個(gè)系統(tǒng)賬號(hào)的身份的權(quán)限;(默認(rèn))
no_root_squas
登入NFS主機(jī)使用共享目錄的使用者,如果是root的話,那么對(duì)于這個(gè)共享的目錄來(lái)說(shuō),他就具有root的權(quán)限!這個(gè)項(xiàng)目『極不安全』,不建議使用!
anonuid=xxx: 指定NFS服務(wù)器/etc/passwd文件中匿名客戶的UID
anongid=xxx: 指定NFS服務(wù)器/etc/passwd文件中匿名客戶的GID
/etc/exports 中client的書(shū)寫(xiě)規(guī)則
(1)單個(gè)主機(jī)
可以用短名及完全限定名,或者用IP地址,例如student01、student01.flying.com.cn或者192.168.10.1都是合法的主機(jī)名。
(2)Net-Group
可以列出/etc/netgroup文件中或NFS網(wǎng)組映射中定義的整組主機(jī)。網(wǎng)組名以@開(kāi)頭。
(3)通配符主機(jī)
.discuz.net *.*.comsenz.com
(4)掩碼
192.168.1.0/255.255.255.0
接下來(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ì)配置文件?
# vi /etc/exports
# 任何人都可以用我的 /tmp ,用通配字符(*)來(lái)處理主機(jī)名稱,重點(diǎn)在no_root_squash
/tmp *(rw,no_root_squash)
參考前面的主機(jī)名稱設(shè)定說(shuō)明,我們可以利用通配字符(*)。這表示無(wú)論來(lái)自哪里都可以使用我的/tmp這個(gè)目錄。 再次提醒,『 *(rw,no_root_squash)』這一串設(shè)定值中間是沒(méi)有空格的,而/tmp與*(rw,no_root_squash)則是有空格來(lái)隔開(kāi)的。特別注意到 no_root_squash的功能!在這個(gè)例子中,如果你是客戶端,而且您是以 root 的身份登入您的Linux主機(jī),那么當(dāng)您mount上我這部主機(jī)的 /tmp 之后,您在該mount的目錄當(dāng)中,將具有『root 的權(quán)限』
思考二:同一目錄針對(duì)不同范圍開(kāi)放不同權(quán)限
我要將一個(gè)公共的目錄/home/public公開(kāi)出去,但是只有限定我的局域網(wǎng)內(nèi)192.168.0.0/24這個(gè)網(wǎng)段可以讀寫(xiě),其他人則只能讀?。?br>
# vi /etc/exports
/tmp *(rw,no_root_squash)
/home/public 192.168.0.0/24(rw) *(ro)
# 繼續(xù)加在后面,注意,我有將主機(jī)與網(wǎng)域分為兩段(用空格隔開(kāi))
上面的例子說(shuō)的是,當(dāng)我的IP是在192.168.0.0/24 這個(gè)網(wǎng)段的時(shí)候,那么當(dāng)我在Client端掛載了Server 端的/home/public后,針對(duì)這個(gè)被我掛載的目錄我就具有可以讀寫(xiě)的權(quán)限,至于如果我不是在這個(gè)網(wǎng)段之內(nèi),那么這個(gè)目錄的文件我就只能讀取而已,亦即為只讀的屬性。
需要注意的是,通配字符僅能用在主機(jī)名稱的分辨上面,IP或網(wǎng)段就只能用192.168.0.0/24的狀況,不可以使用192.168.0.*
思考三:僅給某個(gè)單一主機(jī)使用的目錄設(shè)置
我要將一個(gè)私人的目錄 /home/test 開(kāi)放給192.168.0.100這個(gè)Client端的機(jī)器來(lái)使用,那么我就必需這么寫(xiě):
# 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這部機(jī)器才能對(duì)/home/test這個(gè)目錄進(jìn)行存取。
思考四:開(kāi)放匿名登入的情況
我要讓*.linux.org網(wǎng)域的主機(jī),登入我的NFS主機(jī)時(shí),可以存取 /home/linux,但是他們存資料的時(shí)候,我希望他們的UID與GID 都變成40這個(gè)身份的使用者, 假設(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)
# 如果要開(kāi)放匿名,那么重點(diǎn)是all_squash,并且要配合anonuid
特別注意到那個(gè)all_squash與anonuid,anongid 的功能!如此一來(lái),當(dāng) test.linux.org 登入這部 NFS 主機(jī),并且在 /home/linux 寫(xiě)入文件時(shí),該文件的所有人與所有群組,就會(huì)變成/etc/passwd 里面對(duì)應(yīng)的UID為40的那個(gè)身份的使用者。
上面四個(gè)案例的權(quán)限如果依照前一小節(jié)的存取設(shè)定權(quán)限來(lái)思考的話,那么權(quán)限會(huì)是什么情況呢?讓我們來(lái)檢查一下:
客戶端與主機(jī)端具有相同的UID與賬號(hào):
假設(shè)我在192.168.0.100登入這個(gè)NFS(IP假設(shè)為192.168.0.2)主機(jī),并且我在192.168.0.100的賬號(hào)為dmtsai這個(gè)身份,同時(shí),在這個(gè)NFS上面也有dmtsai這個(gè)賬號(hào),并具有相同的UID,果真如此的話,那么:
a) 由于192.168.0.2這個(gè)NFS主機(jī)的/tmp權(quán)限為-rwxrwxrwt,所以我 (dmtsai在192.168.0.100上面)在/tmp底下具有存取的權(quán)限,并且寫(xiě)入的文件所有人為dmtsai;
b) 在/home/public當(dāng)中,由于我有讀寫(xiě)的權(quán)限,所以如果在/home/public這個(gè)目錄的權(quán)限對(duì)于dmtsai有開(kāi)放寫(xiě)入的話,那么我就可以讀寫(xiě),并且我寫(xiě)入的文件所有人是dmtsai。但是萬(wàn)一/home/public對(duì)于dmtsai這個(gè)使用者并沒(méi)有開(kāi)放可以寫(xiě)入的權(quán)限時(shí),那么我還是沒(méi)有辦法寫(xiě)入文件(這點(diǎn)請(qǐng)?zhí)貏e留意);
c) 在/home/test當(dāng)中,我的權(quán)限與/home/public相同的狀態(tài),還需要NFS主機(jī)的/home/test對(duì)于dmtsai有開(kāi)放權(quán)限;
d) 在/home/linux當(dāng)中就比較麻煩,因?yàn)椴徽撃呛畏Nuser ,您的身份一定會(huì)被變成UID=40這個(gè)賬號(hào)!所以,這個(gè)目錄就必需要針對(duì)UID = 40的那個(gè)賬號(hào)名稱,修改他的權(quán)限才行。
客戶端與主機(jī)端的賬號(hào)并未相同時(shí):
假如我在192.168.0.100的身份為vbird ,但是192.168.0.2這部NFS主機(jī)卻沒(méi)有vbird這個(gè)賬號(hào)時(shí),情況會(huì)變成怎樣呢?
a) 我在/tmp 底下還是可以寫(xiě)入,但是寫(xiě)入的文件所有人變成 nobody 了;
b) 我在/home/public里面是否可以寫(xiě)入,還需要視/home/public的權(quán)限而定,不過(guò),反正我的身份就被變成nobody了就是;
c) /home/test 的觀點(diǎn)與/home/public相同!
d) /home/linux 底下,我的身份就被變成 UID=40那個(gè)使用者呢!
當(dāng)客戶端的身份為 root 時(shí):
假如我在192.168.0.100的身份為root,root這個(gè)賬號(hào)每個(gè)系統(tǒng)都會(huì)有,權(quán)限變成怎樣呢?
a) 我在/tmp里面可以寫(xiě)入,并且由于no_root_squash的參數(shù),改變了預(yù)設(shè)的root_squash設(shè)定值,所以在/tmp寫(xiě)入的文件所有者為 root
b) 我在/home/public底下的身份還是被壓縮成為nobody,因?yàn)轭A(yù)設(shè)屬性里面都具有root_squash,所以,如果/home/public 有針對(duì) nobody開(kāi)放寫(xiě)入權(quán)限時(shí),那么我就可以寫(xiě)入,但是文件所有者變成nobody
c) /home/test與/home/public相同;
d) /home/linux 的情況中,我root的身份也被壓縮成為UID=40的那個(gè)使用者
這樣的權(quán)限講解之后,您可以了解了嗎?這里是最重要的地方,如果這一關(guān)通過(guò)了,下面的就沒(méi)有問(wèn)題啦! 當(dāng)然,您還是得要回到前一小節(jié)NFS 的文件存取權(quán)限好好的瞧一瞧, 才能解決NFS的問(wèn)題。
3.4 NFS服務(wù)的啟動(dòng)
NFS的啟動(dòng)還需要portmap的協(xié)助,所以需先啟動(dòng)。
# /etc/init.d/portmap start
# 如果 portmap 本來(lái)就已經(jīng)在執(zhí)行了,那就不需要啟動(dòng)??!
# /etc/init.d/nfs start
# 有時(shí)候可能會(huì)出現(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‘).
# 上面的警告訊息僅是在告知因?yàn)槲覀儧](méi)有指定 sync 或 async 的參數(shù),
# 則NFS將預(yù)設(shè)會(huì)使用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è)定,只要直接啟動(dòng)就行,啟動(dòng)之后,會(huì)出現(xiàn)一個(gè)port 111的sunrpc的服務(wù),那就是portmap啦!至于nfs則會(huì)啟動(dòng)至少兩個(gè)以上的daemon出現(xiàn)!然后就開(kāi)始在監(jiān)聽(tīng)Client端的請(qǐng)求。你必須要很注意屏幕上面的輸出資訊, 因?yàn)槿绻渲梦募?xiě)錯(cuò)的話,屏幕上會(huì)顯示出錯(cuò)誤。
此外,如果你想要增加一些NFS服務(wù)器的文件一致性功能時(shí),可能需要用到rpc.lockd及rpc.statd等RPC服務(wù), 那么或許你可以增加一個(gè)服務(wù),那就是nfslock
# /etc/init.d/nfslock start
啟動(dòng)之后,請(qǐng)趕快到 /var/log/messages 里面看看有沒(méi)有被正確的啟動(dòng)呢?
# 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)沒(méi)有問(wèn)題之后,接下來(lái)我們來(lái)看一看NFS到底開(kāi)了哪些端口?
# 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,真是可怕!不過(guò)主要的端口是:
portmap啟動(dòng)的 port 在 111;
NFS啟動(dòng)的port在2049;
其它rpc.daemons啟動(dòng)的port則是隨機(jī)產(chǎn)生的,因此需向port 111注冊(cè)。
好了,那我怎么知道每個(gè)RPC服務(wù)的注冊(cè)狀況?你可以使用 rpcinfo 來(lái)處理的。
# rpcinfo [-p] [IP|hostname]
參數(shù):
-p :顯示出所有的 port 與 porgram 的信息;
范例一:顯示出目前這部主機(jī)的 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)中除了程序名稱與端口的對(duì)應(yīng)可以與netstat -tlunp輸出的結(jié)果作比對(duì)之外,還需要注意到NFS版本支持!新的NFS 版本傳輸速度較快,由上表看起來(lái),我們的NFS至少支持到第3版,應(yīng)該還算合理,如果你的rpcinfo無(wú)法輸出,那就表示注冊(cè)的資料有問(wèn)題,可能需要重新啟動(dòng)portmap與nfs。
3.5 NFS的連接觀察
在你的NFS服務(wù)器設(shè)定好之后,我們可以先自我測(cè)試一下是否可以連接?
showmount [-ae] [hostname|IP]
參數(shù):
-a :這個(gè)參數(shù)是一般在NFS SERVER上使用,是用來(lái)顯示已經(jīng)mount上本機(jī)nfs目錄的cline機(jī)器
-e :顯示主機(jī)的 /etc/exports 所共享的目錄。
范例一:請(qǐng)顯示出剛剛我們所設(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
很簡(jiǎn)單吧!所以,當(dāng)您要查看某一臺(tái)主機(jī)提供的NFS共享的目錄時(shí),就使用 showmount -e IP (或hostname)即可!非常的方便吧!這也是 NFS client 端最常用的指令。
事實(shí)上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 等等,
# 其實(shí)還有 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ù)
上面僅僅是一個(gè)小范例,只是....怎么anonuid會(huì)是-2?其實(shí)那個(gè)數(shù)值是65536-2,所以得到65534,比對(duì)/etc/passwd,會(huì)發(fā)現(xiàn)RHEL4出現(xiàn)的是nfsnobody,這個(gè)賬號(hào)在不同的版本都可能會(huì)不一樣。 另外,如果有其他客戶端掛載了你的NFS文件系統(tǒng)時(shí),那么該客戶端與文件系統(tǒng)信息就會(huì)被記錄到/var/lib/nfs/xtab。
另外,如果你想要重新處理/etc/exports文件,是不是我們每次修改了配置文件都需要重啟nfs服務(wù)呢?這個(gè)時(shí)候我們就可以用exportfs命令重新掃描/etc/exports文件,來(lái)使改動(dòng)立刻生效。
exportfs [-aruv]
參數(shù):
-a :全部掛載(或卸載)/etc/exports文件內(nèi)的設(shè)置
-r :重新掛載/etc/exports里面的設(shè)置,此外,亦同步更新/etc/exports及/var/lib/nfs/xtab 的內(nèi)容!
-u :卸載某一目錄
-v :在export的時(shí)候,將分享的目錄顯示到屏幕上!
范例一:重新掛載一次 /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的安全性上面,有些地方是你必須知道的!下面我們分別來(lái)看一看:
a) 利用iptables做大范圍連接的限制:
假設(shè)我們的NFS主要是針對(duì)內(nèi)部網(wǎng)路開(kāi)放而已,而對(duì)于外部網(wǎng)路只有對(duì)140.116.0.0/16這個(gè)網(wǎng)段 ,那么你可以在iptables.allow內(nèi)增加如下的語(yǔ)法:
# 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 這個(gè)C Class的網(wǎng)域與140.116.0.0/16這個(gè) B Class的網(wǎng)段到您的主機(jī)里面來(lái),而其它的連接就視您的原本的iptables的狀態(tài)而定。
那為什么是限制port 111而不是每個(gè)RPC server所開(kāi)啟的端口呢?因?yàn)镽PC server所開(kāi)啟的端口都是隨機(jī)產(chǎn)生的,要對(duì)他開(kāi)放實(shí)在是... 而且客戶端想要連上NFS服務(wù)器之前,都是透過(guò)port 111來(lái)向NFS服務(wù)器詢問(wèn)連接的端口的,所以當(dāng)然先就port 111來(lái)進(jìn)行限制。
b) 利用 TCP Wrappers 限制
但是不同的 RPC 畢竟提供的服務(wù)不一樣,如果你想要針對(duì)某些服務(wù)來(lái)阻止的話,那可以透過(guò)TCP Wrappers這個(gè)根據(jù) program name來(lái)阻止網(wǎng)路包,還記得我們剛剛使用過(guò)rpcinfo這個(gè)指令,不是會(huì)輸出很多的RPC program name嗎?沒(méi)錯(cuò)!你可以這樣做:
# vi /etc/hosts.allow
# 讓來(lái)自 140.116.44.0/255.255.255.0 的主機(jī)可以使用 mountd
mountd: 140.116.44.0/255.255.255.0
# vi /etc/hosts.deny
# 讓所有人都不能使用 mountd
mountd: ALL
為什么使用的是mountd呢?去到前一小節(jié)的rpcinfo指令處看一下, 你就會(huì)知道為何需要使用到mountd。
c) 使用/etc/exports 設(shè)定更安全的權(quán)限
這就牽涉到您的邏輯思考了!怎么設(shè)置都沒(méi)有關(guān)系,但是在『便利』與『安全』之間,要找到您的平衡點(diǎn)。善用root_squash 及 all_squash 等功能,再利用anonuid等等的設(shè)定來(lái)規(guī)范登入您主機(jī)的使用者身份!應(yīng)該還是有辦法提供一個(gè)較為安全的NFS主機(jī)的!
另外,當(dāng)然啦,你的NFS服務(wù)器的文件系統(tǒng)之權(quán)限設(shè)定也需要很留意!不要隨便設(shè)定成為-rwxrwxrwx ,這樣會(huì)造成你的系統(tǒng)『很大的困擾』。
d) 更安全的 partition 規(guī)劃:
如果您的工作環(huán)境中,具有多部的 Linux 主機(jī),并且預(yù)計(jì)彼此共享出目錄時(shí),那么在安裝 Linux 的時(shí)候,最好就可以規(guī)劃出一塊 partition作為預(yù)留之用。因?yàn)椤篘FS可以針對(duì)目錄來(lái)分享』,因此,您可以將預(yù)留的partition掛載在任何一個(gè)掛載點(diǎn),再將該掛載點(diǎn) (就是目錄)由/etc/exports的設(shè)定中分享出去,那么整個(gè)工作環(huán)境中的其他Linux主機(jī)就可以使用該NFS主機(jī)的那塊預(yù)留的 partition。所以,在主機(jī)的規(guī)劃上面,主要需要留意的只有partition而已。此外,由于共享的partition可能較容易被入侵,最好可以針對(duì)該partition設(shè)定比較嚴(yán)格的參數(shù)在/etc/fstab當(dāng)中。
e) NFS服務(wù)器關(guān)機(jī)前的注意事項(xiàng):
需要注意的是,由于NFS使用的這個(gè)RPC在client端連上服務(wù)器時(shí),那么您的服務(wù)器想要關(guān)機(jī),那可就會(huì)成為『不可能的任務(wù)』!如果您的Server上面還有Client在連接,那么您要關(guān)機(jī),可能得要等到數(shù)個(gè)鐘頭才能夠正常的關(guān)機(jī)成功!真的假的?不相信嗎?不然您自已試試看!
所以,建議您的NFS Server想要關(guān)機(jī)之前,能先『關(guān)掉portmap與nfs』。如果無(wú)法正確的將這兩個(gè)daemons關(guān)掉,那么先以netstat -utlp找出PID ,然后以kill將他殺掉先,這樣才有辦法正常的關(guān)機(jī)成功。請(qǐng)?zhí)貏e的注意!
當(dāng)然,你也可以利用showmount -a localhost查出來(lái)那個(gè)客戶端還在連接,或者是查閱/var/lib/nfs/rmtab或xtab等文件來(lái)檢查亦可。找到這些客戶端后,可以直接call他們??!讓他們能夠幫幫忙先!
事實(shí)上,客戶端以NFS連接到服務(wù)器端時(shí),如果他們可以下達(dá)一些比較不那么『硬』的掛載參數(shù)時(shí),就能夠減少這方面的問(wèn)題。相關(guān)的安全性可以參考下一小節(jié)的客戶端可處理的掛載參數(shù)與開(kāi)機(jī)掛載。
4、NFS 客戶端的設(shè)定
既然NFS服務(wù)器最主要的工作就是共享文件系統(tǒng)給網(wǎng)路上其他的客戶端,所以客戶端當(dāng)然得要掛載這個(gè)玩意兒!此外,主機(jī)端可以加設(shè)防火墻來(lái)保護(hù)自己的文件系統(tǒng),那么客戶端掛載該文件系統(tǒng)后,難道不需要保護(hù)自己? 所以下面我們要來(lái)談一談幾個(gè)NFS客戶端。
4.1 遠(yuǎn)端NFS服務(wù)器的掛載
你要如何掛載NFS服務(wù)器所提供的文件系統(tǒng)?基本上,可以這樣做:
a) 確認(rèn)本地端已經(jīng)啟動(dòng)了portmap服務(wù)!
b) 查看NFS服務(wù)器共享的目錄有哪些,并了解我們是否可以使用(showmount);
c) 在本地端建立預(yù)計(jì)要掛載的掛載點(diǎn)目錄(mkdir);
d) 利用mount將遠(yuǎn)端主機(jī)直接掛載到相關(guān)目錄。
好,現(xiàn)在假設(shè)客戶端在192.168.0.100這部機(jī)器上,而服務(wù)器是192.168.0.2,那么趕緊來(lái)檢查一下我們是否已經(jīng)有portmap的啟動(dòng),另外遠(yuǎn)端主機(jī)有什么可用的目錄!
# /etc/init.d/portmap start
# /etc/init.d/nfslock start
# 一般來(lái)說(shuō),系統(tǒng)預(yù)設(shè)會(huì)啟動(dòng) portmap
# 另外,如果服務(wù)器端有啟動(dòng)nfslock的話,客戶端也要啟動(dòng)才能生效!
# 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
接下來(lái)我想要將遠(yuǎn)端主機(jī)的/home/public掛載到本地端主機(jī)的 /home/nfs/public,所以我就得要在本地端主機(jī)先建立起這個(gè)掛載點(diǎn)目錄才行??!然后就可以用mount這個(gè)命令直接掛載NFS的文件系統(tǒng)!
# mkdir -p /home/nfs/public
# mount -t nfs 192.168.0.2:/home/public /home/nfs/public
# 注意一下掛載的語(yǔ)法!『 -t nfs 』指定文件系統(tǒng)類型
# IP:/dir 則是指定某一部主機(jī)的某個(gè)提供的目錄!
# 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ù)與開(kāi)機(jī)掛載
如果你剛剛掛載到本機(jī)/home/nfs/public的文件系統(tǒng)當(dāng)中,含有一個(gè) script,且這個(gè)script的內(nèi)容為『 rm -rf / 』且該文件權(quán)限為555,如果你因?yàn)楹闷娼o它執(zhí)行下去,整個(gè)系統(tǒng)都會(huì)被刪掉!
所以說(shuō),除了NFS服務(wù)器需要保護(hù)之外,我們?nèi)∮萌思业腘FS文件系統(tǒng)也需要自我保護(hù)才行。 那要如何自我保護(hù)?。靠梢酝高^(guò)mount的指令參數(shù)!包括底下這些主要的參數(shù)可以嘗試加入:
suid、nosuid
如果掛載的partition上面有任何suid的binary程序時(shí),你只要使用nosuid就能夠取消SUID的功能。
系統(tǒng)預(yù)設(shè)值:suid
rw、ro
你可以指定該partition是只讀(ro)或可讀寫(xiě)。
系統(tǒng)預(yù)設(shè)值:rw
dev、nodev
是否可以保留裝置文件的特殊功能。一般來(lái)說(shuō)只有/dev才會(huì)有特殊的裝置,因此你可以選擇nodev。
系統(tǒng)預(yù)設(shè)值:dev
exec、noexec
是否具有執(zhí)行binary file的權(quán)限。如果你想要掛載的僅是資料區(qū)(例如/home),那么可以選擇noexec。
系統(tǒng)預(yù)設(shè)值:exec
user、nouser
是否允許使用者進(jìn)行文件的掛載與卸載功能。如果要保護(hù)文件系統(tǒng),最好不要提供使用者進(jìn)行掛載與卸載。
系統(tǒng)預(yù)設(shè)值:nouser
auto
noauto
這個(gè)auto指的是『mount -a』時(shí),會(huì)不會(huì)被掛載的項(xiàng)目。如果你不需要這個(gè)partition隨時(shí)被掛載,可以設(shè)定為noauto。
系統(tǒng)預(yù)設(shè)值:auto
一般來(lái)說(shuō),如果你的NFS服務(wù)器所提供的只是類似/home下面的個(gè)人資料,應(yīng)該不需要可執(zhí)行、SUID與裝置文件,因此當(dāng)你在掛載的時(shí)候,可以這樣掛載:
# 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)
這樣一來(lái)你所掛載的這個(gè)文件系統(tǒng)就只能作為文件存取之用,相對(duì)來(lái)說(shuō),對(duì)于客戶端是比較安全一些的。
關(guān)于NFS特殊的掛載參數(shù)
除了上述的mount參數(shù)之外,其實(shí)針對(duì)NFS服務(wù)器,Linux 還提供不少有用的額外參數(shù)。因?yàn)镹FS使用的是RPC服務(wù),這個(gè)RPC必須要客戶端與服務(wù)器端兩者都有啟動(dòng)RPC才能運(yùn)作。在一般的模式下面,你想要在客戶端掛載服務(wù)器端的NFS文件系統(tǒng)時(shí),一次命令只能掛載一次, 如果該次掛載由于某些問(wèn)題 (例如服務(wù)器未開(kāi)機(jī)、RPC忘記開(kāi)等等)導(dǎo)致無(wú)法順利掛載時(shí),你只能等到連接超時(shí)(time out)后,才能夠繼續(xù)工作。
另外,當(dāng)建立連接后,RPC會(huì)不斷的在客戶端與服務(wù)器兩者之間進(jìn)行呼叫,此時(shí)如果有一個(gè)主機(jī)失去連接,那么RPC將會(huì)持續(xù)不斷的呼叫,直到服務(wù)器或客戶端恢復(fù)連接為止。此一行為將導(dǎo)致RPC服務(wù)出現(xiàn)延遲問(wèn)題,結(jié)果常常就造成你在執(zhí)行df或者是mount等命令時(shí),出現(xiàn)『等等等等』的情況。
為了避免這些困擾,我們還有一些額外的NFS掛載參數(shù)可用。例如:
fg、bg
當(dāng)執(zhí)行掛載時(shí),該掛載的行為會(huì)在前臺(tái)(fg)還是在后臺(tái)(bg)執(zhí)行? 若在前臺(tái)執(zhí)行時(shí),則mount會(huì)持續(xù)嘗試掛載,直到成功或 time out 為止,若為后臺(tái)執(zhí)行,則mount會(huì)在后臺(tái)持續(xù)多次進(jìn)行mount,而不會(huì)影響到前臺(tái)的程序操作。如果你的網(wǎng)路連接有點(diǎn)不穩(wěn)定,或是服務(wù)器常常需要開(kāi)關(guān)機(jī),那建議使用bg比較妥當(dāng)。
預(yù)設(shè)參數(shù):fg
soft
hard
上面不是談到掛載時(shí)會(huì)使用RPC呼叫,如果是hard的情況,則當(dāng)兩者之間有任何一個(gè)主機(jī)離線,則RPC會(huì)持續(xù)的呼叫,直到對(duì)方恢復(fù)連接為止。 如果是soft的話,那RPC會(huì)在time out后『重復(fù)』呼叫,而非『持續(xù)』呼叫, 因此系統(tǒng)的延遲會(huì)比較不這么明顯。同上,如果你的服務(wù)器可能開(kāi)開(kāi)關(guān)關(guān),建議用soft
預(yù)設(shè)參數(shù): hard
intr
當(dāng)你使用上面提到的hard方式掛載時(shí),若加上intr這個(gè)參數(shù), 則當(dāng)RPC持續(xù)呼叫中,該次的呼叫是可以被中斷的 (interrupted)。
預(yù)設(shè)參數(shù):無(wú)
rsize
wsize
讀出(rsize)與寫(xiě)入(wsize)的區(qū)塊大小(block size)。這個(gè)設(shè)定值可以影響客戶端與服務(wù)器端傳輸資料的緩存記憶容量。一般來(lái)說(shuō),如果在局域網(wǎng)路內(nèi)(LAN),并且客戶端與服務(wù)器端都具有足夠的內(nèi)存,那這個(gè)值可以設(shè)置大一點(diǎn),比如說(shuō)8192 (bytes)等,提升緩存記憶區(qū)塊將可提升NFS文件系統(tǒng)的傳輸能力。但要注意設(shè)定的值也不要太大,最好是達(dá)到網(wǎng)路能夠傳輸?shù)淖畲笾禐橄?。舉例來(lái)說(shuō),如果你的MTU可達(dá)9000,那設(shè)定成 8192 才會(huì)有意義。
預(yù)設(shè)參數(shù):rsize=1024
wsize=1024
更多的參數(shù)可以參考 man nfs ,通常如果你的NFS是用在高速運(yùn)作的環(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這個(gè)服務(wù)器因?yàn)槟承┮蛩仉x線時(shí),你的NFS可以繼續(xù)在后臺(tái)中重復(fù)的呼叫!直到NFS服務(wù)器再度上線為止。這對(duì)于系統(tǒng)的持續(xù)操作還是有幫助的, rsize與wsize的大小則需要依據(jù)你的實(shí)際網(wǎng)路環(huán)境而定。
啟動(dòng)時(shí)自動(dòng)掛載NFS
修改客戶機(jī)的 /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 自動(dòng)掛載 autofs 的使用
在傳統(tǒng)的 NFS 文件系統(tǒng)的使用中,如果客戶端要使用服務(wù)器端所提供的NFS文件系統(tǒng)時(shí):
1、在 /etc/fstab 當(dāng)中設(shè)定開(kāi)機(jī)時(shí)掛載,
2、要手動(dòng)利用mount來(lái)掛載。 此外,客戶端得要預(yù)先手動(dòng)的建立好掛載點(diǎn)目錄。
不過(guò)有個(gè)小問(wèn)題,我們知道NFS服務(wù)器與客戶端的連接或許可能不會(huì)永遠(yuǎn)存在, 而RPC這個(gè)服務(wù),如果掛載了NFS服務(wù)器后,任何一方離線都可能造成另外一方老是在等待超時(shí)。
換個(gè)思考的角度:
可不可以讓客戶端在有使用到NFS文件系統(tǒng)的需求時(shí)才掛載?
并且不需要事先建立掛載點(diǎn)?
另外,當(dāng)NFS文件系統(tǒng)使用完畢后,可不可以讓NFS自動(dòng)卸載,以避免可能的 RPC 錯(cuò)誤?
在現(xiàn)在的Linux環(huán)境下采用autofs服務(wù)是可以達(dá)成。
autofs使用automount守護(hù)進(jìn)程來(lái)管理你的掛載點(diǎn),它只在文件系統(tǒng)被訪問(wèn)時(shí)才動(dòng)態(tài)地掛載它們。 autofs查詢主配置文件 /etc/auto.master來(lái)決定要定義哪些掛載點(diǎn)。然后,它使用適用于各個(gè)掛載點(diǎn)的參數(shù)來(lái)啟動(dòng)automount進(jìn)程。主配置中的每一行都定義一個(gè)掛載點(diǎn),然后用單獨(dú)的配置文件定義在該掛載點(diǎn)下要掛載的文件系統(tǒng)。
autofs可以預(yù)先定義好客戶端『預(yù)計(jì)掛載來(lái)自服務(wù)器端的上層目錄』,以及其相關(guān)的對(duì)應(yīng)NFS服務(wù)器共享目錄。至于在該目錄下面的對(duì)應(yīng)目錄則可以不需要額外設(shè)置。讓我們看看下面的圖示:
圖四、自動(dòng)掛載的設(shè)定檔內(nèi)容
如上圖所示,我們的autofs主要設(shè)定檔為 /etc/auto.master,這個(gè)文件的內(nèi)容很簡(jiǎn)單, 如上所示,我只要定義出最上層目錄 (/home/nfs) 即可,至于后續(xù)的文件則是該目錄底下各次目錄的對(duì)應(yīng)。 在etc/auto.nfs (這個(gè)文件的文件名可自定義) 里面則可以定義出每個(gè)次目錄所欲掛載的遠(yuǎn)端服務(wù)器目錄。 然后:『當(dāng)我們?cè)诳蛻舳艘褂?/home/nfs/public 的資料時(shí),此時(shí) autofs 才會(huì)去 192.168.0.2 掛載/home/public』且『當(dāng)隔了5分鐘沒(méi)有使用該目錄下的文件后,則/home/nfs/public 將會(huì)主動(dòng)的卸載』。
建立主要配置文件 /etc/auto.master
這個(gè)主要配置文件的內(nèi)容很簡(jiǎn)單,只要有預(yù)設(shè)目錄及『資料對(duì)應(yīng)文件』即可。 那個(gè)資料對(duì)應(yīng)文件的文件名是可以自行定義的,在這個(gè)例子當(dāng)中我使用 /etc/auto.nfs 來(lái)命名。
# vi /etc/auto.master
/home/nfs /etc/auto.nfs
# mkdir /home/nfs
# 注意!此時(shí) /home/nfs 內(nèi)并沒(méi)有其他的目錄存在
建立資料對(duì)應(yīng)文件內(nèi)的掛載資訊
剛剛我們所指定的/etc/auto.nfs是自行設(shè)定的,所以這個(gè)文件是不存在的。該文件的格式:
[本地端目錄](méi) [-掛載參數(shù)] [服務(wù)器所提供的目錄](méi)
參數(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ù)部分,只要最前面加個(gè) - 符號(hào)即可!
這樣就可以建立對(duì)應(yīng)了!要注意的是,那些 /home/nfs/public 是不需要事先建立的。(public目錄是由 automount 動(dòng)態(tài)地創(chuàng)建的,它不應(yīng)該在客戶機(jī)器上實(shí)際存在。)
實(shí)際運(yùn)作與觀察
配置文件配置好后,啟動(dòng)autofs
# /etc/init.d/autofs start
假設(shè)你目前并沒(méi)有掛載任何來(lái)自192.168.0.2這個(gè)NFS服務(wù)器的目錄, 讓我們實(shí)際來(lái)看看,如果我要進(jìn)入 /home/nfs/public 時(shí),文件系統(tǒng)會(huì)如何變化呢?
# mount; df
# 你不會(huì)看到任何跟192.168.0.2這個(gè)主機(jī)有關(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)沒(méi)錯(cuò)!
# pwd
/home/nfs/public
# 應(yīng)當(dāng)注意public目錄是由 automount 動(dòng)態(tài)地創(chuàng)建的,它不應(yīng)該在客戶機(jī)器上實(shí)際存在。
4.4 無(wú)法掛載的原因分析
使用者或客戶端身份權(quán)限不符:
以上面的例子來(lái)說(shuō)明,我的/home/test只能提供 192.168.0.0/24 這個(gè)網(wǎng)域,所以如果我在 192.168.0.2 這部服務(wù)器中,以 localhost (127.0.0.1) 來(lái)掛載時(shí),就會(huì)無(wú)法掛載上,這個(gè)權(quán)限概念沒(méi)問(wèn)題吧! 那么您可以試試看:
# mount -t nfs localhost:/home/test /home/nfs
mount: localhost:/home/test failed, reason given by server: Permission denied
服務(wù)器或客戶端某些服務(wù)未啟動(dòng):
如果您發(fā)現(xiàn)您的mount的訊息是這樣,說(shuō)明未啟動(dòng)portmap或服務(wù)器nfs這個(gè)服務(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
被防火墻阻擋
這個(gè)原因很多人都忽視了,在有嚴(yán)格要求的網(wǎng)絡(luò)環(huán)境中,我們一般會(huì)關(guān)閉linux上的所有端口,當(dāng)需要使用哪個(gè)端口的時(shí)候才會(huì)去打開(kāi)。而NFS默認(rèn)是使用111端口,所以我們先要檢測(cè)是否打開(kāi)了這個(gè)端口,另外也要檢查TCP_Wrappers的設(shè)定。
5、案例演練
假設(shè)環(huán)境:
假設(shè)我的 Linux 主機(jī)為 192.168.0.100 這一臺(tái);
預(yù)計(jì)將 /tmp 以可讀寫(xiě),并且不限制使用者身份的方式分享給所有 192.168.0.0/24 這個(gè)網(wǎng)域中的所有 Linux 工作站;
預(yù)計(jì)開(kāi)放 /home/nfs 這個(gè)目錄,使用的屬性為唯讀,可提供除了網(wǎng)域內(nèi)的工作站外,向外亦提供資料內(nèi)容;
預(yù)計(jì)開(kāi)放 /home/upload 做為 192.168.0.0/24 這個(gè)網(wǎng)域的資料上傳目錄,其中,這個(gè) /home/upload 的使用者及所屬群組為 nfs-upload 這個(gè)名字,他的 UID 與 GID 均為 210;
預(yù)計(jì)將 /home/andy 這個(gè)目錄僅分享給 192.168.0.50 這部 Linux 主機(jī),以提供該主機(jī)上面 andy 這個(gè)使用者來(lái)使用,也就是說(shuō), andy 在 192.168.0.50 及 192.168.0.100 均有賬號(hào),且賬號(hào)均為 andy ,所以預(yù)計(jì)開(kāi)放 /home/andy 給 andy 使用他的家目錄啦!
實(shí)地演練:
(1)、首先,就是要建立/etc/exports這個(gè)文件的內(nèi)容,您可以這樣寫(xiě):
# 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)、再來(lái),就是要建立每個(gè)對(duì)應(yīng)的目錄的實(shí)際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è)定成只讀!不能寫(xiě)入的狀態(tài),會(huì)更保險(xiǎn)一點(diǎn)!
c. /home/upload
# groupadd -g 210 nfs-upload
# useradd -g 210 -u 210 -M nfs-upload
# 先建立對(duì)應(yīng)的賬號(hào)與群組名稱及UID
# mkdir -p /home/upload
# chown -R nfs-upload:nfs-upload /home/upload
# 修改擁有者!如此,則使用者與目錄的權(quán)限都設(shè)定妥當(dāng)!
(3)、啟動(dòng) portmap 與 nfs 服務(wù):
# /etc/init.d/portmap start
# /etc/init.d/nfs start
# /etc/init.d/nfslock start
(4)、在 192.168.0.50 這部機(jī)器上面測(cè)試一下:
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. 建立掛載點(diǎn):
# mkdir -p /home/zzz/tmp
# mkdir -p /home/zzz/nfs
# mkdir -p /home/zzz/upload
# mkdir -p /home/zzz/andy
c. 實(shí)際掛載:
# 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
整個(gè)步驟大致上就是這樣。
6、參考資料
http://debian.linuxsir.org/doc/inthedebianway/nfs/
http://www.gd-linux.org/bbs/showthread.php?t=3902
http://fanqiang.chinaunix.net/a1/b1/20010607/110001424.html
http://linux.vbird.org/linux_server/0330nfs.php#What_NFS_NFS
http://x.discuz.net/65438/viewspace_19518.html
http://www.gbunix.com/htmldata/2004_07/1/3/article_159_1.html