NFS (网络文件系统)
NFS (網(wǎng)絡(luò)文件系統(tǒng))
https://www.cnblogs.com/wahaha02/p/9559345.html
Linux網(wǎng)絡(luò)文件系統(tǒng)的實(shí)現(xiàn)與調(diào)試
NFS協(xié)議
NFS (網(wǎng)絡(luò)文件系統(tǒng))不是傳統(tǒng)意義上的文件系統(tǒng),而是訪問遠(yuǎn)程文件系統(tǒng)的網(wǎng)絡(luò)協(xié)議。整個(gè)NFS服務(wù)的TCP/IP協(xié)議棧如下圖所示,NFS是應(yīng)用層協(xié)議,表示層是XDR,會(huì)話層是RPC,傳輸層同時(shí)支持UDP和TCP,網(wǎng)絡(luò)層是IP協(xié)議。NFS/XDR/RPC等協(xié)議規(guī)范細(xì)節(jié)在《TCP/IP詳解 卷1:協(xié)議》第29章有詳細(xì)的描述,這里不再贅述。
經(jīng)過多年的演進(jìn),NFS協(xié)議有多個(gè)版本,每個(gè)版本都有相應(yīng)的RFC規(guī)范,如RFC1813。每個(gè)NFS的版本對(duì)比如下所示。
NFS通過NFS過程來對(duì)外提供服務(wù)。如下是RFC1813中定義的一組NFS過程。
null() 返回():不執(zhí)行任何操作,有兩個(gè)作用:相當(dāng)于到服務(wù)器的ping,以及檢測(cè)客戶端和服務(wù)器間的RTT(Round Trip Time)。
lookup(dirfh, name) 返回(fh, attr):返回目錄中一個(gè)指定文件的fhandle和屬性信息。
create(dirfh, name, attr) 返回(newfh, attr):創(chuàng)建一個(gè)新文件并且返回它的fhandle和屬性信息。
remove(dirfh, name) 返回(status):從指定目錄中刪除文件。
getattr(fh) 返回(attr):返回文件屬性信息。這個(gè)調(diào)用類似于一個(gè)stat調(diào)用。
setattr(fh, attr) 返回(attr):設(shè)置一個(gè)文件的mode,uid,gid,size,access time,modify time屬性。將文件大小設(shè)置為0相當(dāng)于對(duì)文件調(diào)用truncate。
read(fh, offset, count) 返回(attr, data):從文件的offset偏移處開始,返回最多count個(gè)字節(jié)的數(shù)據(jù)。read操作也返回文件的屬性信息。
write(fh, fh, offset, count, data) 返回(attr):向文件offset偏移處開始,寫入count字節(jié)的數(shù)據(jù),返回寫操作完成后的文件屬性信息。
rename(dirfh, name, tofh, toname) 返回(status):將dirfh目錄中名為name的文件,重命名為tofh目錄中名為toname的文件。
link(dirfh, name, tofh, toname) 返回(status):在tofh目錄中創(chuàng)建名為toname的鏈接,指向dirfh目錄中的name文件。
symlink(dirfh, name, string) 返回(status):在dirfh目錄中創(chuàng)建一個(gè)名為name的符號(hào)鏈接。服務(wù)器不解釋string的具體內(nèi)容,而只是簡(jiǎn)單將其保存起來并且與符號(hào)鏈接文件相關(guān)聯(lián)。
mkdir(dirfh, name, attr) 返回(fh, newattr):在dirfh目錄中創(chuàng)建名為name的目錄,并返回其fhandle和屬性信息。
rmdir(dirfh, name) 返回(status):從dirfh中刪除名為name的空目錄。
readdir(dirfh, cookie, count) 返回(entries):從dirfh目錄返回組多count字節(jié)的目錄項(xiàng)信息。每個(gè)目錄項(xiàng)信息包含了一個(gè)文件名,文件id,和一個(gè)由服務(wù)器解釋的指向下一個(gè)目錄項(xiàng)的指針cookie。cookie的作用是在后續(xù)readdir操作中從一個(gè)指定的位置返回目錄項(xiàng)信息。cookie為0的readdir調(diào)用從目錄的第一個(gè)目錄項(xiàng)開始返回。
statfs(fh) 返回(fsstats):返回塊大小、空閑塊數(shù)等文件系統(tǒng)的信息。
NFS特性對(duì)比
NFSv3特性對(duì)比
V2支持的最大的文件大小為2GB(32bit),V3則更大(64bit)。
V2將每個(gè)READ和WRITE 過程可以讀寫的數(shù)據(jù)限制為8192個(gè)字節(jié),V3則取消了限制。RPC的讀寫字節(jié)數(shù)只受TCP/IP限制。
V3引入新的NFS過程COMMIT,支持異步寫,提高寫性能。
V3引入新的NFS過程ACCESS,支持服務(wù)側(cè)ACL訪問權(quán)限檢查。
V3引入新的NFS過程READDIRPLUS,其返回file handle和屬性,這樣可以減少LOOKUP的調(diào)用次數(shù)。
V3對(duì)RPC命令進(jìn)行優(yōu)化,每個(gè)影響文件屬性的RPC都返回新的屬性,這樣可以減少GETATTR的調(diào)用次數(shù)。
NFSv4特性對(duì)比
V3是無狀態(tài)的,V4開始支持狀態(tài)。改善文件系統(tǒng)的異常恢復(fù)能力。
V4支持file delegation(客戶端可以工作在本地副本,直到其他客戶端請(qǐng)求同一個(gè)文件),改善文件系統(tǒng)一致性問題。
V4引入新的NFS過程COMPOUND,支持一個(gè)COMPOUND請(qǐng)求包含多個(gè)NFS過程。提高請(qǐng)求的表達(dá)能力,減少RPC請(qǐng)求的調(diào)用次數(shù)。
V4強(qiáng)制支持RPCSEC/GSS,改善文件系統(tǒng)的安全問題。
V4支持加密ACL,改善文件訪問權(quán)限管理。
V4服務(wù)端為客戶端支持統(tǒng)一的偽文件系統(tǒng)視圖。服務(wù)端所有export目錄都必須在一個(gè)偽文件系統(tǒng)root export目錄下。
V3客戶端的IP是自動(dòng)適配的,V4客戶端支持mount clientaddr參數(shù),可以指定客戶端特定的IP地址。
NFSv4.1特性對(duì)比
客戶端可以并行訪問存儲(chǔ)設(shè)備。
支持多個(gè)服務(wù)端。
支持文件系統(tǒng)的元數(shù)據(jù)和數(shù)據(jù)分離。
delegation功能支持目錄。
支持會(huì)話機(jī)制(session),改善斷鏈、崩潰等異常恢復(fù)能力。
Linux NFS實(shí)現(xiàn)與實(shí)例
LInux NFS架構(gòu)是典型的CS架構(gòu),其結(jié)構(gòu)如下圖所示。其中服務(wù)端應(yīng)用程序主要由如下幾部分組成:
portmap:端口映射器,主要功能是進(jìn)行RPC程序的端口映射工作。當(dāng)客戶端嘗試連接并使用RPC服務(wù)器提供的服務(wù)(如NFS服務(wù))時(shí),portmap會(huì)將所管理的與服務(wù)對(duì)應(yīng)的端口提供給客戶端,從而使客戶可以通過該端口向服務(wù)器請(qǐng)求服務(wù)。
rpc.mountd:NFS掛載守護(hù)進(jìn)程,主要功能是實(shí)現(xiàn)NFS MOUNT協(xié)議,負(fù)責(zé)掛載/卸載NFS文件系統(tǒng)和權(quán)限管理。它會(huì)讀取NFS的配置文件/etc/exports來對(duì)比客戶端訪問權(quán)限。掛載成功后,客戶獲得服務(wù)器文件系統(tǒng)的一個(gè)文件句柄(fh)。
rpc.nfsd:NFS服務(wù)端守護(hù)進(jìn)程,是NFS服務(wù)的用戶態(tài)部分,負(fù)責(zé)創(chuàng)建nfsd內(nèi)核進(jìn)程。需要提出的是,NFS服務(wù)的大部分功能都由nfsd內(nèi)核進(jìn)程處理。
可以看出NFS服務(wù)的大部分功能都是由內(nèi)核模塊實(shí)現(xiàn)的,除了圖中所示的內(nèi)核模塊,內(nèi)核還提供了幾個(gè)內(nèi)核守護(hù)進(jìn)程:
nfsd:主要作用是處理NFS的RPC請(qǐng)求。
nfsiod:主要作用是為NFS客戶端提供高效的緩沖機(jī)制,如預(yù)讀、延時(shí)寫等,從而改善NFS文件系統(tǒng)的性能。
rpciod:主要作用是作為RPC(遠(yuǎn)過程調(diào)用服務(wù))的守護(hù)進(jìn)程,用于從客戶端啟動(dòng)I/O服務(wù)。
下圖是一個(gè)NFS協(xié)議消息流圖實(shí)例(點(diǎn)擊見大圖),包含了一些典型的網(wǎng)絡(luò)文件系統(tǒng)操作場(chǎng)景,如:
服務(wù)注冊(cè)過程
NFS掛載:mount 168.0.155.1:/datadisk0 /tmp
改變工作目錄:cd /tmp
查看目錄下文件:ls
讀文件:more tail bootcfg.ini
Linux NFS調(diào)試
NFS應(yīng)用程序調(diào)試
打開應(yīng)用程序調(diào)試功能:
/usr/sbin/portmap -d
/usr/sbin/rpc.mountd -d all
/usr/sbin/rpc.nfsd -d -s
查看NFS配置與記錄日志:
cat /etc/exports
cat /var/lib/nfs/rmtab
cat /var/lib/nfs/etab
cat /var/lib/nfs/xtab
cat /var/lib/nfs/state
tail /var/log/messages
NFS內(nèi)核模塊調(diào)試
打開NFS模塊調(diào)試功能:
sysctl -w sunrpc.nfs_debug=2147483647
sysctl -w sunrpc.nfsd_debug=2147483647
查看NFS相關(guān)統(tǒng)計(jì)和日志:
cat /proc/slabinfo | grep nfs
/proc/fs/nfsfs/
nfsstat
dmesg
TCP/IP模塊調(diào)試
打開RPC模塊調(diào)試功能:
sysctl -w sunrpc.rpc_debug=2147483647
查看RPC相關(guān)統(tǒng)計(jì)和日志:
cat /var/run/portmap_mapping
cat /proc/net/rpc/nfs
cat /proc/net/rpc/nfsd
查看TCP/IP相關(guān)統(tǒng)計(jì)和配置:
ping // 查看網(wǎng)絡(luò)情況
netstat -tpwn | grep 2049 // 查看NFS TCP鏈接
cat /proc/sys/net/ipv4/... // 查看網(wǎng)絡(luò)配置,如tcp_retries2等
cat /proc/net/rpc/nfs
cat /proc/net/rpc/nfsd // deciles等字段
cat /proc/net/snmp // IP: ReasmFails等字段
網(wǎng)絡(luò)抓包:
tcpdump -s 9000 -w /tmp/dump.out port 2049
其他
nfs-utils移植
./configure
CC=XX-gcc
--build=$(./config.guess)
--host=mips64-unknown-linux-gnu
LDFLAGS="-L/usr/local/lib"
CPPFLAGS="-I/usr/local/include"
--disable-tirpc --disable-gss --disable-uuid --without-tcp-wrappers --with-gnu-ld
make
make install
文件系統(tǒng)導(dǎo)出條件
由NFS導(dǎo)出的文件系統(tǒng)由配置文件/etc/exports配置,可以導(dǎo)出的文件系統(tǒng)需要滿足如下2個(gè)條件:
文件系統(tǒng)必須有一個(gè)設(shè)備號(hào)(需要有FS_REQUIRES_DEV,即存儲(chǔ)設(shè)備)或FSID號(hào)(需要有NFSEXP_FSID 或 ->uuid)。
文件系統(tǒng)必須支持s_export_op接口。而支持s_export_op接口的文件系統(tǒng)都是存儲(chǔ)設(shè)備文件系統(tǒng),如ext3/4、ubifs等。其他文件系統(tǒng)如rootfs、ramfs、sysfs等是不支持的。
總結(jié)
以上是生活随笔為你收集整理的NFS (网络文件系统)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有些人买了新车系上红布带是什么意思
- 下一篇: 贵州部队发函到陕西安康市大概要多久时间?