日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Glusterfs之nfs模塊源碼分析(上)之nfs原理和

系統(tǒng) 2294 0

我的新浪微博: http://weibo.com/freshairbrucewoo

歡迎大家相互交流,共同提高技術(shù)。

?

一、網(wǎng)絡(luò)文件系統(tǒng)概述

?

Sun?Microsystems公司于1984年推出了一個在整個計算機工業(yè)中被廣泛接受的遠程文件存取機制,它被稱為Sun的網(wǎng)絡(luò)文件系統(tǒng)(Network?File?System),或者簡稱為NFS。該機制允許在一臺計算機上運行一個服務(wù)器,使對其上的某些或所有文件都可以進行遠程存取,還允許其他計算機上的應(yīng)用程序?qū)@些文件進行存取。

它使我們能夠達到文件的共享。當使用者想用遠端檔案時只要用"mount"就可把remote檔案系統(tǒng)掛接在自己的檔案系統(tǒng)之下,使得遠端的文件操作上和本地機器的文件沒兩樣。一個應(yīng)用程序可以打開(Open)一個遠程文件以進行存取,可以從這個文件中讀?。≧ead)數(shù)據(jù),向該文件中寫入(Write)數(shù)據(jù),定位(Seek)到文件中的某個指定位置(開始、結(jié)尾或者其他地方),最后當使用完畢后關(guān)閉(Close)該文件。并且這些操作都是對編程者透明的,操作方法和對本地文件的操作方法完全一樣。

二、 NFS 協(xié)議

NFS協(xié)議使用NFS,客戶端可以透明地訪問服務(wù)器中的文件系統(tǒng),這不同于提供文件傳輸?shù)腇TP協(xié)議。FTP會產(chǎn)生文件一個完整的副本;NFS只訪問一個進程引用文件部分,并且一個目的就是使得這種訪問透明。這就意味著任何能夠訪問一個本地文件的客戶端程序不需要做任何修改,就應(yīng)該能夠訪問一個NFS文件。NFS是一個使用SunRPC構(gòu)造的客戶端/服務(wù)器應(yīng)用程序,其客戶端通過向一臺NFS服務(wù)器發(fā)送RPC請求來訪問其中的文件。盡管這一工作可以使用一般的用戶進程來實現(xiàn),即NFS客戶端可以是一個用戶進程,對服務(wù)器進行顯式調(diào)用,而服務(wù)器也可以是一個用戶進程。因為兩個理由,NFS一般不這樣實現(xiàn)。首先訪問一個NFS文件必須對客戶端透明,因此NFS的客戶端調(diào)用是由客戶端操作系統(tǒng)代表用戶進程來完成的;其次,出于效率的考慮,NFS服務(wù)器在服務(wù)器操作系統(tǒng)中實現(xiàn)。如果NFS服務(wù)器是一個用戶進程,每個客戶端請求和服務(wù)器應(yīng)答(包括讀和寫的數(shù)據(jù))將不得不在內(nèi)核和用戶進程之間進行切換,這個代價太大。第3版的NFS協(xié)議在1993年發(fā)布,下圖所示為一個NFS客戶端和一臺NFS服務(wù)器的典型結(jié)構(gòu)。?

?

Glusterfs之nfs模塊源碼分析(上)之nfs原理和協(xié)議

圖1??NFS 客戶端和 NFS 服務(wù)器的典型結(jié)構(gòu)?

(1)訪問一個本地文件還是一個NFS文件對于客戶端來說是透明的,當文件被打開時,由內(nèi)核決定這一點。文件被打開之后,內(nèi)核將本地文件的所有引用傳遞給名為“本地文件訪問”的框中,而將一個NFS文件的所有引用傳遞給名為“NFS客戶端”的框中。

(2)NFS客戶端通過其TCP/IP模塊向NFS服務(wù)器發(fā)送RPC請求,NFS主要使用UDP,最新的實現(xiàn)也可以使用TCP。

(3)NFS服務(wù)器在端口2049接收作為UDP數(shù)據(jù)包的客戶端請求,盡管NFS可以被實現(xiàn)為使用端口映射器,允許服務(wù)器使用一個臨時端口,但是大多數(shù)實現(xiàn)都是直接指定UDP端口2049。

(4)當NFS服務(wù)器收到一個客戶端請求時,它將這個請求傳遞給本地文件訪問例程,然后訪問服務(wù)器主機上的一個本地的磁盤文件。

