全部博文(535)
分类: LINUX
2011-04-02 13:17:39
NFS 這個藉由網路分享檔案系統的服務在架設的時候是很簡單的,不過,它最大的問題在於『權限』方面的概念! 因為在用戶端與伺服器端可能必須要具備相同的帳號才能夠存取某些目錄或檔案。 另外,NFS 的啟動需要透過所謂的遠端程序呼叫 (RPC),也就是說,我們並不是只要啟動 NFS 就好了, 還需要啟動 RPC 這個服務才行啊!
因此,在開始進行 NFS 的設定之前,我們得先來瞭解一下,什麼是 NFS 呢?不然講了一堆也沒有用,對吧! ^_^!
底下就來談一談什麼是 NFS ,且 NFS 的啟動還需要什麼樣的協定啊!
NFS 就是 Network FileSystem 的縮寫,最早之前是由 這家公司所發展出來的 ()。 它最大的功能就是可以透過網路,讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 (share files)。所以,你也可以簡單的將他看做是一個檔案伺服器 (file server) 呢!這個 NFS 伺服器可以讓你的 PC 來將網路遠端的 NFS 伺服器分享的目錄,掛載到本地端的機器當中, 在本地端的機器看起來,那個遠端主機的目錄就好像是自己的一個磁碟分割槽一樣 (partition)!使用上面相當的便利!
就如同上面的圖示一般,當我們的 NFS 伺服器設定好了分享出來的 /home/sharefile 這個目錄後,其他的 NFS 用戶端就可以將這個目錄掛載到自己系統上面的某個掛載點 (掛載點可以自訂),例如前面圖示中的 NFS client 1 與 NFS client 2 掛載的目錄就不相同。我只要在 NFS client 1 系統中進入 /home/data/sharefile 內,就可以看到 NFS 伺服器系統內的 /home/sharefile 目錄下的所有資料了 (當然,權限要足夠啊!^_^)!這個 /home/data/sharefile 就好像 NFS client 1 自己機器裡面的一個 partition 喔!只要權限對了,那麼你可以使用 cp, cd, mv, rm... 等等磁碟或檔案相關的指令!真是他 X 的方便吶!
好的,既然 NFS 是透過網路來進行資料的傳輸,那麼經由 的概念你會知道 NFS 應該會使用一些埠口吧?那麼 NFS 使用哪個埠口來進行傳輸呢?基本上 NFS 這個服務的埠口開在 2049 ,但是由於檔案系統非常複雜,因此 NFS 還有其他的程序去啟動額外的埠口,但這些額外的埠口啟動的號碼是? 答案是....不知道! @_@ !因為預設 NFS 用來傳輸的埠口是隨機選擇小於 1024 以下的埠口來使用的。咦!那用戶端怎麼知道你伺服器端使用那個埠口啊?此時就得要 遠端程序呼叫 (Remote Procedure Call, RPC) 的協定來輔助啦!底下我們就來談談什麼是 RPC?
因為 NFS 支援的功能相當的多,而不同的功能都會使用不同的程式來啟動, 每啟動一個功能就會啟用一些埠口來傳輸資料,因此, NFS 的功能所對應的埠口才沒有固定住, 而是隨機取用一些未被使用的小於 1024 的埠口來作為傳輸之用。但如此一來又造成用戶端想要連上伺服器時的困擾, 因為用戶端得要知道伺服器端的相關埠口才能夠連線吧!
此時我們就得需要遠端程序呼叫 (RPC) 的服務啦!RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給用戶端,讓用戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當伺服器在啟動 NFS 時會隨機取用數個埠口,並主動的向 RPC 註冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然後 RPC 又是固定使用 port 111 來監聽用戶端的需求並回報用戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕鬆愉快了!
Tips: 所以你要注意,要啟動 NFS 之前,RPC 就要先啟動了,否則 NFS 會無法向 RPC 註冊。 另外,RPC 若重新啟動時,原本註冊的資料會不見,因此 RPC 重新啟動後,它管理的所有服務都需要重新啟動來重新向 RPC 註冊。 |
如上圖所示,當用戶端有 NFS 檔案存取需求時,他會如何向伺服器端要求資料呢?
由於 NFS 的各項功能都必須要向 RPC 來註冊,如此一來 RPC 才能瞭解 NFS 這個服務的各項功能之 port number, PID, NFS 在伺服器所監聽的 IP 等等,而用戶端才能夠透過 RPC 的詢問找到正確對應的埠口。 也就是說,NFS 必須要有 RPC 存在時才能成功的提供服務,因此我們稱 NFS 為 RPC server 的一種。事實上,有很多這樣的伺服器都是向 RPC 註冊的,舉例來說,NIS (Network Information Service) 也是 RPC server 的一種呢。此外,由圖 13.1-2 你也會知道,不論是用戶端還是伺服器端,要使用 NFS 時,兩者都需要啟動 RPC 才行喔!
更多的 NFS 相關協定資訊你可以參考底下網頁:
我們現在知道 NFS 伺服器在啟動的時候就得要向 RPC 註冊,所以 NFS 伺服器也被稱為 RPC server 之一。 那麼 NFS 伺服器主要的任務是進行檔案系統的分享,檔案系統的分享則與權限有關。 所以 NFS 伺服器啟動時至少需要兩個 daemons ,一個管理用戶端是否能夠登入的問題, 一個管理用戶端能夠取得的權限。如果你還想要管理 quota 的話,那麼 NFS 還得要再載入其他的 RPC 程式就是了。我們以較單純的 NFS 伺服器來說:
上述這幾個 RPC 所需要的程序,其實都已經寫入到兩個基本的服務啟動腳本中了,那就是 nfs 以及 nfslock 囉! 亦即是在 /etc/init.d/nfs, /etc/init.d/nfslock,與伺服器較有關的寫入在 nfs 服務中,而與用戶端的 rpc.lockd 之類的,就設定於 nfslock 服務中。
不知道你有沒有想過這個問題,在 的環境下,假如我在 NFS client 1 上面以 dmtsai 這個使用者身份想要去存取 /home/data/sharefile/ 這個來自 NFS server 所提供的檔案系統時, 請問 NFS server 所提供的檔案系統會讓我以什麼身份去存取?是 dmtsai 還是?
為什麼會這麼問呢?這是因為 NFS 本身的服務並沒有進行身份登入的識別, 所以說,當你在用戶端以 dmtsai 的身份想要存取伺服器端的檔案系統時, 伺服器端會以用戶端的使用者 UID 與 GID 等身份來嘗試讀取伺服器端的檔案系統。這時有個有趣的問題就產生啦! 那就是如果用戶端與伺服器端的使用者身份並不一致怎麼辦? 我們以底下這個圖示來說明一下好了:
當我以 dmtsai 這個一般身份使用者要去存取來自伺服器端的檔案時,你要先注意到的是: 檔案系統的 inode 所記錄的屬性為 UID, GID 而非帳號與群組名。 那一般 Linux 主機會主動的以自己的 /etc/passwd, /etc/group 來查詢對應的使用者、群組名稱。 所以當 dmtsai 進入到該目錄後,會參照 NFS client 1 的使用者與群組名稱。 但是由於該目錄的檔案主要來自 NFS server ,所以可能就會發現幾個情況:
總之,用戶端使用者能做的事情是與 UID 及其 GID 有關的,那當用戶端與伺服器端的 UID 及帳號的對應不一致時, 可能就會造成檔案系統使用上的困擾,這個就是 NFS 檔案系統在使用上面的一個很重要的地方! 而在瞭解使用者帳號與 UID 及檔案系統的關係之後,要實際在用戶端以 NFS 取用伺服器端的檔案系統時, 你還得需要具有:
當你滿足了 (1)使用者帳號,亦即 UID 的相關身份; (2)NFS 伺服器允許有寫入的權限; (3)檔案系統確實具有 w 的權限時,你才具有該檔案的可寫入權限喔! 尤其是身份 (UID) 確認的環節部分,最容易搞錯啦!也因為如此, 所以 NFS 通常需要與 這一個可以確認用戶端與伺服器端身份一致的服務搭配使用,以避免身份的錯亂啊! ^_^
Tips: 老實說,這個小節的資料比較難懂~尤其是剛剛接觸到 NFS server 的朋友。因此,你可以先略過 13.1.4 這個小節。 但是,在你讀完與做完本章後續所有的實作之後,記得回到這個小節來再查閱一次文章內容,相信會有進一步的認識的! |
既然要使用 NFS 的話,就得要安裝 NFS 所需要的軟體了!底下讓我們查詢一下系統有無安裝所需要的軟體,
NFS 軟體的架構以及如何設定 NFS 伺服器吧! ^_^
以 CentOS 5.x 為例的話,要設定好 NFS 伺服器我們必須要有兩個軟體才行,分別是:
好了,知道我們需要這兩個軟體之後,現在幹嘛?趕快去你的系統先用 RPM 看一下有沒有這兩個軟體啦! 沒有的話趕快用 RPM 或 yum 去安裝喔!不然就玩不下去了!
例題:
請問我的主機是以 RPM 為套件管理的 Linux distribution ,例如 Red Hat, CentOS 與
SuSE 等版本,那麼我要如何知道我的主機裡面是否已經安裝了 portmap 與 nfs 相關的軟體呢?
答:
簡單的使用『 rpm -qa | grep nfs 』與『 rpm -qa | grep portmap 』即可知道啦!如果沒有安裝的話,
在 CentOS 內可以使用『 yum install nfs-utils 』來安裝!
|
NFS 這個咚咚真的是很簡單,上面我們提到的 NFS 軟體中,設定檔只有一個,執行檔也不多, 記錄檔也三三兩兩而已吶!趕緊先來看一看吧! ^_^
就說不難吧!主要就是這幾個囉!
在開始 NFS 伺服器的設定之前,你必須要瞭解的是,NFS 會直接使用到核心功能,所以你的核心必須要有支援 NFS 才行。萬一如果你的核心版本小於 2.2 版,或者重新自行編譯過核心的話,那麼就得要很注意啦!因為你可能會忘記選擇 NFS 的核心支援啊!
還好,我們 CentOS 或者是其他版本的 Linux ,預設核心通常是支援 NFS 功能的,所以你只要確認你的核心版本是目前新的 2.6.x 版,並且使用你的 distribution 所提供的核心,那應該就不會有問題啦!
Tips: 上面會提醒您這個問題的原因是,以前鳥哥都很喜歡自行編譯一個特別的核心,但是某次編譯核心時,卻忘記加上了 NFS 的核心功能,結果 NFS server 無論如何也搞不起來~最後才想到原來俺的核心是非正規的... |
至於 NFS 伺服器的架設實在很簡單,你只要編輯好主要設定檔 /etc/exports 之後,先啟動 portmap (若已經啟動了,就不要重新啟動),然後再啟動 nfs ,你的 NFS 就成功了! 不過這樣的設定能否對用戶端生效?那就得要考慮你權限方面的設定能力了。廢話少說,我們就直接來看看那個 /etc/exports 應該如何設定吧!某些 distributions 並不會主動提供 /etc/exports 檔案,所以請你自行手動建立它吧。
[root@www ~]# vim /etc/exports |
你看看,這個設定檔有夠簡單吧!每一行最前面是要分享出來的目錄,注意喔!是以目錄為單位啊! 然後這個目錄可以依照不同的權限分享給不同的主機,像鳥哥上面的例子說明是: 要將 /tmp 分別分享給三個不同的主機或網域的意思。記得主機後面以小括號 () 設計權限參數, 若權限參數不止一個時,則以逗號 (,) 分開。且主機名與小括號是連在一起的喔!在這個檔案內也可以利用 # 來註解呢。
至於主機名稱的設定主要有幾個方式:
至於權限方面 (就是小括號內的參數) 常見的參數則有:
參數值 | 內容說明 |
rw ro | 該目錄分享的權限是可讀寫 (read-write) 或唯讀 (read-only),但最終能不能讀寫,還是與檔案系統的 rwx 及身份有關。 |
sync async | sync 代表資料會同步寫入到記憶體與硬碟中,async 則代表資料會先暫存於記憶體當中,而非直接寫入硬碟! |
no_root_squash root_squash | 用戶端使用 NFS 檔案系統的帳號若為 root 時,系統該如何判斷這個帳號的身份?預設的情況下,用戶端 root 的身份會由 root_squash 的設定壓縮成 nfsnobody, 如此對伺服器的系統會較有保障。但如果你想要開放用戶端使用 root 身份來操作伺服器的檔案系統,那麼這裡就得要開 no_root_squash 才行! |
all_squash | 不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名使用者,通常也就是 nobody(nfsnobody) 啦! |
anonuid anongid | anon 意指 anonymous (匿名者) 前面關於 *_squash 提到的匿名使用者的 UID 設定值,通常為 nobody(nfsnobody),但是你可以自行設定這個 UID 的值!當然,這個 UID 必需要存在於你的 /etc/passwd 當中! anonuid 指的是 UID 而 anongid 則是群組的 GID 囉。 |
這是幾個比較常見的權限參數,如果你有興趣玩其他的參數時,請自行 man exports 可以發現很多有趣的資料。 接下來我們利用上述的幾個參數來實際思考一下幾個有趣的小習題:
例題一:讓 root 保有 root 的權限
我想將 /tmp 分享出去給大家使用,由於這個目錄本來就是大家都可以讀寫的,因此想讓所有的人都可以存取。此外,我要讓 root
寫入的檔案還是具有 root 的權限,那如何設計設定檔?
答:
|
例題二:同一目錄針對不同範圍開放不同權限
我要將一個公共的目錄 /home/public 公開出去,但是只有限定我的區域網路內 192.168.100.0/24
這個網域可以讀寫,其他來源則只能讀取
答:
需要注意的是,萬用字元僅能用在主機名稱的分辨上面,IP 或網段就只能用 192.168.0.0/24 的狀況, 不可以使用 192.168.0.* 喔! |
例題三:僅給某個單一主機使用的目錄設定
我要將一個私人的目錄 /home/test 開放給 192.168.100.100 這個 Client 端的機器來使用時,該如何設定?
答:
|
例題四:開放匿名登入的情況
我要讓 *.centos.vbird 網域的主機,登入我的 NFS 主機時,可以存取 /home/linux ,但是他們存資料的時候,我希望他們的
UID 與 GID 都變成 40 這個身份的使用者,假設我 NFS 伺服器上的 UID 40 已經設定妥當
答:
|
上面四個案例的權限如果依照來思考的話,
那麼權限會是什麼情況呢?讓我們來檢查一下:
假設我在 192.168.100.100 登入這部 NFS (IP 假設為 192.168.100.254) 伺服器,並且我在 192.168.100.100 的帳號為 dmtsai 這個身份,同時,在這部 NFS 上面也有 dmtsai 這個帳號, 並具有相同的 UID ,果真如此的話,那麼:
假如我在 192.168.100.100 的身份為 vbird (uid 為 600),但是 192.168.100.254 這部 NFS 主機卻沒有 uid=600 的帳號時,情況會變成怎樣呢?
假如我在 192.168.100.100 的身份為 root 呢? root 這個帳號每個系統都會有呀!權限變成怎樣呢?
這樣的權限講解之後,你可以瞭解了嗎?這裡是最重要的地方,如果這一關通過了,底下的咚咚就沒有問題啦! ^_^! 在你將本文讀完後,最好還是回到好好的瞧一瞧, 才能解決 NFS 的問題喔!
設定檔搞定後,當然要開始來啟動才行啊!而前面我們也提到過,NFS 的啟動還需要 portmap 的協助才行啊! 所以趕緊來啟動吧!
[root@www ~]# /etc/init.d/portmap start |
那個 portmap 根本就不需要設定!只要直接啟動它就可以啦!啟動之後,會出現一個 port 111 的 sunrpc 的服務,那就是 portmap 啦!至於 nfs 則會啟動至少兩個以上的 daemon 出現!然後就開始在監聽 Client 端的需求啦!你必須要很注意螢幕上面的輸出資訊, 因為如果設定檔寫錯的話,螢幕上會顯示出錯誤的地方喔!
此外,如果你想要增加一些 NFS 伺服器的資料一致性功能時,可能需要用到 rpc.lockd 及 rpc.statd 等 RPC 服務, 那麼或許你可以增加一個服務,那就是 nfslock 囉!啟動之後,請趕快到 /var/log/messages 裡面看看有沒有被正確的啟動呢?
[root@www ~]# tail /var/log/messages |
在確認啟動沒有問題之後,接下來我們來瞧一瞧那麼 NFS 到底開了哪些埠口?
[root@www ~]# netstat -tulnp| grep -E '(rpc|portmap|nfs)' |
注意看到上面喔!總共產生了好多的 port 喔!真是可怕!不過主要的埠口是:
好了,那我怎麼知道每個 RPC 服務的註冊狀況?沒關係,你可以使用 rpcinfo 來觀察的。
[root@www ~]# rpcinfo -p [IP|hostname] |
仔細瞧瞧,上面出現的資訊當中除了程式名稱與埠口的對應可以與 netstat -tlunp 輸出的結果作比對之外,還需要注意到 NFS 的版本支援!新的 NFS 版本傳輸速度較快,由上表看起來,我們的 NFS 至少支援到第 4 版,應該還算合理啦! ^_^! 如果你的 rpcinfo 無法輸出,那就表示註冊的資料有問題啦!可能需要重新啟動 portmap 與 nfs 喔!
在你的 NFS 伺服器設定妥當之後,我們可以在 server 端先自我測試一下是否可以連線喔!就是利用 showmount 這個指令來查閱!
[root@www ~]# showmount [-ae] [hostname|IP] |
很簡單吧!所以,當你要掃瞄某一部主機他提供的 NFS 分享的目錄時,就使用 showmount -e IP (或hostname) 即可!非常的方便吧!這也是 NFS client 端最常用的指令喔! 另外, NFS 關於目錄權限設定的資料非常之多!在 /etc/exports 只是比較特別的權限參數而已,還有很多預設參數呢! 這些預設參數在哪?我們可以檢查一下 /var/lib/nfs/etab 就知道了!
[root@www ~]# tail /var/lib/nfs/etab |
上面僅僅是一個小範例,透過分析 anonuid=65534 對比 /etc/passwd 後,會發現 CentOS 出現的是 nfsnobody 啦!這個帳號在不同的版本都可能會不一樣的!另外,如果有其他用戶端掛載了你的 NFS 檔案系統時,那麼該用戶端與檔案系統資訊就會被記錄到 /var/lib/nfs/xtab 裡頭去的!
另外,如果你想要重新處理 /etc/exports 檔案,當重新設定完 /etc/exports 後需不需要重新啟動 nfs ? 不需要啦!如果重新啟動 nfs 的話,要得再向 RPC 註冊!很麻煩~這個時候我們可以透過 exportfs 這個指令來幫忙喔!
[root@www ~]# exportfs [-aruv] |
要熟悉一下這個指令的用法喔!這樣一來,就可以直接重新 exportfs 我們的記錄在 /etc/exports 的目錄資料囉!
在 NFS 的安全性上面,有些地方是你必須要知道的喔!底下我們分別來談一談:
一般來說, NFS 的服務僅會對內部網域開放,不會對網際網路開放的。然而,如果你有特殊需求的話, 那麼也可能會跨不同網域就是了。但是,NFS 的防火牆特別難搞,為什麼呢?因為除了固定的 port 111, 2049 之外, 還有很多不固定的埠口是由 rpc.mountd, rpc.rquotad 等服務所開啟的,所以,你的 iptables 就很難設定規則! 那怎辦?難道整個防火牆機制都要取消才可以?
為了解決這個問題, CentOS 5.x 有提供一個固定特定 NFS 服務的埠口設定檔,那就是 /etc/sysconfig/nfs 啦! 你在這個檔案裡面就能夠指定特定的埠口,這樣每次啟動 nfs 時,相關服務啟動的埠口就會固定,如此一來, 我們就能夠設定正確的防火牆囉!這個設定檔內容很多,絕大部分的資料你都不要去更改,只要改跟 PORT 這個關鍵字有關的資料即可。 那麼需要更改的 rpc 服務有哪些呢?主要有 mountd, rquotad, nlockmgr 這三個,所以你應該要這樣改:
[root@www ~]# vim /etc/sysconfig/nfs |
很可怕吧!如果想要開放 NFS 給別的網域的朋友使用,又不想要讓對方擁有其他服務的登入功能, 那你的防火牆就得要開放上述的十個埠口啦!有夠麻煩的~假設你想要開放 120.114.140.0/24 這個網域的人能夠使用你這部伺服器的 NFS 的資源,且假設你已經使用, 那麼你還得要這樣做才能夠針對該網域放行喔:
[root@www ~]# vim /usr/local/virus/iptables/iptables.allow |
這就牽涉到你的邏輯思考了!怎麼設定都沒有關係,但是在『便利』與『安全』之間,要找到你的平衡點吶!善用 root_squash 及 all_squash 等功能,再利用 anonuid 等等的設定來規範登入你主機的使用者身份!應該還是有辦法提供一個較為安全的 NFS 伺服器的!
另外,當然啦,你的 NFS 伺服器的檔案系統之權限設定也需要很留意!
不要隨便設定成為 -rwxrwxrwx ,這樣會造成你的系統『很大的困擾』的啊!
如果你的工作環境中,具有多部的 Linux 主機,並且預計彼此分享出目錄時,那麼在安裝 Linux 的時候,最好就可以規劃出一塊 partition 作為預留之用。因為『 NFS 可以針對目錄來分享』,因此,你可以將預留的 partition 掛載在任何一個掛載點,再將該掛載點 (就是目錄啦!)由 /etc/exports 的設定中分享出去,那麼整個工作環境中的其他 Linux 主機就可以使用該 NFS 伺服器的那塊預留的 partition 了!所以,在主機的規劃上面,主要需要留意的只有 partition 而已。此外,由於分享的 partition 可能較容易被入侵,最好可以針對該 partition 設定比較嚴格的參數在 /etc/fstab 當中喔!
此外,如果你的分割做的不夠好,舉例來說,很多人都喜歡使用懶人分割法,亦即整個系統中只有一個根目錄的 partition
而已。這樣做會有什麼問題呢?假設你分享的是 /home 這個給一般用戶的目錄好了,有些使用者覺得這個 NFS 的磁碟太好用了,
結果使用者就將他的一大堆暫存資料通通塞進這個 NFS 磁碟中。想一想,如果整個根目錄就因為這個 /home 被塞爆了,
那麼你的系統將會造成無法讀寫的困擾。因此,一個良好的分割規劃,或者是利用磁碟配額來限制還是很重要的工作。
需要注意的是,由於 NFS 使用的這個 RPC 服務,當用戶端連上伺服器時,那麼你的伺服器想要關機, 那可就會成為『不可能的任務』!如果你的伺服器上面還有用戶端在連線,那麼你要關機, 可能得要等到數個鐘頭才能夠正常的關機成功!嗄!真的假的!不相信嗎?不然你自個兒試試看!^_^!
所以囉,建議你的 NFS Server 想要關機之前,能先『關掉 portmap 與 nfs 』這兩個東西! 如果無法正確的將這兩個 daemons 關掉,那麼先以 netstat -utlp 找出 PID ,然後以 kill 將他關掉先!這樣才有辦法正常的關機成功喔!這個請特別特別的注意呢!
當然啦,你也可以利用 -a localhost 來查出來那個用戶端還在連線? 或者是查閱 /var/lib/nfs/rmtab 或 xtab 等檔案來檢查亦可。找到這些用戶端後, 可以直接 call 他們啊!讓他們能夠幫幫忙先! ^_^
事實上,用戶端以 NFS 連線到伺服器端時,如果他們可以下達一些比較不那麼『硬』的掛載參數時, 就能夠減少這方面的問題喔!相關的安全性可以參考下一小節的 。
既然 NFS 伺服器最主要的工作就是分享檔案系統給網路上其他的用戶端,所以用戶端當然得要掛載這個玩意兒囉!
此外,伺服器端可以加設防火牆來保護自己的檔案系統,那麼用戶端掛載該檔案系統後,難道不需要保護自己?
呵呵!所以底下我們要來談一談幾個 NFS 用戶端的課題。
你要如何掛載 NFS 伺服器所提供的檔案系統呢?基本上,可以這樣做:
好,現在假設用戶端在 192.168.100.100 這部機器上,而伺服器是 192.168.100.254 , 那麼趕緊來檢查一下我們是否已經有 portmap 的啟動,另外遠端主機有什麼可用的目錄呢!
# 1. 啟動必備的服務:若沒有啟動才啟動,有啟動則保持原樣不動。 |
接下來我想要將遠端主機的 /home/public 掛載到本地端主機的 /home/nfs/public , 所以我就得要在本地端主機先建立起這個掛載點目錄才行啊!然後就可以用 mount 這個指令直接掛載 NFS 的檔案系統囉!
# 3. 建立掛載點,並且實際掛載看看囉! |
先注意一下掛載 NFS 檔案的格式範例喔!呵呵!這樣就可以將資料掛載進來啦!請注意喔! 以後,只要你進入你的目錄 /home/nfs/public 就等於到了 192.168.100.254 那部遠端主機的 /home/public 那個目錄中囉!很不錯吧!至於你在該目錄下有什麼權限? 那就請你回去前一小節查一查權限的思考吧! ^_^ !那麼如何將掛載的 NFS 目錄卸載呢?就使用 umount 啊!
[root@client ~]# umount /home/nfs/public |
瞧!用戶端的掛載工作很簡單吧!不過不曉得你有沒有想過,如果你剛剛掛載到本機 /home/nfs/public 的檔案系統當中,含有一支 script ,且這支 script 的內容為『 rm -rf / 』且該檔案權限為 555 , 夭壽~如果你因為好奇給他執行下去,可有的你受的了~因為整個系統都會被殺光光!真可憐!
所以說,除了 NFS 伺服器需要保護之外,我們取用人家的 NFS 檔案系統也需要自我保護才行啊! 那要如何自我保護啊?可以透過 mount 的指令參數喔!包括底下這些主要的參數可以嘗試加入:
參數 | 參數代表意義 | 系統預設值 |
suid nosuid | 曉得啥是 SUID 吧?如果掛載的 partition 上面有任何 SUID 的 binary 程式時, 你只要使用 nosuid 就能夠取消 SUID 的功能了!嗄?不知道什麼是 SUID ?那就不要學人家架站嘛!@_@! 趕緊回去基礎學習篇第三版複習一下啦! | suid |
rw ro | 你可以指定該檔案系統是唯讀 (ro) 或可讀寫喔!伺服器可以提供給你可讀寫, 但是用戶端可以僅允許唯讀的參數設定值! | rw |
dev nodev | 是否可以保留裝置檔案的特殊功能?一般來說只有 /dev 這個目錄才會有特殊的裝置,因此你可以選擇 nodev 喔! | dev |
exec noexec | 是否具有執行 binary file 的權限? 如果你想要掛載的僅是資料區 (例如 /home),那麼可以選擇 noexec 啊! | exec |
user nouser | 是否允許使用者進行檔案的掛載與卸載功能? 如果要保護檔案系統,最好不要提供使用者進行掛載與卸載吧! | nouser |
auto noauto | 這個 auto 指的是『mount -a』時,會不會被掛載的項目。 如果你不需要這個 partition 隨時被掛載,可以設定為 noauto。 | auto |
一般來說,如果你的 NFS 伺服器所提供的只是類似 /home 底下的個人資料, 應該不需要可執行、SUID 與裝置檔案,因此當你在掛載的時候,可以這樣下達指令喔:
[root@client ~]# umount /home/nfs/public |
這樣一來你所掛載的這個檔案系統就只能作為資料存取之用,相對來說,對於用戶端是比較安全一些的。
所以說,這個 nosuid, noexec, nodev 等等的參數可得記得啊!
除了上述的 mount 參數之外,其實針對 NFS 伺服器,咱們的 Linux 還提供不少有用的額外參數喔!這些特殊參數還非常有用呢! 為什麼呢?舉例來說,由於檔案系統對 Linux 是非常重要的東西,因為我們進行任何動作時,只要有用到檔案系統, 那麼整個目錄樹系統就會主動的去查詢全部的掛載點。如果你的 NFS 伺服器與用戶端之間的連線因為網路問題, 或者是伺服器端先關機了,卻沒有通知用戶端,那麼用戶端只要動到檔案系統的指令 (例如 df, ls, cp 等等) ,整個系統就會慢到爆!因為你必須要等到檔案系統搜尋等待逾時後,系統才會饒了你!(鳥哥等過 df 指令 30 分鐘過...)
為了避免這些困擾,我們還有一些額外的 NFS 掛載參數可用!例如:
參數 | 參數功能 | 預設參數 |
fg bg | 當執行掛載時,該掛載的行為會在前景 (fg) 還是在背景 (bg) 執行? 若在前景執行時,則 mount 會持續嘗試掛載,直到成功或 time out 為止,若為背景執行, 則 mount 會在背景持續多次進行 mount ,而不會影響到前景的程序操作。 如果你的網路連線有點不穩定,或是伺服器常常需要開關機,那建議使用 bg 比較妥當。 | fg |
soft hard | 如果是 hard 的情況,則當兩者之間有任何一部主機離線,則 RPC 會持續的呼叫,直到對方恢復連線為止。如果是 soft 的話,那 RPC 會在 time out 後『重複』呼叫,而非『持續』呼叫, 因此系統的延遲會比較不這麼明顯。同上,如果你的伺服器可能開開關關,建議用 soft 喔! | hard |
intr | 當你使用上頭提到的 hard 方式掛載時,若加上 intr 這個參數, 則當 RPC 持續呼叫中,該次的呼叫是可以被中斷的 (interrupted)。 | 沒有 |
rsize wsize | 讀出(rsize)與寫入(wsize)的區塊大小 (block size)。 這個設定值可以影響用戶端與伺服器端傳輸資料的緩衝記憶容量。一般來說, 如果在區域網路內 (LAN) ,並且用戶端與伺服器端都具有足夠的記憶體,那這個值可以設定大一點, 比如說 32768 (bytes) 等,提升緩衝記憶區塊將可提升 NFS 檔案系統的傳輸能力! 但要注意設定的值也不要太大,最好是達到網路能夠傳輸的最大值為限。 | rsize=1024 wsize=1024 |
更多的參數可以參考 man nfs 的輸出資料喔! 通常如果你的 NFS 是用在高速運作的環境當中的話,那麼可以建議加上這些參數的說:
[root@client ~]# umount /home/nfs/public |
則當你的 192.168.100.254 這部伺服器因為某些因素而離線時,你的 NFS 可以繼續在背景當中重複的呼叫! 直到 NFS 伺服器再度上線為止。這對於系統的持續操作還是有幫助的啦! 當然啦,那個 rsize 與 wsize 的大小則需要依據你的實際網路環境而定喔!
Tips: 在鳥哥的實際案例中,某些大型的模式運算並不允許 soft 這個參數喔!舉例來說,鳥哥慣用的 CMAQ 空氣品質模式, 這個模式的叢集架構分享檔案系統中,就不允許使用 soft 參數!這點需要特別留意喔! |
我們知道開機就掛載的掛載點與相關參數是寫入 /etc/fstab 中的,那 NFS 能不能寫入 /etc/fstab 當中呢?非常可惜的是, 不可以呢!為啥呢?分析一下開機的流程,我們可以發現網路的啟動是在本機掛載之後,因此當你利用 /etc/fstab 嘗試掛載 NFS 時,系統由於尚未啟動網路,所以肯定是無法掛載成功的啦!那怎辦?簡單!就寫入 /etc/rc.d/rc.local 即可!
[root@client ~]# vim /etc/rc.d/rc.local |
如果用戶端就是無法掛載伺服器端所分享的目錄時,到底是發生什麼問題?你可以這樣分析看看:
以上面的例子來說明,我的 /home/test 只能提供 192.168.100.0/24 這個網域,所以如果我在 192.168.100.254 這部伺服器中,以 localhost (127.0.0.1) 來掛載時,就會無法掛載上,這個權限概念沒問題吧!不然你可以在伺服器上試試看:
[root@www ~]# mount -t nfs localhost:/home/test /mnt |
看到 Permission denied 了吧?沒錯啦~權限不符啦!如果確定你的 IP 沒有錯誤,那麼請通知伺服器端,
請管理員將你的 IP 加入 /etc/exports 這個檔案中。
這個最容易被忘記了!就是忘記了啟動 portmap 這個服務啦!如果你在用戶端發現 mount 的訊息是這樣:
[root@client ~]# mount -t nfs 192.168.100.254:/home/test /mnt |
要嘛就是 portmap 忘記開 (第一個錯誤),要嘛就是伺服器端的 nfs 忘記開。最麻煩的是,
重新啟動了 portmap 但是卻忘記重新啟動其他服務 (上述第二個錯誤)!解決的方法就是去重新啟動 portmap
管理的其他所有服務就是了!
由於 NFS 幾乎不對外開放,而內部網域又通常是全部的資源都放行,因此過去玩 NFS 的朋友 (包括鳥哥本人啦!) 都沒有注意過 NFS 的防火牆問題。最近這幾年鳥哥在管理電腦教室時,有掌管一部電腦教室主控防火牆, 為了擔心太厲害的學生給鳥哥亂搞,因此該 Linux 防火牆預設是僅放行部分資源而已。但由於電腦教室的區網內需要用到 Linux 的 NFS 資源,結果呢?竟然沒辦法放行啊!原來就是 iptables 沒有放行 NFS 所使用到的埠口~
所以,當你一直無法順利的連接 NFS 伺服器,請先到伺服器端,將用戶端的 IP 完全放行,若確定這樣就連的上, 那代表就是防火牆有問題啦!怎麼解決呢?上一小節介紹過了,參考將 NFS 伺服器埠口固定的方式吧!
在一般 NFS 檔案系統的使用情況中,如果用戶端要使用伺服器端所提供的 NFS 檔案系統時,要嘛就是得在
/etc/rc.d/rc.local 當中設定開機時掛載,要嘛就得要登入系統後手動利用 mount 來掛載。
此外,用戶端得要預先手動的建立好掛載點目錄,然後掛載上來。但是這樣的使用情況恐怕有點小問題。
我們知道 NFS 伺服器與用戶端的連線或許不會永遠存在,而 RPC 這個服務又挺討厭的,如果掛載了 NFS 伺服器後,任何一方離線都可能造成另外一方老是在等待逾時~而且,掛載的 NFS 檔案系統可能又不是常常被使用,但若不掛載的話,有時候緊急要使用時又得通知系統管理員, 這又很不方便...啊!好討厭的感覺啊~@_@
所以,讓我們換個思考的角度來討論一下使用 NFS 的情境:
如果能達到上述的功能,那就太完美啦!有沒有這東西呢?有的,在現在的 Linux 環境下這是可以達成的理想!用的就是
autofs 這個服務啦!
autofs 這個服務在用戶端電腦上面,會持續的偵測某個指定的目錄, 並預先設定當使用到該目錄下的某個次目錄時,將會取得來自伺服器端的 NFS 檔案系統資源,並進行自動掛載的動作。 講這樣或許你有點模糊,讓我們拿底下這個圖示來看看:
如上圖所示,我們的 autofs 主要設定檔為 /etc/auto.master,這個檔案的內容很簡單, 如上所示,我只要定義出最上層目錄 (/home/nfsfile) 即可,這個目錄就是 autofs 會一直持續偵測的目錄啦。 至於後續的檔案則是該目錄底下各次目錄的對應。在 /etc/auto.nfs (這個檔案的檔名可自訂) 裡面則可以定義出每個次目錄所欲掛載的遠端伺服器的 NFS 目錄資源!
舉例來說:『當我們在用戶端要使用 /home/nfsfile/public 的資料時,此時 autofs 才會去 192.168.100.254 伺服器上掛載 /home/public !』且『當隔了 5 分鐘沒有使用該目錄下的資料後,則用戶端系統將會主動的卸載 /home/nfsfile/public 』。
很不錯用的一個工具吧!因為有用到伺服器的資料時才自動掛載,沒有使用了就會自動卸載!
而不是傳統的情況一直是掛載的!既然這麼好用,那就讓我們實際來操演一下:
這個主要設定檔的內容很簡單,只要有要被持續偵測的目錄及『資料對應檔』即可。 那個資料對應檔的檔名是可以自行設定的,在鳥哥這個例子當中我使用 /etc/auto.nfs 來命名。
[root@client ~]# vim /etc/auto.master |
上述資料中比較需要注意的是,那個 /home/nfsfile 目錄不需要存在,因為 autofs 會主動的建立該目錄!
如果你建立了,可能反而會出問題~因此,先確定一下沒有該目錄吧!
剛剛我們所指定的 /etc/auto.nfs 是自行設定的,所以這個檔案是不存在的。那麼這個檔案的格式是如何呢?你可以這樣看:
[本地端次目錄] [-掛載參數] [伺服器所提供的目錄] |
這樣就可以建立對應了!要注意的是,那些 /home/nfsfile/public 是不需要事先建立的!
咱們的 autofs 會事情況來處理喔!好了,接下來讓我們看看如何實際運作吧!
設定檔設定妥當後,當然就是要啟動 autofs 啦!
[root@client ~]# /etc/init.d/autofs restart |
假設你目前並沒有掛載任何來自 192.168.100.254 這部 NFS 伺服器的資源目錄。好了, 那讓我們實際來觀察看看幾個重要的資料吧!先看看 /home/nfsfile 會不會主動的被建立? 然後,如果我要進入 /home/nfsfile/public 時,檔案系統會如何變化呢?
[root@client ~]# ll -d /home/nfsfile |
呵呵!真是好啊!如此一來,如果真的有需要用到該目錄時,系統才會去相對的伺服器上面掛載! 若是一陣子沒有使用,那麼該目錄就會被卸載呢!這樣就減少了很多不必要的使用時機啦!還不錯用吧! ^_^
讓我們來做個實際演練,在練習之前,請將伺服器的 NFS 設定資料都清除,但是保留 portmap 不可關閉。至於用戶端的環境下, 先關閉 autofs 以及取消之前在 /etc/rc.d/rc.local 裡面寫入的開機自動掛載項目。同時刪除 /home/nfs 目錄呦! 接下來請看看我們要處理的環境為何:
模擬的環境狀態中,伺服器端的想法如下:
伺服器端設定的實地演練:
好了,那麼請你先不要看底下的答案,先自己動筆或者直接在自己的機器上面動手作作看,等到得到你要的答案之後, 再看底下的說明吧!
[root@www ~]# vim /etc/exports |
# 1. /tmp |
[root@www ~]# /etc/init.d/nfs restart |
# 1. 確認遠端伺服器的可用目錄: |
整個步驟大致上就是這樣吶!加油喔!