利用NFS掛載網絡主機路徑

        最近遇到一個業務場景:有N臺不能連接外網的主機生產了許多業務日誌,這些日誌需要被一個日誌收集的中間件推送到遠程的日誌處理主機,這就要求這個中間件所在的主機能夠訪問外網,但是如何把這些業務日誌實時地傳輸到這個能夠訪問外網的“跳板機”是一個問題。方案大致上有兩種:一種是通過flume等開源的日誌傳輸工具把文件傳送到跳板機,但是配置比較的複雜,而且需要2端都配置比較多的信息,另一種就是本文即將要介紹的如何利用NFS掛載某一臺網絡主機的路徑,將其作爲本地的一個路徑進行日誌的讀取。
好了背景介紹完了,下面我們要來了解以下的內容:

一、什麼是NFS
Network File System (NFS),一種用來允許掛載一個遠程主機的磁盤分區並把它當作本地資源來用的一個服務,它允許互聯網中快速、無縫地傳輸共享文件。

二、Linux內核的要求和NFS版本注意事項
Version 3 NFS是http://nfs.sourceforge.net上推薦是一個版本,這裏我們就採用這個版本來進行實戰。具體原因是V2是1.2內核系列的那段時間發佈的,版本比較老(至於爲什麼不選V4後面會講)。於此同時,如果你需要以下幾點的服務之一,請務必保障你的Linux內核在2.2.18以上。
1、Linux的NFS和其他操作系統的NFS協同工作
2、使用NFS的文件可靠鎖( file locking reliably )服務
3、使用NFS Version3

*在linux2.2.14以上的內核可以通過打補丁包(從Linux NFS 主頁)的形式來支持以上3點的功能(服務),如果內核介於2.2.14~2.2.17並且擁有內核源碼,你就可以知道這些補丁包其實已經添加在裏面了,因爲NFS Version3可以通過一個配置項來得到支持。儘管如此,如果沒有特別的原因建議還是使用較新的內核,因爲較新的內核往往對以往歷史的內核做了一些bugs上的修復,比如說2.2.19相比起2.2.18就完善了一些額外的鎖功能。

*關於版本的選擇方面,所有2.4以及以上的內核用用完整的NFS Version 3的所有功能,所有的2.6以及以上的內核擁有不同程度上的對NFS Version4的功能支持。這些將會晚點討論

*處理單文件大於2GB的文件需要2.4x以及以上的內核 && 2.2.x以及以上本本的glibc

*內核在2.2.18以上的內核支持TCP協議下的NFS客戶端

*內核2.2.18系列下,TCP協議下的NFS服務端作爲一種實驗性的選擇,以一種充滿bugs的形式存在着,對於內核2.4和2.5系列的補丁包分別是從2.4.17、2.4.5.6開始的

總而言之,從以上我們可以得知一個信息:NFS的版本越高,對Linux的內核要求也就相應地越高方能很好地支持NFS當前版本的所有功能,也因爲如此,官網的文檔針對內核相匹配的NFS版本進行介紹,如果說你的內核是低於2.2.18(2.6.x是最佳),那麼官網的指引文檔可能就不適用。截至發文章前,官網指出V4版本的NFS依然在開發、不斷迭代當中,因此解釋了上面爲何不用V4。


三、安裝nfs-utils(x86_64CentOS 6.8爲例)

這部分的安裝是服務器、客戶端無關的,都是用同一個包

首先是要下載NFS-utils-2.1.1.tar.bz2(有可能更新版本)

由於當前的主機不能連接外網,這裏提供詳盡的RPM包名稱:

keyutils-1.4-5.el6.x86_64.rpm

libevent-1.4.13-4.el6.x86_64.rpm

libgssglue-0.1-11.el6.x86_64.rpm

libnfsidmap-0.25-15.el7.x86_64.rpm

libtirpc-0.2.1-11.el6.x86_64.rpm

nfs-utils-1.2.3-75.el6.x86_64.rpm

nfs-utils-lib-1.1.5-11.el6.x86_64.rpm

python-argparse-1.2.1-2.1.el6.noarch.rpm

rpcbind-0.2.0-12.el6.x86_64.rpm

在這個很棒的地方http://www.rpmfind.net/linux/RPM/可以找到你想要的依賴包哦~

*先嚐試執行 rpm -ivh nfs-utils-1.2.3-75.el6.x86_64.rpm 看看缺少以上什麼包或者庫然後針對性地進行下載和安裝

*其中下面這個對最後的安裝有循環依賴關係,需要執行以下命令
rpm -ivh ./nfs-utils-lib-1.1.5-11.el6.x86_64.rpm --nodeps

然後再執行rpm -ivh nfs-utils-1.2.3-75.el6.x86_64.rpm 方安裝成功


如果可以yum的話

yum install nfs-utils.x86_64(64位系統)

yum install nfs-utils(32位系統)

然後安裝portmap服務,portmap在centos6中改名爲rpcbind

yum install rpcbind(centos6)