(5)NFS服務(wù)器需要花一定的時間來處理一個客戶端的請求,訪問本地文件系統(tǒng)一般也需要一部分時間。在這段時間間隔內(nèi),服務(wù)器不應(yīng)該阻止其他客戶端請求。為了實現(xiàn)這一功能,大多數(shù)的NFS服務(wù)器都是多線程的——服務(wù)器的內(nèi)核中實際上有多個NFS服務(wù)器在NFS本身的加鎖管理程序中運行,具體實現(xiàn)依賴于不同的操作系統(tǒng)。既然大多數(shù)UNIX內(nèi)核不是多線程的,一個共同的技術(shù)就是啟動一個用戶進程(常被稱為“nfsd”)的多個實例。這個實例執(zhí)行一個系統(tǒng)調(diào)用,使其作為一個內(nèi)核進程保留在操作系統(tǒng)的內(nèi)核中。

6 在客戶端主機上, NFS 客戶端需要花一定的時間來處理一個用戶進程的請求。 NFS 客戶端向服務(wù)器主機發(fā)出一個 RPC 調(diào)用,然后等待服務(wù)器的應(yīng)答。為了給使用 NFS 的客戶端主機上的用戶進程提供更多的并發(fā)性,在 客戶端內(nèi)核中一般運行著多個NFS客戶端,同樣具體實現(xiàn)也依賴于操作系統(tǒng)。

三、NFS 的工作原理和服務(wù)進程的作用

Linux 中, NFS 和服務(wù)進程是兩個不同的概念,但它們確實緊密聯(lián)系在一起。首先,先介紹 NFS 的工作原理。

第一節(jié)、NFS 的工作原理

啟動 NFS 文件服務(wù)器時, /etc/rc.local 會自動啟動 exportfs 程序,指定可以導出的文件或目錄,而所能掛載的也只能是其所指定的目錄。
NFS 是基于 XDR/RPC 協(xié)議的。 XDR eXternal?Data?Representation ,即外部數(shù)據(jù)表示法)提供一種方法,把數(shù)據(jù)從一種格式轉(zhuǎn)換成另一種標準數(shù)據(jù)格式表示法,確保在不同的計算機、操作系統(tǒng)及程序語言中,所有數(shù)據(jù)代表的意義都是相同的。
RPC Remote?Procedure?Call ,遠程程序調(diào)用)請求遠程計算機給予服務(wù)??蛻魴C通過網(wǎng)絡(luò)傳送 RPC 到遠程計算機,請求服務(wù)。
NFS 運用 RPC 傳送數(shù)據(jù)的方法有以下幾步:
1 )客戶送出信息,請求服務(wù)。
2 )客戶占位程序把客戶送出的參數(shù)轉(zhuǎn)換成 XDR 標準格式,并用系統(tǒng)調(diào)用把信息送到網(wǎng)絡(luò)上。
3 )信息經(jīng)過網(wǎng)絡(luò)送達遠程主機系統(tǒng)。
4 )遠程主機將接受到的信息傳給服務(wù)器占位程序。
5 )把 XDR 形式的數(shù)據(jù),轉(zhuǎn)換成符合主機端的格式,取出客戶發(fā)出的服務(wù)請求參數(shù),送給服務(wù)器。
6 )服務(wù)器給客戶發(fā)送服務(wù)的逆向傳送過程。

第二節(jié)、服務(wù)進程的作用

