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

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

系統 2267 0

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

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

?

一、網絡文件系統概述

?

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

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

二、 NFS 協議

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

?

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

圖1??NFS 客戶端和 NFS 服務器的典型結構?

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

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

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

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

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

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

三、NFS 的工作原理和服務進程的作用

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

第一節、NFS 的工作原理

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

第二節、服務進程的作用

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

四、 NFS 服務器之 RPC

因為 NFS 支持的功能相當多,而不同的功能都會使用不同的程序來啟動。每啟動一個功能就會啟用一些端口來傳輸數據,因此 NFS 的功能所對應的端口才沒有固定,而是采用隨機取用一些未被使用的小于 724 的端口來作為傳輸之用。但如此一來又造成客戶端要連接服務器時的困擾,因為客戶端要知道服務器端的相關端口才能夠聯機,此時我們需要遠程過程調用( RPC )的服務。 RPC 最主要的功能就是指定每個 NFS 功能所對應的端口號,并且回報給客戶端,讓客戶端可以連接到正確的端口上。當服務器在啟動 NFS 時會隨機選用數個端口,并主動地向 RPC 注冊。因此 RPC 可以知道每個端口對應的 NFS 功能。然后 RPC 固定使用端口 111 來監聽客戶端的請求并回報客戶端正確的端口,所以可以讓 NFS 的啟動更為容易。注意,啟動 NFS 之前,要先啟動 RPC ;否則 NFS 會無法向 RPC 注冊。另外,重新啟動 RPC 時原本注冊的數據會不見,因此 RPC 重新啟動后它管理的所有程序都需要重新啟動以重新向 RPC 注冊。
當客戶端有 NFS 文件要存取請求時,它如何向服務器端要求數據?
1 )客戶端會向服務器端的 RPC port?111 )發出 NFS 文件存取功能的詢問請求。
2 )服務器端找到對應的已注冊的 NFS?daemon 端口后會回報給客戶端。
3 )客戶端了解正確的端口后,就可以直接與 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

?

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

?

2?NFS RPC 服務及操作系統的相關性

?

?

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

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


1??OSI 層次模型上的 NFS

?

層????數

名????稱

功????能

1

應用層

NFS

2

表示層

XDR

3

會話層

RPC

4

傳輸層

UDP TCP

5

網絡層

IP

6

數據鏈路層

?

7

物理層

Ethernet

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 弥勒县| 五大连池市| 昌乐县| 富源县| 郑州市| 鄢陵县| 西畴县| 息烽县| 通江县| 丰都县| 灌云县| 大同县| 中西区| 苗栗县| 大悟县| 宝清县| 府谷县| 呼玛县| 田林县| 满城县| 三门县| 桐梓县| 会宁县| 东台市| 从化市| 东莞市| 皮山县| 肃南| 离岛区| 西吉县| 中西区| 深泽县| 禄劝| 页游| 和顺县| 措美县| 长顺县| 阳谷县| 怀仁县| 文登市| 通榆县|