390 likes | 564 Views
13. 檔案伺服器之一 : NFS 伺服器. NFS 為 Network FileSystem 的簡稱,它的目的就是想讓不同的機器、不同的 作業系統 可以彼此分享個別的檔案啦!目前在 Unix Like 當中用來做為檔案伺服器 是相當 不錯的一個方案喔!基本上, Unix Like 主機連接到另一部 Unix Like 主機 來分享 彼此的檔案時,使用 NFS 要比 SAMBA 這個伺服器快速且方便的多了!. NFS 的由來與其 功能 什麼是 NFS (Network FileSystem )
E N D
13 • 檔案伺服器之一:NFS伺服器 • NFS 為 Network FileSystem的簡稱,它的目的就是想讓不同的機器、不同的作業系統可以彼此分享個別的檔案啦!目前在 Unix Like 當中用來做為檔案伺服器是相當不錯的一個方案喔!基本上,Unix Like 主機連接到另一部 Unix Like 主機來分享彼此的檔案時,使用 NFS 要比 SAMBA 這個伺服器快速且方便的多了!
NFS 的由來與其功能 • 什麼是 NFS (Network FileSystem) • NFS 就是 Network FileSystem的縮寫,最早之前是由 Sun 這家公司所發展出來的 (註 1)。 它最大的功能就是可以透過網路,讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 (share files)。所以,你也可以簡單的將他看做是一個檔案伺服器 (file server) 呢!這個 NFS 伺服器可以讓你的 PC 來將網路遠端的 NFS 伺服器分享的目錄,掛載到本地端的機器當中,在本地端的機器看起來,那個遠端主機的目錄就好像是自己的一個磁碟分割槽一樣 (partition)!使用上面相當的便利! • P.13-2 請參閱書籍
P.13-2 請參閱書籍
好的,既然 NFS 是透過網路來進行資料的傳輸,那麼經由第二章談到的 socket pair 的概念你會知道 NFS 應該會使用一些埠口吧?那麼 NFS 使用哪個埠口來進行傳輸呢?基本上 NFS 這個服務的埠口開在 2049 ,但是由於檔案系統非常複雜,因此 NFS 還有其他的程序去啟動額外的埠口,但這些額外的埠口啟動的號碼是?答案是....不知道!@_@!因為預設 NFS 用來傳輸的埠口是隨機選擇小於 1024 以下的埠口來使用的。咦!那用戶端怎麼知道你伺服器端使用那個埠口啊?此時就得要遠端程序呼叫 (Remote Procedure Call, RPC) 的協定來輔助啦!底下我們就來談談什麼是 RPC? • P.13-3 請參閱書籍
什麼是 RPC (Remote Procedure Call) • 因為 NFS 支援的功能相當的多,而不同的功能都會使用不同的程式來啟動,每啟動一個功能就會啟用一些埠口來傳輸資料,因此,NFS 的功能所對應的埠口才沒有固定住,而是隨機取用一些未被使用的小於 1024 的埠口來作為傳輸之用。但如此一來又造成用戶端想要連上伺服器時的困擾,因為用戶端得要知道伺服器端的相關埠口才能夠連線吧! • 此時我們就得需要遠端程序呼叫 (RPC) 的服務啦!RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給用戶端,讓用戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當伺服器在啟動 NFS 時會隨機取用數個埠口,並主動的向 RPC 註冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然後 RPC 又是固定使用 port 111 來監聽用戶端的需求並回報用戶端正確的埠口,所以當然可以讓 NFS 的啟動更為輕鬆愉快了! • P.13-3 請參閱書籍
所以你要注意,要啟動 NFS 之前,RPC 就要先啟動了,否則 NFS 會無法向 RPC 註冊。 另外,RPC 若重新啟動時,原本註冊的資料會不見,因此 RPC 重新啟動後,它管理的所有服務都需要重新啟動來重新向 RPC 註冊。 • P.13-3 請參閱書籍
如上圖所示,當用戶端有 NFS 檔案存取需求時,他會如何向伺服器端要求資料呢? • 用戶端會向伺服器端的 RPC (port 111) 發出 NFS 檔案存取功能的詢問要求; • 伺服器端找到對應的已註冊的 NFS daemon 埠口後,會回報給用戶端; • 用戶端瞭解正確的埠口後,就可以直接與 NFS daemon 來連線。 • P.13-4 請參閱書籍
NFS 啟動的 RPC daemons • rpc.nfsd • rpc.mountd • rpc.lockd (非必要) • rpc.statd (非必要) • P.13-4~5 請參閱書籍
NFS 的檔案存取權限 • 不知道你有沒有想過這個問題,在圖 13.1-1 的環境下,假如我在 NFS client 1 上面以 dmtsai這個使用者身份想要去存取 /home/data/sharefile/ 這個來自 NFS server 所提供的檔案系統時,請問 NFS server 所提供的檔案系統會讓我以什麼身份去存取?是 dmtsai還是? • 為什麼會這麼問呢?這是因為 NFS 本身的服務並沒有進行身份登入的識別,所以說,當你在用戶端以 dmtsai的身份想要存取伺服器端的檔案系統時,伺服器端會以用戶端的使用者 UID 與 GID 等身份來嘗試讀取伺服器端的檔案系統。這時有個有趣的問題就產生啦!那就是如果用戶端與伺服器端的使用者身份並不一致怎麼辦? • P.13-5 請參閱書籍
P.13-6 請參閱書籍
NFS server/NFS client 剛好有相同的帳號與群組 則此時使用者可以直接以 dmtsai的身份進行伺服器所提供的檔案系統之存取。 • NFS server 的 501 這個 UID 帳號對應為 vbird 若 NFS 伺服器上的 /etc/passwd裡面 UID 501 的使用者名稱為 vbird時,則用戶端的 dmtsai可以存取伺服器端的 vbird這個使用者的檔案喔!只因為兩者具有相同的 UID 而已。這就造成很大的問題了!因為沒有人可以保證用戶端的 UID 所對應的帳號會與伺服器端相同,那伺服器所提供的資料不就可能會被錯誤的使用者亂改? • P.13-6 請參閱書籍
NFS server 並沒有 501 這個 UID 另一個極端的情況是,在伺服器端並沒有 501 這個 UID 的存在,則此時 dmtsai的身份在該目錄下會被壓縮成匿名者,一般 NFS 的匿名者會以 UID 為 65534 為其使用者,早期的 Linux distributions 這個 65534 的帳號名稱通常是 nobody,我們的 CentOS則取名為 nfsnobody。但有時也會有特殊的情況,例如在伺服器端分享 /tmp的情況下,dmtsain的身份還是會保持 501 但建立的各項資料在伺服器端來看,就會屬於無擁有者的資料。 • P.13-6 請參閱書籍
如果使用者身份是 root 時 有個比較特殊的使用者,那就是每個 Linux 主機都有的 UID 為 0 的 root 。 想一想,如果用戶端可以用 root 的身份去存取伺服器端的檔案系統時,那伺服器端的資料哪有什麼保護性?所以在預設的情況下,root 的身份會被主動的壓縮成為匿名者。 • P.13-6 請參閱書籍
總之,用戶端使用者能做的事情是與 UID 及其 GID 有關的,那當用戶端與伺服器端的 UID 及帳號的對應不一致時,可能就會造成檔案系統使用上的困擾,這個就是 NFS 檔案系統在使用上面的一個很重要的地方!而在瞭解使用者帳號與 UID 及檔案系統的關係之後,要實際在用戶端以 NFS 取用伺服器端的檔案系統時,你還得需要具有: • NFS 伺服器有開放可寫入的權限 (與 /etc/exports 設定有關); • 實際的檔案權限具有可寫入 (w) 的權限。 • P.13-7 請參閱書籍
NFS Server 端的設定 • 所需要的軟體 • RPC 主程式:rpcbind • NFS 主程式:nfs-utils • P.13-7 請參閱書籍
NFS 的軟體結構 • 主要設定檔:/etc/exports • NFS 檔案系統維護指令:/usr/sbin/exportfs • 分享資源的登錄檔:/var/lib/nfs/*tab • 用戶端查詢伺服器分享資源的指令:/usr/sbin/showmount • P.13-8 請參閱書籍
/etc/exports 設定檔的語法與參數 • 至於 NFS 伺服器的架設實在很簡單,你只要編輯好主要設定檔 /etc/exports 之後,先啟動 rpcbind (若已經啟動了,就不要重新啟動),然後再啟動 nfs,你的 NFS 就成功了! • P.13-9 請參閱書籍
至於主機名稱的設定主要有幾個方式: • 可以使用完整的 IP 或者是網域,例如 192.168.100.10 或 192.168.100.0/24 ,或 192.168.100.0/255.255.255.0 都可以接受! • 也可以使用主機名稱,但這個主機名稱必須要在 /etc/hosts 內,或可使用 DNS 找到該名稱才行啊!反正重點是可找到 IP 就是了。如果是主機名稱的話,那麼他可以支援萬用字元,例如 * 或 ? 均可接受。 • P.13-9 請參閱書籍
至於權限方面 (就是小括號內的參數) 常見的參數則有: • P.13-10 請參閱書籍
立刻實作 • P.13-10 • 讓 root 保有 root 的權限 • 我想將 /tmp分享出去給大家使用,由於這個目錄本來就是大家都可以讀寫的,因此想讓所有的人都可以存取。此外,我要讓 root 寫入的檔案還是具有 root 的權限,那如何設計設定檔? • 答: 請參閱書籍
立刻實作 • P.13-11 • 同一目錄針對不同範圍開放不同權限 • 我要將一個公共的目錄 /home/public 公開出去,但是只有限定我的區域網路 192.168.100.0/24 這個網域且加入 vbirdgroup (第一章的例題建立的群組) 的用戶才能夠讀寫,其他來源則只能讀取。 • 答: 請參閱書籍
立刻實作 • P.13-12 • 開放匿名登入的情況 • 我要讓 *.centos.vbird網域的主機,登入我的 NFS 主機時,可以存取 /home/linux,但是他們存資料的時候,我希望他們的 UID 與 GID 都變成 45 這個身份的使用者,假設我 NFS 伺服器上的 UID 45 與 GID 45 的用戶/群組名稱為 nfsanon。 • 答: 請參閱書籍
啟動 NFS • P.13-14 請參閱書籍
注意看到上面喔!總共產生了好多的 port 喔!真是可怕!不過主要的埠口是: • rpcbind啟動的 port 在 111 ,同時啟動在 UDP 與 TCP; • nfs本身的服務啟動在 port 2049 上頭! • 其他 rpc.* 服務啟動的 port 則是隨機產生的,因此需向 port 111 註冊。 • 好了,那我怎麼知道每個 RPC 服務的註冊狀況?沒關係,你可以使用 rpcinfo來觀察的。 • P.13-15 請參閱書籍
NFS 的連線觀察 • P.13-16 請參閱書籍
P.13-17 請參閱書籍
NFS 的安全性 • 防火牆的設定問題與解決方案: • P.13-18 請參閱書籍
P.13-19 請參閱書籍
NFS 用戶端的設定 • 手動掛載 NFS 伺服器分享的資源 • 你要如何掛載 NFS 伺服器所提供的檔案系統呢?基本上,可以這樣做: • 確認本地端已經啟動了 rpcbind服務! • 掃瞄 NFS 伺服器分享的目錄有哪些,並瞭解我們是否可以使用 (showmount); • 在本地端建立預計要掛載的掛載點目錄 (mkdir); • 利用 mount 將遠端主機直接掛載到相關目錄。 • P.13-20 請參閱書籍
P.13-20~21 請參閱書籍
P.13-21 請參閱書籍
用戶端可處理的掛載參數與開機掛載 • P.13-21~22 請參閱書籍
P.13-23 請參閱書籍
通常如果你的 NFS 是用在高速運作的環境當中的話,那麼可以建議加上這些參數的說: • 在鳥哥的實際案例中,某些大型的模式運算並不允許 soft 這個參數喔!舉例來說,鳥哥慣用的 CMAQ 空氣品質模式,這個模式的叢集架構分享檔案系統中,就不允許使用 soft 參數!這點需要特別留意喔! • P.13-23~24 請參閱書籍
自動掛載 autofs的使用 • NFS 檔案系統與網路連線的困擾: • 我們知道 NFS 伺服器與用戶端的連線或許不會永遠存在,而 RPC 這個服務又挺討厭的,如果掛載了 NFS 伺服器後,任何一方離線都可能造成另外一方老是在等待逾時~而且,掛載的 NFS 檔案系統可能又不是常常被使用,但若不掛載的話,有時候緊急要使用時又得通知系統管理員,這又很不方便...啊!好討厭的感覺啊~@_@ • 所以,讓我們換個思考的角度來討論一下使用 NFS 的情境: • 可不可以讓用戶端在有使用到 NFS 檔案系統的需求時才讓系統自動掛載? • 當 NFS 檔案系統使用完畢後,可不可以讓 NFS 自動卸載,以避免可能的 RPC 錯誤? • P.13-25 請參閱書籍
autofs的設定概念: • autofs這個服務在用戶端電腦上面,會持續的偵測某個指定的目錄,並預先設定當使用到該目錄下的某個次目錄時,將會取得來自伺服器端的 NFS 檔案系統資源,並進行自動掛載的動作。 講這樣或許你有點模糊,讓我們拿底下這個圖示來看看: • 舉例來說:『當我們在用戶端要使用 /home/nfsfile/public 的資料時,此時 autofs才會去 192.168.100.254 伺服器上掛載 /home/public !』且『當隔了 5 分鐘沒有使用該目錄下的資料後,則用戶端系統將會主動的卸載 /home/nfsfile/public 』。 • P.13-26 請參閱書籍
建立主設定檔 /etc/auto.master,並指定偵測的特定目錄 • 建立資料對應檔內 (/etc/auto.nfs) 的掛載資訊與伺服器對應資源 • P.13-26~27 請參閱書籍
實際運作與觀察 • P.13-27 請參閱書籍
案例演練 • 模擬的環境狀態中,伺服器端的想法如下: • 假設伺服器的 IP 為 192.168.100.254 這一部; • /tmp分享為可讀寫,並且不限制使用者身份的方式,分享給所有 192.168.100.0/24 這個網域中的所有電腦; • /home/nfs分享的屬性為唯讀,可提供除了網域內的工作站外,向 Internet 亦提供資料內容; • /home/upload 做 為 192.168.100.0/24 這 個 網 域 的 資 料 上 傳 目 錄 , 其 中 , 這 個 /home/upload 的使用者及所屬群組為 nfs-upload 這個名字,他的 UID 與 GID 均為 210; • /home/andy這個目錄僅分享給 192.168.100.10 這部主機,以提供該主機上面 andy這個使用者來使用,也就是說,andy在 192.168.100.10 及 192.168.100.254 均有帳號,且帳號均為 andy,所以預計開放 /home/andy給 andy使用他的家目錄啦! • P.13-28 請參閱書籍