服務(wù)進程是系統(tǒng)在啟動計算機后自動運行的程序,包括對網(wǎng)絡(luò)的連接、網(wǎng)絡(luò)協(xié)議的加載、圖形桌面的顯示、文件系統(tǒng)的加載等, Linux 系統(tǒng)中常見的進程包括以下幾種。
(1 nfsd
根據(jù)客戶端對文件系統(tǒng)的需求,啟動文件系統(tǒng)請求服務(wù)進程,響應(yīng)客戶的請求,而一般文件系統(tǒng)請求服務(wù)進程的數(shù)目是 8 ,這也是在 rc.local 中寫 nfsd?8?& 的原因。
(2 biod
此進程是在 NFS 客戶端上用的,用來啟動異步塊 I/O 服務(wù)進程來建立 Buffer?Cache ,處理在客戶機上的讀寫。 (3 mountd
這是個 RPC 服務(wù)器。啟動 rpc.mountd 服務(wù)進程后, mountd 會讀取 /etc/xtab 查看哪一臺客戶機正在掛載哪一個文件系統(tǒng),并回應(yīng)客戶機所要掛載的路徑。
(4 inetd?Internet?services 服務(wù)進程
當系統(tǒng)啟動時, rc.local 會啟動 inetd 讀取 inetd.conf 配置文件,讀取網(wǎng)絡(luò)上所有服務(wù)器的地址,鏈接啟動 inetd.conf 中所有的服務(wù)器。當客戶機請求服務(wù)時, inetd 就會啟動相關(guān)的服務(wù)進程,如 user 使用 telnet 時, inetd 啟動 telnetd 配合 user?telnet 的需求,其余像 ftp 、 finger 、 rlogin 等應(yīng)用程序, inetd 也都會啟動相對應(yīng)的服務(wù)程序 ftpd 、 fingerd rloingd 等。
(5 portmap 服務(wù)程序
主要功能是將 TCP/IP 通信協(xié)議的端口數(shù)字轉(zhuǎn)換成 RPC 程序數(shù)字,因為這樣客戶端才能進行 RPC 調(diào)用。一般 RPC 服務(wù)器是被 inet 啟動的,所以 portmap 必須在 inetd 之前啟動,否則無法進行 RPC 調(diào)用。?

四、 NFS 服務(wù)器之 RPC

因為 NFS 支持的功能相當多,而不同的功能都會使用不同的程序來啟動。每啟動一個功能就會啟用一些端口來傳輸數(shù)據(jù),因此 NFS 的功能所對應(yīng)的端口才沒有固定,而是采用隨機取用一些未被使用的小于 724 的端口來作為傳輸之用。但如此一來又造成客戶端要連接服務(wù)器時的困擾,因為客戶端要知道服務(wù)器端的相關(guān)端口才能夠聯(lián)機,此時我們需要遠程過程調(diào)用( RPC )的服務(wù)。 RPC 最主要的功能就是指定每個 NFS 功能所對應(yīng)的端口號,并且回報給客戶端,讓客戶端可以連接到正確的端口上。當服務(wù)器在啟動 NFS 時會隨機選用數(shù)個端口,并主動地向 RPC 注冊。因此 RPC 可以知道每個端口對應(yīng)的 NFS 功能。然后 RPC 固定使用端口 111 來監(jiān)聽客戶端的請求并回報客戶端正確的端口,所以可以讓 NFS 的啟動更為容易。注意,啟動 NFS 之前,要先啟動 RPC ;否則 NFS 會無法向 RPC 注冊。另外,重新啟動 RPC 時原本注冊的數(shù)據(jù)會不見,因此 RPC 重新啟動后它管理的所有程序都需要重新啟動以重新向 RPC 注冊。
當客戶端有 NFS 文件要存取請求時,它如何向服務(wù)器端要求數(shù)據(jù)?
1 )客戶端會向服務(wù)器端的 RPC port?111 )發(fā)出 NFS 文件存取功能的詢問請求。
2 )服務(wù)器端找到對應(yīng)的已注冊的 NFS?daemon 端口后會回報給客戶端。
3 )客戶端了解正確的端口后,就可以直接與 NFS 守護進程來聯(lián)機。
由于 NFS 的各項功能都必須要向 RPC 注冊,因此 RPC 才能了解 NFS 服務(wù)的各項功能的 port?number PID NFS 在主機所監(jiān)聽的 IP 等,而客戶端才能夠通過 RPC 的詢問找到正確對應(yīng)的端口。即 NFS 必須要有 RPC 存在時才能成功地提供服務(wù),因此我們稱 NFS RPC?Server 的一種。事實上,有很多這樣的服務(wù)器都向 RPC 注冊。例如, NIS Network?Information?Service )也是 RPC?Server 的一種。所以如下圖所示,不論是客戶端還是服務(wù)器端,要使用 NFS 都需要啟動 RPC 。

?

Glusterfs之nfs模塊源碼分析(上)之nfs原理和協(xié)議

?

2?NFS RPC 服務(wù)及操作系統(tǒng)的相關(guān)性

?

?