yum install portmap(centos5)


四、服務器端的配置

       在這裏我們就以達到一個目的爲標準:由背景引發的需要將機器B的某路徑掛載到機器A,爲什麼要特別說這一點呢,因爲要掛載的話只需要配置一個文件,但是嚴格來說是要配置3個文件的,他們分別是/etc/exports,/etc/hosts.allow,和/etc/hosts.deny。顧名思義,你應該知道後面2個都是爲了安全。因爲我機器所處的環境導致了我不太需要在這方面做特別的配置,這將在以後討論。


編輯/etc/exports

目錄 機器1的域名或者ip(選項1,選項2...)

目錄 機器2的域名或者ip(選項1,選項2...)

重點是在選項部分

ro 目錄以一種只讀的形式共享目錄,客戶端將只讀不可寫,默認值

rw 客戶端可以對目錄讀寫

no_root_squash 默認情況下任何來自客戶端的root用戶的文件請求都被當作是當前Server的nobody用戶在進行操作,準確來說這些請求操作被映射到一個Server上的“nobody”的UID,注意哦不是客戶端哦。如果選擇了這個選項,客戶端的root用戶將會有和服務器端的相同root的權限,儘管有時候在Server上操作文件的時候是要有root權限的,但是如果沒有特別的理由不要這樣幹,因爲這樣可能會引發一些嚴重的誤操作問題,linux...你懂的。

no_subtree_check 如果一個卷(Volume)的部分被共享(官網專用詞彙是export,這也是配置文件的名字),一個日常的任務叫‘subtree checking’會驗證來這個volume上請求的特定部分的文件是否被客戶端請求,當整個volume被export的時候,關閉這個選項可以提高傳輸速度。

sync和async 默認情況下,除了最新的1.11版本之外,命令exportfs會以async的方式執行,來告訴客戶端一個文件的寫入已經完成--寫入了穩定的存儲如硬盤--當NFS完成了對文件系統的寫操作,這種方式在系統重啓的時候可能會引起數據的丟失,但是sync的選項可以避免這一點。

比如我這裏是  /opt/log 192.168.1.52(rw) 的意思是我將把當前這臺機192.168.1.50的/opt/log目錄作爲要共享到網絡上供別人掛載的點

*也可以指定子網掩碼,比如/opt/log 192.168.1.52/24(rw)或者/opt/log 192.168.1.52/255.255.255.0(rw)都是可以的

*也可以模糊匹配,比如*.foo.com或者192.168. 也可以 注意2.2內核有這方面的匹配缺陷,在2.2.19被修復

要驗證是否生效,需要啓動NFS服務,以下作爲和客戶端相同的步驟來講:


五、NFS的啓動

5.1、NFS依賴於RPC服務,所以首先要啓動RPC服務(NFS官方文檔是啓動Portmapper,現在已經在剛提到的rpcbind的包裏)

/etc/init.d/rpcbind start   大部分發行版本會開機自啓動這一服務,但是最好運行NFS之前使用psaux | grep rpcbind命令對rpc服務進行檢測

驗證RPC服務

*在系統沒有正確啓動RPC的一系列服務(通常發生在這些腳本沒有在你當前發行版本都啓動了的時候,注意以下的服務都至少在以上的截圖中出現一次,也就是一行纔算是正常),然後又需要診斷RPC服務的時候,要保證按照以下順序啓動上面的服務(其實這部分可以跳過,貌似現在整合進rpcbind之後以下的步驟都不用理會了,但是診斷RPC的時候還是有用的,建議搭建的時候跳過這一步閱讀,如果沒什麼意外的話)

rpc.portmap
rpc.mountd, rpc.nfsd
rpc.statd, rpc.lockd (if necessary), and
rpc.rquotad
在這些地方可以找到


注:

1、portmap其實就是rpcbind包含了的東東

2、rpc.nfsd包含了rpc.lock(在上面的截圖中對應service是nlockmgr)和rpc.statd

(NFS大部分的工作都是rpc.nfsd做的,rpc.lockd andrpc.statd處理locking服務,rpc.mountd,處理初始化mount請求,rpc.rquotad處理用戶對export出去文件的文件分配,從2.2.18內核開始lockd服務在nfsd啓動的時候就被調用了所以我們不用自己啓動,但是statd需要被另外進行單獨的啓動,大多數的發行版本針對這些守護進程都有自己的腳本)


5.2啓動NFS服務

/etc/init.d/nfs start

當然你也可以加入開機自啓動

chkconfig nfs on之類的

可以通過service nfs status查看服務的狀態是否正確


六、客戶端

客戶端的安裝和服務器端是一樣的,然後直接掛載

mount -t nfs 192.168.1.50:/opt/log/ /opt/log52/這樣就能把遠程50的機器掛載到52本地的/opt/log50下


showmount -e 192.168.1.50

顯示如下:

Export list for 192.168.1.50:

/opt/log ......


其他相關的參考文章:

http://blog.csdn.net/demo_deng/article/details/9568927

http://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章