我的新浪微博: 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)。?
?
圖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
。
?
?
?
?
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 |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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