NFS 伺服器
来源:互联网 发布:买家淘宝贷款怎么申请 编辑:程序博客网 时间:2024/04/29 16:44
2. NFS 的由來與其功能
2.1 什麼是 NFS ( Network FileSystem )
2.2 什麼是 RPC ( Remote Procedure Call )
2.3 NFS 啟動的 RPC daemons
2.4 NFS 的檔案存取權限
3. NFS Server 端的設定
3.1 所需要的套件
3.2 NFS 的套件結構
3.3 /etc/exports 設定檔的語法與參數
3.4 啟動 NFS: rpcinfo
3.5 NFS 的連線觀察: showmount, /var/lib/nfs/etab, exportfs
3.6 NFS 的安全性
4. NFS 用戶端的設定
4.1 遠端 NFS 伺服器的掛載
4.2 用戶端可處理的掛載參數與開機掛載
4.3 無法掛載的原因分析
4.4 自動掛載 autofs 的使用
5. 案例演練
6. 重點回顧
7. 課後練習
8. 參考資料
9. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?p=114695
本章的行前準備工作
NFS 的由來與其功能
什麼是 NFS (Network FileSystem)
圖一、NFS 主機分享目錄與 Client 掛載示意圖
就如同上面的圖示一般,當我們的 NFS Server 設定好了分享出來的 /home/sharefile 這個目錄後,其他的 NFS Client 端就可以將這個目錄掛載到自己系統上面的某個掛載點 (掛載點可以自訂),例如前面圖示中的 NFS client 1 與 NFS client 2 掛載的目錄就不相同。我只要在 NFS client 1 系統中進入 /home/data/sharefile 內,就可以看到 NFS Server 系統內的 /home/sharefile 目錄下的所有資料了 (當然,權限要足夠啊!^_^)!這個 /home/data/sharefile 就好像 NFS client 1 自己機器裡面的一個 partition 喔!只要權限對了,那麼您可以使用 cp, cd, mv, rm... 等等磁碟或檔案相關的指令!真是他X的方便吶!
好的,既然 NFS 是透過網路來進行資料的傳輸,那麼經由 socket pair 的概念你會知道 NFS 應該會使用一些 port 吧?那麼 NFS 使用哪個 port來進行傳輸呢?答案是....不知道! @_@ ! 因為 NFS 用來傳輸的 port 是隨機選擇小於 1024 以下的埠口來使用的。 咦!那用戶端怎麼知道你伺服器端使用那個 port 啊?此時就得要 遠端程序呼叫 (Remote Procedure Call, RPC) 的協定來輔助啦!底下我們就來談談什麼是 RPC?
什麼是 RPC (Remote Procedure Call)
此時我們就得需要遠端程序呼叫 (RPC) 的服務啦!RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給用戶端,讓用戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當伺服器在啟動 NFS 時會隨機取用數個埠口,並主動的向 RPC 註冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然後 RPC 又是固定使用 port 111 來監聽用戶端的需求並回報用戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕鬆愉快了!
所以你要注意,要啟動 NFS 之前,RPC 就要先啟動了,否則 NFS 會無法向 RPC 註冊。 另外,RPC 若重新啟動時,原本註冊的資料會不見,因此 RPC 重新啟動後,他管理的所有程式都需要重新啟動以重新向 RPC 註冊。
圖二、NFS 與 RPC 服務及檔案系統操作的相關性
如上圖所示,當用戶端有 NFS 檔案存取需求時,他會如何向伺服器端要求資料呢?
由於 NFS 的各項功能都必須要向 RPC 來註冊,如此一來 RPC 才能瞭解 NFS 這個服務的各項功能之 port number, PID, NFS 在主機所監聽的 IP 等等,而用戶端才能夠透過 RPC 的詢問找到正確對應的埠口。 也就是說,NFS 必須要有 RPC 存在時才能成功的提供服務, 因此我們稱 NFS 為 RPC server 的一種。事實上,有很多這樣的伺服器都是向 RPC 註冊的, 舉例來說,NIS (Network Information Service) 也是 RPC server 的一種呢。 此外,由圖二你也會知道,不論是用戶端還是伺服器端,要使用 NFS 時,兩者都需要啟動 RPC 才行喔!
更多的 NFS 相關協定資訊你可以參考底下網頁:
NFS 啟動的 RPC daemons
這個 daemon 主要的功能就是在管理 Client 是否能夠登入主機的權限啦,其中還包含這個登入者的 ID 的判別喔!
這個 daemon 主要的功能,則是在管理 NFS 的檔案系統哩!當 Client 端順利的通過 rpc.nfsd 而登入主機之後,在他可以使用 NFS 伺服器提供的檔案之前,還會經過檔案使用權限 (就是那個 -rwxrwxrwx 與 owner, group 那幾個權限啦) 的認證程序!他會去讀 NFS 的設定檔 /etc/exports 來比對 Client 的權限,當通過這一關之後 Client 就可以取得使用 NFS 檔案的權限啦! (註:這個也是我們用來管理 NFS 分享之目錄的使用權限與安全設定的地方哩!)
這個玩意兒可以用在管理檔案的鎖定 (lock) 用途。為何檔案需要『鎖定』呢? 因為既然分享的 NFS 檔案可以讓用戶端使用,那麼當多個用戶端同時嘗試寫入某個檔案時, 就可能對於該檔案造成一些問題啦!這個 rpc.lockd 則可以用來克服這個問題。 但 rpc.lockd 必須要同時在用戶端與伺服器端都開啟才行喔!此外, rpc.lockd 也常與 rpc.statd 同時啟用。
可以用來檢查檔案的一致性,與 rpc.lockd 有關!若發生因為用戶端同時使用同一檔案造成檔案可能有所損毀時, rpc.statd 可以用來檢測並嘗試回復該檔案。與 rpc.lockd 同樣的,這個功能必須要在伺服器端與用戶端都啟動才會生效。
NFS 的檔案存取權限
為什麼會這麼問呢?這是因為 NFS 本身的服務並沒有進行身份登入的識別, 所以說,當你在用戶端以 dmtsai 的身份想要存取伺服器端的檔案系統時, 伺服器端會以用戶端的使用者 UID 與 GID 等身份來嘗試讀取伺服器端的檔案系統。這時有個有趣的問題就產生啦! 那就是如果用戶端與伺服器端的使用者身份並不一致怎麼辦?
我們以底下這個圖示來說明一下好了:
圖三、NFS 的伺服器端與用戶端的使用者身份確認機制
當我以 dmtsai 這個一般身份使用者要去存取來自伺服器端的檔案時,你要先注意到的是: 檔案系統的 inode 所記錄的屬性為 UID, GID 而非帳號與群組名。 那一般 Linux 主機會主動的以自己的 /etc/passwd, /etc/group 來查詢對應的使用者、群組名稱。 所以當 dmtsai 進入到該目錄後,會參照 NFS client 1 的使用者與群組名稱。 但是由於該目錄的檔案主要來自 NFS server ,所以可能就會發現幾個情況:
總之,用戶端使用者能做的事情是與 UID 及其 GID 有關的,那當用戶端與伺服器端的 UID 及帳號的對應不一致時, 可能就會造成檔案系統使用上的困擾,這個就是 NFS 檔案系統在使用上面的一個很重要的地方! 而在瞭解使用者帳號與 UID 及檔案系統的關係之後,要實際在用戶端以 NFS 取用伺服器端的檔案系統時, 你還得需要具有:
則此時使用者可以直接以 dmtsai 的身份進行伺服器所提供的檔案系統之存取。
若 NFS 伺服器上的 /etc/passwd 裡面 UID 501 的使用者名稱為 vbird 時, 則用戶端的 dmtsai 可以存取伺服器端的 vbird 這個使用者的檔案喔!只因為兩者具有相同的 UID 而已。這就造成很大的問題了!因為沒有人可以保證用戶端的 UID 所對應的帳號會與伺服器端相同, 那伺服器所提供的資料不就可能會被錯誤的使用者亂改?
另一個極端的情況是,在伺服器端並沒有 501 這個 UID 的存在,則此時 dmtsai 的身份在該目錄下會被壓縮成匿名者, 一般 NFS 的匿名者會以 UID 為 65534 為其使用者,早期的 Linux distributions 這個 65534 的帳號名稱通常是 nobody ,我們的 CentOS 則取名為 nfsnobody 。
有個比較特殊的使用者,那就是每個 Linux 主機都有的 UID 為 0 的 root 。 想一想,如果用戶端可以用 root 的身份去存取伺服器端的檔案系統時,那伺服器端的資料哪有什麼保護性? 所以在預設的情況下, root 的身份會被主動的壓縮成為匿名者。
當你滿足了 (1)使用者帳號,亦即 UID 的相關身份; (2)NFS 伺服器允許有寫入的權限; (3)檔案系統確實具有 w 的權限時,你才具有該檔案的可寫入權限喔! 尤其是身份 (UID) 確認的環節部分,最容易搞錯啦!也因為如此, 所以 NFS 通常需要與 NIS 這一個可以確認用戶端與伺服器端身份一致的服務搭配使用,以避免身份的錯亂啊! ^_^
NFS Server 端的設定
所需要的套件
例題:
請問我的主機是以 RPM 為套件管理的 Linux distribution ,例如 Red Hat, CentOS 與 SuSE 等版本,那麼我要如何知道我的主機裡面是否已經安裝了 portmap 與 nfs 相關的套件呢?
答:簡單的使用 rpm -qa | grep nfs 與 rpm -qa | grep portmap 即可知道啦!如果沒有安裝的話, 在 CentOS 內可以使用『 yum install nfs-utils 』來安裝!
NFS 的套件結構
就說不難吧!主要就是這幾個囉!
這個檔案就是 NFS 的主要設定檔了!不過,系統並沒有預設值,所以這個檔案『 不一定會存在』,您可能必須要使用 vi 主動的建立起這個檔案喔!我們等一下要談的設定也僅只是這個檔案而已吶!
這個是維護 NFS 分享資源的指令,我們可以利用這個指令重新分享 /etc/exports 變更的目錄資源、將 NFS Server 分享的目錄卸載或重新分享等等,這個指令是 NFS 系統裡面相當重要的一個喔!至於指令的用法我們在底下會再介紹。
這是另一個重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 則主要用在 Client 端。這個 showmount 可以用來察看 NFS 分享出來的目錄資源喔!
在 NFS 伺服器的登錄檔都放置到 /var/lib/nfs/ 目錄裡面,在該目錄下有兩個比較重要的登錄檔, 一個是 etab ,主要記錄了 NFS 所分享出來的目錄的完整權限設定值;另一個 xtab 則記錄曾經連結到此 NFS 主機的相關用戶端資料。
/etc/exports 設定檔的語法與參數
還好,我們 CentOS 或者是其他版本的 Linux ,預設核心通常是支援 NFS 功能的, 所以你只要確認你的核心版本是目前新的 2.6.x 版,並且使用你的 distribution 所提供的核心, 那應該就不會有問題啦!
至於 NFS 伺服器的架設實在很簡單,你只要編輯好主要設定檔 /etc/exports 之後, 先啟動 portmap ,然後再啟動 nfs ,你的 NFS 就成功了! 不過這樣的設定能否對用戶端生效?那就得要考慮你權限方面的設定能力了。 廢話少說,我們就直接來看看那個 /etc/exports 應該如何設定吧! 某些 distributions 並不會主動提供 /etc/exports 檔案,所以請您自行手動建立他吧。[root@linux ~]# vi /etc/exports/tmp 192.168.1.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync)# [分享目錄] [第一部主機(權限)] [可用主機名] [可用萬用字元]
您看看,這個設定檔有夠簡單吧!每一行最前面是要分享出來的目錄,注意喔!是以目錄為單位啊! 然後這個目錄可以依照不同的權限分享給不同的主機,像鳥哥上面的例子說明是: 要將 /tmp 分別分享給三個不同的主機或網域的意思。記得主機後面以小括號 () 設計權限參數, 若權限參數不止一個時,則以逗號 (,) 分開。且主機名與小括號是連在一起的喔! 在這個檔案內也可以利用 # 來註解呢。
至於主機名稱的設定主要有幾個方式:
至於權限方面 (就是小括號內的參數) 常見的參數則有:
這是幾個比較常見的權限參數,如果你有興趣玩其他的參數時,請自行 man exports 可以發現很多有趣的資料。 接下來我們利用上述的幾個參數來實際思考一下幾個有趣的小習題:
登入 NFS 主機使用分享目錄的使用者,如果是 root 的話,那麼對於這個分享的目錄來說,他就具有 root 的權限! 這個項目『極不安全』,不建議使用!
在登入 NFS 主機使用分享之目錄的使用者如果是 root 時,那麼這個使用者的權限將被壓縮成為匿名使用者,通常他的 UID 與 GID 都會變成 nobody(nfsnobody) 那個系統帳號的身份;
不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名使用者,通常也就是 nobody(nfsnobody) 啦!
anon 意指 anonymous (匿名者) 前面關於 *_squash 提到的匿名使用者的 UID 設定值,通常為 nobody(nfsnobody),但是您可以自行設定這個 UID 的值!當然,這個 UID 必需要存在於您的 /etc/passwd 當中![root@linux ~]# vi /etc/exports# 任何人都可以用我的 /tmp ,用萬用字元來處理主機名稱,重點在 no_root_squash/tmp *(rw,no_root_squash)
參考前面的主機名稱設定說明,我們可以利用萬用字元的。這表示無論來自哪裡都可以使用我的 /tmp 這個目錄。 再次提醒,『 *(rw,no_root_squash) 』這一串設定值中間是沒有空白字元的喔!而 /tmp 與 *(rw,no_root_squash) 則是有空白字元來隔開的!特別注意到那個 no_root_squash 的功能!在這個例子中,如果你是用戶端,而且您是以 root 的身份登入您的 Linux 主機,那麼當您 mount 上我這部主機的 /tmp 之後,您在該 mount 的目錄當中,將具有『root 的權限!』 [root@linux ~]# vi /etc/exports/tmp *(rw,no_root_squash)/home/public 192.168.0.0/24(rw) *(ro)# 繼續累加在後面,注意,我有將主機與網域分為兩段 (用空白隔開) 喔!
上面的例子說的是,當我的 IP 是在 192.168.0.0/24 這個網段的時候,那麼當我在 Client 端掛載了 Server 端的 /home/public 後,針對這個被我掛載的目錄我就具有可以讀寫的權限~ 至於如果我不是在這個網段之內,那麼這個目錄的資料我就僅能讀取而已,亦即為唯讀的屬性啦!
需要注意的是,之前鳥哥將主機名稱的萬用字元與 IP 網段搞錯了! 萬用字元僅能用在主機名稱的分辨上面,IP 或網段就只能用 192.168.0.0/24 的狀況, 不可以使用 192.168.0.* 喔![root@linux ~]# vi /etc/exports/tmp *(rw,no_root_squash)/home/public 192.168.0.0/24(rw) *(ro)/home/test 192.168.0.100(rw)# 只要設定 IP 正確即可!
這樣就設定完成了!而且,只有 192.168.0.100 這部機器才能對 /home/test 這個目錄進行存取喔![root@linux ~]# vi /etc/exports/tmp *(rw,no_root_squash)/home/public 192.168.0.0/24(rw) *(ro)/home/test 192.168.0.100(rw)/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)# 如果要開放匿名,那麼重點是 all_squash,並且要配合 anonuid 喔!
特別注意到那個 all_squash 與 anonuid, anongid 的功能!如此一來,當 test.linux.org 登入這部 NFS 主機,並且在 /home/linux 寫入檔案時,該檔案的所有人與所有群組,就會變成 /etc/passwd 裡面對應的 UID 為 40 的那個身份的使用者了!
啟動 NFS[root@linux ~]# /etc/init.d/portmap start# 如果 portmap 本來就已經在執行了,那就不需要啟動啊![root@linux ~]# /etc/init.d/nfs start# 有時候可能會出現如下的警告訊息:exportfs: /etc/exports [3]: No 'sync' or 'async' option specified for export "192.168.0.100:/home/test". Assuming default behaviour ('sync').# 上面的警告訊息僅是在告知因為我們沒有指定 sync 或 async 的參數,# 則 NFS 將預設會使用 sync 的資訊而已。妳可以不理他,也可以加入 /etc/exports。[root@linux ~]# 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)[root@linux ~]# /etc/init.d/nfs restart
那個 portmap 根本就不需要設定!只要直接啟動他就可以啦!啟動之後,會出現一個 port 111 的 sunrpc 的服務,那就是 portmap 啦!至於 nfs 則會啟動至少兩個以上的 daemon 出現!然後就開始在監聽 Client 端的需求啦!你必須要很注意螢幕上面的輸出資訊, 因為如果設定檔寫錯的話,螢幕上會顯示出錯誤的地方喔!
此外,如果妳想要增加一些 NFS 伺服器的資料一致性功能時,可能需要用到 rpc.lockd 及 rpc.statd 等 RPC 服務, 那麼或許妳可以增加一個服務,那就是 nfslock[root@linux ~]# /etc/init.d/nfslock start
啟動之後,請趕快到 /var/log/messages 裡面看看有沒有被正確的啟動呢?[root@linux ~]# vi /var/log/messagesSep 22 00:01:37 linux nfs: Starting NFS services: succeededSep 22 00:01:37 linux nfs: rpc.rquotad startup succeededSep 22 00:01:37 linux nfsd[1050]: nfssvc_versbits: +2 +3 +4Sep 22 00:01:37 linux nfs: rpc.nfsd startup succeededSep 22 00:01:37 linux nfs: rpc.mountd startup succeededSep 22 00:01:37 linux rpcidmapd: rpc.idmapd -SIGHUP succeeded
在確認沒有問題之後,接下來我們來瞧一瞧那麼 NFS 到底開了哪些埠口?[root@linux ~]# netstat -ultnActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -tcp 0 0 0.0.0.0:803 0.0.0.0:* LISTEN 1047/rpc.rquotadtcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 32503/portmaptcp 0 0 0.0.0.0:819 0.0.0.0:* LISTEN 1064/rpc.mountdudp 0 0 0.0.0.0:2049 0.0.0.0:* -udp 0 0 0.0.0.0:800 0.0.0.0:* 1047/rpc.rquotadudp 0 0 0.0.0.0:816 0.0.0.0:* 1064/rpc.mountdudp 0 0 0.0.0.0:111 0.0.0.0:* 32503/portmap
注意看到上面喔!總共產生了好多的 port 喔!真是可怕!不過主要的埠口是:
好了,那我怎麼知道每個 RPC 服務的註冊狀況?沒關係,妳可以使用 rpcinfo 來處理的。[root@linux ~]# rpcinfo [-p] [IP|hostname]參數:-p :顯示出所有的 port 與 porgram 的資訊;範例一:顯示出目前這部主機的 RPC 狀態[root@linux ~]# 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版本 埠口 服務名稱
仔細瞧瞧,上面出現的資訊當中除了程式名稱與埠口的對應可以與 netstat -tlunp 輸出的結果作比對之外,還需要注意到 NFS 的版本支援!新的 NFS 版本傳輸速度較快, 由上表看起來,我們的 NFS 至少支援到第 3 版,應該還算合理啦! ^_^! 如果妳的 rpcinfo 無法輸出,那就表示註冊的資料有問題啦!可能需要重新啟動 portmap 與 nfs 喔!
NFS 的連線觀察[root@linux ~]# showmount [-ae] [hostname|IP]參數:-a :顯示目前主機與用戶端的 NFS 連線分享的狀態;-e :顯示某部主機的 /etc/exports 所分享的目錄資料。範例一:請顯示出剛剛我們所設定好的相關 exports 資訊[root@linux ~]# showmount -e localhostExport list for localhost:/tmp */home/linux *.linux.org/home/public (everyone)/home/test 192.168.0.100
很簡單吧!所以,當您要掃瞄某一部主機他提供的 NFS 分享的目錄時,就使用 showmount -e IP (或hostname) 即可!非常的方便吧!這也是 NFS client 端最常用的指令喔!
事實上 NFS 關於目錄權限設定的資料非常之多!我們可以檢查一下 /var/lib/nfs/etab 就知道了![root@linux ~]# tail /var/lib/nfs/etab/home/public *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)# 上面是同一行,可以看出除了 ro, sync, root_squash 等等,# 其實還有 anonuid 及 anongid 等等的設定!/tmp *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)# 同樣的,在 /tmp 也有很多的權限相關的參數喔!
上面僅僅是一個小範例,只是....怎麼 anonuid 會是 -2 啊? 其實那個數值是 65536-2 啦!所以得到 65534 ,比對 /etc/passwd , 會發現 CentOS 出現的是 nfsnobody 啦!這個帳號在不同的版本都可能會不一樣的! 另外,如果有其他用戶端掛載了妳的 NFS 檔案系統時, 那麼該用戶端與檔案系統資訊就會被記錄到 /var/lib/nfs/xtab 裡頭去的!
另外,如果妳想要重新處理 /etc/exports 檔案,當重新設定完 /etc/exports 後需不需要重新啟動 nfs ? 不需要啦!如果重新啟動 nfs 的話,要得要向 RPC 註冊!很麻煩~ 這個時候我們可以透過 exportfs 這個指令來幫忙喔![root@linux ~]# exportfs [-aruv]參數:-a :全部掛載(或卸載) /etc/exports 檔案內的設定-r :重新掛載 /etc/exports 裡面的設定,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的內容!-u :卸載某一目錄-v :在 export 的時候,將分享的目錄顯示到螢幕上!範例一:重新掛載一次 /etc/exports 的設定[root@linux ~]# exportfs -arvexporting 192.168.0.100:/home/testexporting 192.168.0.0/24:/home/publicexporting *.linux.org:/home/linuxexporting *:/home/publicexporting *:/tmp範例二:全部都卸載[root@linux ~]# exportfs -auv
要熟悉一下這個指令的用法喔!這樣一來,就可以直接重新 exportfs 我們的記錄在 /etc/exports 的目錄資料囉!
NFS 的安全性[root@linux ~]# vi /usr/local/virus/iptables/iptables.allowiptables -A INPUT -i $EXTIF -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPTiptables -A INPUT -i $EXTIF -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPTiptables -A INPUT -i $EXTIF -p TCP -s 140.116.0.0/16 --dport 111 -j ACCEPTiptables -A INPUT -i $EXTIF -p UDP -s 140.116.0.0/16 --dport 111 -j ACCEPT
這樣大致上就可以讓 192.168.0.0/24 這個 C Class 的網域與 140.116.0.0/16 這個 B Class 的網域到您的主機裡面來,而其他的連線就視您的原本的 iptables 的狀態而定喔!
那為什麼是限制 port 111 而不是每個 RPC server 所開啟的埠口呢? 因為 RPC server 所開啟的埠口都是隨機產生的,要對他開放實在是... 而且用戶端想要連上 NFS 伺服器之前,都是透過 port 111 來向 NFS 伺服器詢問連線的埠口的, 所以當然先就 port 111 來進行限制囉!^_^[root@linux ~]# vi /etc/hosts.allow# 讓來自 140.116.44.0/255.255.255.0 的主機可以使用 mountdmountd: 140.116.44.0/255.255.255.0[root@linux ~]# vi /etc/hosts.deny# 讓所有人都不能使用 mountdmountd: ALL
為什麼使用的是 mountd 呢?去到前一小節的 rpcinfo 指令處瞧一瞧, 妳就會知道為何需要使用到 mountd 囉!^_^
另外,當然啦,妳的 NFS 伺服器的檔案系統之權限設定也需要很留意! 不要隨便設定成為 -rwxrwxrwx ,這樣會造成你的系統『很大的困擾』的啊!
所以囉,建議您的 NFS Server 想要關機之前,能先『關掉 portmap 與 nfs 』這兩個東西! 如果無法正確的將這兩個 daemons 關掉,那麼先以 netstat -utlp 找出 PID ,然後以 kill 將他關掉先!這樣才有辦法正常的關機成功喔!這個請特別特別的注意呢!
當然啦,妳也可以利用 showmount -a localhost 來查出來那個用戶端還在連線? 或者是查閱 /var/lib/nfs/rmtab 或 xtab 等檔案來檢查亦可。找到這些用戶端後, 可以直接 call 他們啊!讓他們能夠幫幫忙先! ^_^
事實上,用戶端以 NFS 連線到伺服器端時,如果他們可以下達一些比較不那麼『硬』的掛載參數時, 就能夠減少這方面的問題喔!相關的安全性可以參考下一小節的 用戶端可處理的掛載參數與開機掛載。
NFS 用戶端的設定
遠端 NFS 伺服器的掛載
好,現在假設用戶端在 192.168.0.100 這部機器上,而伺服器是 192.168.0.2 , 那麼趕緊來檢查一下我們是否已經有 portmap 的啟動,另外遠端主機有什麼可用的目錄呢![root@linux ~]# /etc/init.d/portmap start[root@linux ~]# /etc/init.d/nfslock start# 一般來說,系統預設會啟動 portmap ,不過鳥哥之前關閉過,所以要啟動。# 另外,如果伺服器端有啟動 nfslock 的話,用戶端也要啟動才能生效![root@linux ~]# showmount -e 192.168.0.2Export list for 192.168.0.2:/tmp */home/linux *.linux.org/home/public (everyone) <==這是等一下我們要掛載的目錄/home/test 192.168.0.100
接下來我想要將遠端主機的 /home/public 掛載到本地端主機的 /home/nfs/public , 所以我就得要在本地端主機先建立起這個掛載點目錄才行啊!然後就可以用 mount 這個指令直接掛載 NFS 的檔案系統囉![root@linux ~]# mkdir -p /home/nfs/public[root@linux ~]# mount -t nfs 192.168.0.2:/home/public /home/nfs/public# 注意一下掛載的語法!『 -t nfs 』指定檔案系統類型,# IP:/dir 則是指定某一部主機的某個提供的目錄![root@linux ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on....中間省略....192.168.0.2:/home/public 10080512 2135072 7433344 23% /home/nfs/public
先注意一下掛載 NFS 檔案的格式範例喔!呵呵!這樣就可以將資料掛載進來啦!請注意喔! 以後,只要您進入您的目錄 /home/nfs/public 就等於到了 192.168.0.2 那部遠端主機的 /home/public 那個目錄中囉!很不錯吧!至於你在該目錄下有什麼權限? 那就請您回去前一小節查一查權限的思考吧! ^_^ !那麼如何將掛載的 NFS 目錄卸載呢?就使用 umount 啊![root@linux ~]# umount /home/nfs/public
用戶端可處理的掛載參數與開機掛載
所以說,除了 NFS 伺服器需要保護之外,我們取用人家的 NFS 檔案系統也需要自我保護才行啊! 那要如何自我保護啊?可以透過 mount 的指令參數喔!包括底下這些主要的參數可以嘗試加入:
參數參數代表意義系統預設值suid
nosuid曉得啥是 SUID 吧?如果掛載的 partition 上面有任何 SUID 的 binary 程式時, 你只要使用 nosuid 就能夠取消 SUID 的功能了!嗄?不知道什麼是 SUID ?那就不要學人家架站嘛!@_@! 趕緊回去基礎學習篇複習一下程序與資源管理啦!suidrw
ro你可以指定該 partition 是唯讀 (ro) 或可讀寫喔!rwdev
nodev是否可以保留裝置檔案的特殊功能?一般來說只有 /dev 才會有特殊的裝置,因此你可以選擇 nodev 喔!devexec
noexec是否具有執行 binary file 的權限? 如果你想要掛載的僅是資料區 (例如 /home),那麼可以選擇 noexec 啊!execuser
nouser是否允許使用者進行檔案的掛載與卸載功能? 如果要保護檔案系統,最好不要提供使用者進行掛載與卸載吧!nouserauto
noauto這個 auto 指的是『mount -a』時,會不會被掛載的項目。 如果你不需要這個 partition 隨時被掛載,可以設定為 noauto。auto
一般來說,如果你的 NFS 伺服器所提供的只是類似 /home 底下的個人資料, 應該不需要可執行、SUID 與裝置檔案,因此當你在掛載的時候,可以這樣下達指令喔:[root@linux ~]# mount -t nfs -o nosuid,noexec,nodev,rw /> 192.168.0.2:/home/public /home/nfs/public[root@linux ~]# mount192.168.0.2:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,addr=192.168.0.2)
這樣一來你所掛載的這個檔案系統就只能作為資料存取之用,相對來說,對於用戶端是比較安全一些的。 所以說,這個 nosuid, noexec, nodev 等等的參數可得記得啊!
另外,當建立連線後,RPC 會不斷的在用戶端與伺服器兩者之間進行呼叫, 此時如果有一部主機失去連線,那麼 RPC 將會持續不斷的呼叫,直到伺服器或用戶端恢復連線為止。 此一行為將導致 RPC 服務出現延遲問題, 結果常常就造成你在執行 df 或者是 mount 等指令時,出現『等等等等』的情況~ 這....真是要命!
為了避免這些困擾,我們還有一些額外的 NFS 掛載參數可用!例如:
參數參數功能預設參數fg
bg當執行掛載時,該掛載的行為會在前景 (fg) 還是在背景 (bg) 執行? 若在前景執行時,則 mount 會持續嘗試掛載,直到成功或 time out 為止,若為背景執行, 則 mount 會在背景持續多次進行 mount ,而不會影響到前景的程序操作。 如果你的網路連線有點不穩定,或是伺服器常常需要開關機,那建議使用 bg 比較妥當。fgsoft
hard上頭不是談到掛載時會使用 RPC 呼叫嗎? 如果是 hard 的情況,則當兩者之間有任何一部主機離線,則 RPC 會持續的呼叫,直到對方恢復連線為止。 如果是 soft 的話,那 RPC 會在 time out 後『重複』呼叫,而非『持續』呼叫, 因此系統的延遲會比較不這麼明顯。同上,如果你的伺服器可能開開關關,建議用 soft 喔!hardintr當你使用上頭提到的 hard 方式掛載時,若加上 intr 這個參數, 則當 RPC 持續呼叫中,該次的呼叫是可以被中斷的 (interrupted)。沒有rsize
wsize讀出(rsize)與寫入(wsize)的區塊大小 (block size)。 這個設定值可以影響用戶端與伺服器端傳輸資料的緩衝記憶容量。一般來說, 如果在區域網路內 (LAN) ,並且用戶端與伺服器端都具有足夠的記憶體,那這個值可以設定大一點, 比如說 32768 (bytes) 等,提升緩衝記憶區塊將可提升 NFS 檔案系統的傳輸能力! 但要注意設定的值也不要太大,最好是達到網路能夠傳輸的最大值為限。rsize=1024
wsize=1024
更多的參數可以參考 man nfs 的輸出資料喔! 通常如果你的 NFS 是用在高速運作的環境當中的話,那麼可以建議加上這些參數的說:[root@linux ~]# mount -t nfs -o nosuid,noexec,nodev,rw /> bg,soft,rsize=32768,wsize=32768 /> 192.168.0.2:/home/public /home/nfs/public
則當你的 192.168.0.2 這部伺服器因為某些因素而離線時,你的 NFS 可以繼續在背景當中重複的呼叫! 直到 NFS 伺服器再度上線為止。這對於系統的持續操作還是有幫助的啦! 當然啦,那個 rsize 與 wsize 的大小則需要依據你的實際網路環境而定喔![root@linux ~]# vi /etc/fstab192.168.0.2:/home/public /home/nfs/public nfs nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 0 0# 注意!上面的設定是同一行喔!不要搞錯囉! ^_^
無法掛載的原因分析
以上面的例子來說明,我的 /home/test 只能提供 192.168.0.0/24 這個網域,所以如果我在 192.168.0.2 這部伺服器中,以 localhost (127.0.0.1) 來掛載時,就會無法掛載上,這個權限概念沒問題吧! 那麼您可以試試看:[root@linux ~]# mount -t nfs localhost:/home/test /home/nfsmount: localhost:/home/test failed, reason given by server: Permission denied
看到 Permission denied 了吧?沒錯啦~權限不符啦!如果確定您的 IP 沒有錯誤,那麼請通知伺服器端, 請管理員將你的 IP 加入 /etc/exports 這個檔案中。
這個最容易被忘記了!就是忘記了啟動 portmap 這個服務啦!如果您發現您的 mount 的訊息是這樣:[root@linux ~]# mount -t nfs localhost:/home/test /home/nfsmount: RPC: Port mapper failure - RPC: Unable to receive[root@linux ~]# mount -t nfs localhost:/home/test /home/nfsmount: RPC: Program not registered
要嘛就是 portmap 忘記開,要嘛就是伺服器端的 nfs 忘記開!解決的方法就是去啟動這兩個咚咚啦!
這個也很容易忘記了!那就是重新設定一下您的防火牆,這包含了兩部份,包括 iptables 與 TCP_Wrappers !因為我們啟動了 portmap ,這個東西有兩個資料需要分享出來,一個是 port 111 需要提供出去,因此您的 iptables 規則當中,需要開放這個 port 喔!
自動掛載 autofs 的使用
不過有個小問題,我們知道 NFS 伺服器與用戶端的連線或許可能不會永遠存在, 而 RPC 這個服務又挺討厭的,如果掛載了 NFS 伺服器後,任何一方離線都可能造成另外一方老是在等待逾時~ 而且,掛載的 NFS 檔案系統可能又不是常常被使用,但若不掛載的話,有時候要使用又得通知系統管理員, 這又很不方便....啊!好討厭的感覺啊~@_@
換個思考的角度:
呵呵!好主意!在現在的 Linux 環境下這是可以達成的理想!用的就是 autofs 這個服務啦!
autofs 可以預先定義好用戶端『預計掛載來自伺服器端的上層目錄』,以及其相關的對應 NFS 伺服器分享目錄。 至於在該目錄底下的對應目錄則可以不需要額外設定。講這樣或許妳有點模糊,讓我們拿底下這個圖示來看看:
圖四、自動掛載的設定檔內容
如上圖所示,我們的 autofs 主要設定檔為 /etc/auto.master,這個檔案的內容很簡單, 如上所示,我只要定義出最上層目錄 (/home/nfs) 即可,至於後續的檔案則是該目錄底下各次目錄的對應。 在 /etc/auto.nfs (這個檔案的檔名可自訂) 裡面則可以定義出每個次目錄所欲掛載的遠端伺服器目錄! 然後:『當我們在用戶端要使用 /home/nfs/public 的資料時,此時 autofs 才會去 192.168.0.2 掛載 /home/public !』且『當隔了 5 分鐘沒有使用該目錄下的資料後, 則 /home/nfs/public 將會主動的卸載』。
很不錯用的一個工具吧!那就讓我們在用戶端來玩一玩吧![root@linux ~]# vi /etc/auto.master/home/nfs /etc/auto.nfs[root@linux ~]# mkdir /home/nfs# 注意!此時 /home/nfs 內並沒有其他的目錄存在喔!
[本地端目錄] [-掛載參數] [伺服器所提供的目錄]參數:[本地端目錄] :指的就是在 /etc/auto.master 內指定的目錄之次目錄[-掛載參數] :就是前一小節提到的 rw,bg,soft 等等的參數啦!可有可無;[伺服器所提供的目錄] :例如 192.168.0.2:/home/public 等[root@linux ~]# vi /etc/auto.nfspublic -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.2:/home/publictesting -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.2:/home/testtemp -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.2:/tmp# 參數部分,只要最前面加個 - 符號即可!
這樣就可以建立對應了!要注意的是,那些 /home/nfs/public 是不需要事先建立的! 咱們的 autofs 會事情況來處理喔!好了,接下來讓我們看看如何實際運作吧![root@linux ~]# /etc/init.d/autofs start
假設妳目前並沒有掛載任何來自 192.168.0.2 這部 NFS 伺服器的目錄,好了, 讓我們實際來觀察看看,如果我要進入 /home/nfs/public 時,檔案系統會如何變化呢?[root@linux ~]# mount; df# 妳不會看到任何跟 192.168.0.2 這部主機有關的 NFS 掛載資訊喔![root@linux ~]# cd /home/nfs/public[root@linux public]# mount; df192.168.0.2:/home/public on /home/nfs/public type nfs (rw,bg,soft,rsize=32768,wsize=32768,addr=140.116.44.179)# 上面的輸出是同一行!瞧!突然出現這個玩意兒!Filesystem 1K-blocks Used Available Use% Mounted on192.168.0.2:/home/public 10080488 2144288 7424136 23% /home/nfs/public# 檔案的掛載也出現沒錯![root@linux public]# pwd/home/nfs/public# 這個目錄突然被生出來了! ^_^
呵呵!真是好啊!如此一來,如果真的有需要用到該目錄時,系統才會去相對的伺服器上面掛載! 若是一陣子沒有使用,那麼該目錄就會被卸載呢!這樣就減少了很多不必要的使用時機啦! 還不錯用吧! ^_^
案例演練
實地演練:
好了,那麼請您先不要看底下的答案,先自己動筆或者直接在自己的機器上面動手作作看,等到得到您要的答案之後, 再看底下的說明吧!
整個步驟大致上就是這樣吶!加油喔![root@linux ~]# vi /etc/exports/tmp 192.168.0.0/24(rw,no_root_squash)/home/nfs 192.168.0.0/24(ro) *(ro,all_squash)/home/upload 192.168.0.0/24(rw,all_squash,anonuid=210,anongid=210)/home/andy 192.168.0.50(rw)
1. /tmp[root@linux ~]# ll -d /tmpdrwxrwxrwt 5 root root 20480 Sep 22 22:52 /tmp2. /home/nfs[root@linux ~]# mkdir -p /home/nfs[root@linux ~]# chmod 755 -R /home/nfs# 修改較為嚴格的檔案權限將目錄與檔案設定成唯讀!不能寫入的狀態,會更保險一點!3. /home/upload[root@linux ~]# groupadd -g 210 nfs-upload[root@linux ~]# useradd -g 210 -u 210 -M nfs-upload# 先建立對應的帳號與群組名稱及 UID 喔![root@linux ~]# mkdir -p /home/upload[root@linux ~]# chown -R nfs-upload:nfs-upload /home/upload# 修改擁有者!如此,則使用者與目錄的權限都設定妥當囉!4. /home/andy[root@linux ~]# ll -d /home/andydrwx------ 3 andy andy 4096 Oct 28 13:37 andy
這樣子一來,權限的問題大概就可以解決囉![root@linux ~]# /etc/init.d/portmap start[root@linux ~]# /etc/init.d/nfs start[root@linux ~]# /etc/init.d/nfslock start
1. 確認遠端伺服器的可用目錄:[root@linux ~]# /etc/init.d/portmap start[root@linux ~]# /etc/init.d/nfslock start[root@linux ~]# showmount -e 192.168.0.100Export list for 192.168.0.100:/tmp 192.168.0.*/home/nfs (everyone)/home/upload 192.168.0.*/home/andy 192.168.0.502. 建立掛載點:[root@linux ~]# mkdir -p /home/zzz/tmp[root@linux ~]# mkdir -p /home/zzz/nfs[root@linux ~]# mkdir -p /home/zzz/upload[root@linux ~]# mkdir -p /home/zzz/andy3. 實際掛載:[root@linux ~]# mount -t nfs 192.168.0.100:/tmp /home/zzz/tmp[root@linux ~]# mount -t nfs 192.168.0.100:/home/nfs /home/zzz/nfs[root@linux ~]# mount -t nfs 192.168.0.100:/home/upload /home/zzz/upload[root@linux ~]# mount -t nfs 192.168.0.100:/home/andy /home/zzz/andy
重點回顧
在 LPI 網站 http://www.lpi.org 裡面提到的,關於 NFS 的考試題庫的地方,只有在 LPI level 1 的 102 ,裡面的 topic 113 Networking Services ,第四點當中,簡易的 NFS 設定。強調的是『應試者需瞭解 NFS 的設定、啟動與關閉的關係』至於會考的檔案與指令可能有這些:
課後練習
mount -t nfs -o nosuid,ro server:/directory /your/directory
參考資料
鳥哥這裡的備份:http://linux.vbird.org/linux_server/0330nfs/0330nfs_rpc.html
- NFS 伺服器
- Proxy 伺服器
- C#伺服器源码
- 主機名稱控制者: DNS 伺服器
- 建置 POSTFIX 伺服器
- 第二十章、WWW 伺服器
- NIS伺服器使用流程
- NFS
- NFS
- nfs
- NFS
- NFS
- nfs
- NFS
- NFS
- NFS
- nfs
- NFS
- 集合算法:实现D森林
- eclipse下配置Resin
- issue about image displayed base on IE6, IE7,IE8, and Fire fox
- JS 窗口最大化
- ASP.NET中如何动态获取表的字段来填充到DropDownList中
- NFS 伺服器
- memcached全面剖析–4. memcached的分布式算法
- 创富经典
- 解决 sql server 2005 express中sa不能登录
- MongoDB与Tokyo Tyrant性能比较(1):基础CRU操作
- 如何重置identity值
- c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex
- 企业应用架构模式读书笔记(一)
- 字符串匹配:用随机算法