NFS 協(xié)議從誕生到現(xiàn)在為止,已經(jīng)有多個版本,如 NFS?V2 rfc794 )及 NFS?V3 rfc1813 )(最新的版本是 V4 rfc307 ))。最早, SUN 公司曾將 NFS?V2 設(shè)計為只使用 UDP ,主要原因是當時機器的內(nèi)存、網(wǎng)絡(luò)速度和 CPU 的影響,不得不選擇對機器負擔較輕的方式。而到了 NFS?V3 , SUN 公司選擇了 TCP 作為默認的傳輸方式。 V3 相對 V2 的主要區(qū)別如下:
1 )文件尺寸: V2 最大只支持 32 位的文件大?。? 4?GB ),而 V3 新增加了支持 64 位文件大小的技術(shù)
2 )文件傳輸尺寸: V3 沒有限定傳輸尺寸, V2 最多只能設(shè)定為 8?KB ,可以使用 -rsize?and?-wsize 來設(shè)定
3 )返回完整的信息: V3 增加和完善了返回錯誤和成功信息,對于服務(wù)器的設(shè)置和管理能帶來很大好處
4 )增加了對 TCP 傳輸協(xié)議的支持: V2 只提供了對 UDP 的支持,在一些高要求的網(wǎng)絡(luò)環(huán)境中有很大限制; V3 增加了對 TCP 的支持。 UDP 有著傳輸速度快且非連接傳輸?shù)谋憬萏匦?,但是在傳輸上沒有 TCP 穩(wěn)定。當網(wǎng)絡(luò)不穩(wěn)定或者黑客入侵時很容易使 NFS 的性能大幅度降低,甚至使網(wǎng)絡(luò)癱瘓。所以對于不同情況,網(wǎng)絡(luò)要有針對性地選擇傳輸協(xié)議。 NFS 的默認傳輸協(xié)議是 UDP ,然而 RHEL?4.0 內(nèi)核提供了對通過 TCP NFS 的支持。要通過 TCP 來使用 NFS ,在客戶端系統(tǒng)上掛載 NFS 導出的文件系統(tǒng)時包括一個“ -o?tcp ”選項。使用 TCP 的優(yōu)點和缺點如下:
1 )被提高了的連接持久性,因此獲得的 NFS?stale?file?handles 消息就會較少。
2 )載量較大的網(wǎng)絡(luò)的性能會有所提高,因為 TCP 確認每個分組,而 UDP 只在完成時才確認。
3 TCP 具有擁塞控制技術(shù)( UDP 根本沒有),在一個擁塞情況嚴重的網(wǎng)絡(luò)上, UDP 分組是被首先撤銷的類型。使用 UDP 意味著,如果 NFS 正在寫入數(shù)據(jù)(單元為 8?KB 的塊),所有這 8?KB 數(shù)據(jù)都需要被重新傳輸。由于 TCP 的可靠性, 8?KB 數(shù)據(jù)中只有一部分需要重新傳輸。
4 )錯誤檢測。當 TCP 連接中斷(由于服務(wù)器停止),客戶端就會停止發(fā)送數(shù)據(jù)而開始重新連接。 UDP 是無連接的,使用它的客戶端就會繼續(xù)給網(wǎng)絡(luò)發(fā)送數(shù)據(jù)直到服務(wù)器重新上線為止。
5 TCP 的費用在性能方面的提高并不顯著。
5 )異步寫入特性。
6 )改進了服務(wù)器的 mount 性能。
7 )有更好的 I/O 寫性能。
8 )更強的網(wǎng)絡(luò)運行效能,使得網(wǎng)絡(luò)運行更為有效。
9 )更強的災(zāi)難恢復功能。

Linux 上, UDP 是默認使用的協(xié)議。作為服務(wù)器別無選擇。但作為客戶端,可以使用 TCP 和其他使用 TCP UNIX?NFS 服務(wù)器互聯(lián)。在局域網(wǎng)中使用 UDP 較好,因為局域網(wǎng)有比較穩(wěn)定的網(wǎng)絡(luò)保證。使用 UDP 可以帶來更好的性能, Linux 默認使用 V2 ,但是也可以通過 mount?option nfsvers=n 選擇。 NFS 使用 TCP/IP 提供的協(xié)議和服務(wù)運行于 OSI 層次模型的應(yīng)用層,如表 1 所示。


1??OSI 層次模型上的 NFS

?

層????數(shù)

名????稱

功????能

1

應(yīng)用層

NFS

2

表示層

XDR

3

會話層

RPC

4

傳輸層

UDP , TCP

5

網(wǎng)絡(luò)層

IP

6

數(shù)據(jù)鏈路層

?

7

物理層

Ethernet

Glusterfs之nfs模塊源碼分析(上)之nfs原理和協(xié)議


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 兴城市| 阳朔县| 嘉禾县| 新田县| 通榆县| 井陉县| 鹤壁市| 福安市| 金阳县| 百色市| 留坝县| 大理市| 循化| 东丰县| 崇文区| 江川县| 陆丰市| 丹东市| 黄冈市| 辽宁省| 海宁市| 镇康县| 林甸县| 从江县| 顺平县| 金阳县| 民丰县| 牙克石市| 伊通| 瑞丽市| 简阳市| 建德市| 吉隆县| 台东县| 六盘水市| 盐池县| 定边县| 宣武区| 西乌珠穆沁旗| 锦州市| 洪湖市|