1. NFS服務(wù)簡(jiǎn)介
NFS是Network File System 的縮寫(xiě)隆嗅,中文名稱為網(wǎng)絡(luò)文件系統(tǒng)功舀,由Sun公司開(kāi)發(fā)棺棵,功能是通過(guò)網(wǎng)絡(luò)讓不同的機(jī)器谒撼、不同的操作能夠彼此分享數(shù)據(jù)食寡,讓?xiě)?yīng)用程序在客戶端通過(guò)網(wǎng)戀過(guò)訪問(wèn)位于服務(wù)器磁盤(pán)中的數(shù)據(jù),是類(lèi)Unix系統(tǒng)間實(shí)現(xiàn)磁盤(pán)文件共享的一種方法廓潜。
NFS在文件傳送或信息傳送的過(guò)程中抵皱,依賴于RPC協(xié)議。RPC(Remote Procedure Call)辩蛋,中文名為遠(yuǎn)程過(guò)程調(diào)用呻畸,它是一種能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機(jī)制,可以說(shuō)NFS本身是使用RPC進(jìn)行通訊的一個(gè)程序悼院,凡是用到NFS的地方伤为,無(wú)論是NFS Server或者NFS Client,都需要開(kāi)啟RPC服務(wù)据途,這樣Server和Client才能通過(guò)RPC來(lái)實(shí)現(xiàn)PROGRAM PORT的對(duì)于绞愚,可以這么來(lái)理解,NFS是一個(gè)文件系統(tǒng)颖医,RPC是負(fù)責(zé)信息的傳輸位衩。
2. NFS安裝和配置
在Linux下,安裝NFS非常簡(jiǎn)單便脊,只需要
nfs-utils-* : 包含基本的NFS命令與監(jiān)控程序
portmap-* : 支持安全NFS RPC服務(wù)的連接
當(dāng)NFS服務(wù)啟動(dòng)后蚂四,它會(huì)有三個(gè)守護(hù)進(jìn)程來(lái)配合協(xié)調(diào)工作。
nfsd: 最基本的nfs守護(hù)進(jìn)程哪痰,主要功能是管理客戶端是否能夠登陸服務(wù)器并提供服務(wù)遂赠,使用端口為2049
mountd: RPC的守護(hù)進(jìn)程,主要功能是管理NFS文件系統(tǒng)晌杰,當(dāng)客戶端通過(guò)nfsd登陸成功NFS服務(wù)器后跷睦,還需要鑒權(quán)操作。鑒權(quán)依據(jù)NFS的配置文件
/etc/exports
portmap: 主動(dòng)進(jìn)行端口映射工作肋演,當(dāng)客戶端嘗試連接并且使用NFS時(shí)抑诸,portmap會(huì)將所管理NFS服務(wù)端口提供給客戶端烂琴,從而使客戶端可以通過(guò)該端口向服務(wù)器發(fā)出請(qǐng)求,使用端口為111蜕乡,在新版本中奸绷,portmap被rpcbind取代。
上面介紹了NFS的安裝和守護(hù)進(jìn)程层玲,一般來(lái)說(shuō)号醉,需要先配置好服務(wù)器,再配置好客戶端辛块,就可以正常工作畔派。 下面先介紹如何配置NFS服務(wù)器。
NFS的常用目錄
/etc/exports
/usr/sbin/exportfs NFS服務(wù)的管理命令
/usr/sbin/showmount 客戶端的查看命令
/var/lib/nfs/etab 記錄NFS分享出來(lái)的目錄的完整權(quán)限設(shè)定值
/var/lib/nfs/xtab 記錄曾經(jīng)登錄過(guò)的客戶端信息
NFS服務(wù)器的配置主要是對(duì)/etc/exports的配置润绵,其文件內(nèi)容格式如下:
共享目錄 有權(quán)訪問(wèn)共享目錄的主機(jī) 選項(xiàng)用來(lái)設(shè)置輸出目錄的訪問(wèn)權(quán)限(ro,rw)线椰、用戶映射等
用戶映射選項(xiàng):
- all_squash:將遠(yuǎn)程訪問(wèn)的所有普通用戶及所屬組都映射為匿名用戶或用戶組(nfsnobody);
- no_all_squash:與all_squash取反(默認(rèn)設(shè)置)尘盼;
- root_squash:將root用戶及所屬組都映射為匿名用戶或用戶組(默認(rèn)設(shè)置)憨愉;
- no_root_squash:與rootsquash取反;
- anonuid=xxx:將遠(yuǎn)程訪問(wèn)的所有用戶都映射為匿名用戶悔叽,并指定該用戶為本地用戶(UID=xxx)莱衩;
- anongid=xxx:將遠(yuǎn)程訪問(wèn)的所有用戶組都映射為匿名用戶組賬戶,并指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx)娇澎;
其他選項(xiàng):
- secure:限制客戶端只能從小于1024的tcp/ip端口連接nfs服務(wù)器(默認(rèn)設(shè)置)笨蚁;
- insecure:允許客戶端從大于1024的tcp/ip端口連接服務(wù)器;
- sync:將數(shù)據(jù)同步寫(xiě)入內(nèi)存緩沖區(qū)與磁盤(pán)中趟庄,效率低括细,但可以保證數(shù)據(jù)的一致性;
- async:將數(shù)據(jù)先保存在內(nèi)存緩沖區(qū)中戚啥,必要時(shí)才寫(xiě)入磁盤(pán)奋单;
- wdelay:檢查是否有相關(guān)的寫(xiě)操作,如果有則將這些寫(xiě)操作一起執(zhí)行猫十,這樣可以提高效率(默認(rèn)設(shè)置)览濒;
- no_wdelay:若有寫(xiě)操作則立即執(zhí)行,應(yīng)與sync配合使用拖云;
- subtree:若輸出目錄是一個(gè)子目錄贷笛,則nfs服務(wù)器將檢查其父目錄的權(quán)限(默認(rèn)設(shè)置);
- no_subtree:即使輸出目錄是一個(gè)子目錄宙项,nfs服務(wù)器也不檢查其父目錄的權(quán)限乏苦,這樣可以提高效率;
例如:將NFS Server 的/home/david/ 共享給192.168.1.0/24網(wǎng)段,權(quán)限讀寫(xiě),
配置文件/etc/exports添加一行: /home/david 192.168.1.0/24(rw)
配置好exports文件后汇荐,就可以啟動(dòng)NFS服務(wù)器洞就,nfs服務(wù)器程序依賴protmap和nfs程序,所以要先啟動(dòng)他們兩個(gè)掀淘。
執(zhí)行 service portmap[nfs] start 啟動(dòng)服務(wù)旬蟋,執(zhí)行service portmap[nfs] status查看服務(wù)狀態(tài)。
凡是修改/etc/exports文件后革娄,需要先執(zhí)行service portmap restart,在執(zhí)行service nfs restart咖为,就可以使設(shè)置的參數(shù)生效。
exportfs命令可以查看當(dāng)前nfs配置文件內(nèi)容稠腊。
exportfs [-aruv]
-a 全部掛載或卸載 /etc/exports中的內(nèi)容
-r 重新讀取/etc/exports 中的信息 ,并同步更新/etc/exports鸣哀、/var/lib/nfs/xtab
-u 卸載單一目錄(和-a一起使用為卸載所有/etc/exports文件中的目錄)
-v 在export的時(shí)候架忌,將詳細(xì)的信息輸出到屏幕上。
具體例子:
exportfs -au 卸載所有共享目錄
exportfs -rv 重新共享所有目錄并輸出詳細(xì)信息
用戶可以通過(guò)nfsstat來(lái)查看nfs的運(yùn)行狀態(tài)我衬,通過(guò)rpcinfo來(lái)檢測(cè)rpc運(yùn)行情況叹放,rpcinfo –p 查看哪些程序使用的RPC端口。
showmount 查看目前有多少客戶端連接挠羔。
停止NFS服務(wù)器井仰,執(zhí)行service nfs stop,是否停止protmap看系統(tǒng)中還有誰(shuí)在使用此服務(wù)來(lái)決定破加。
服務(wù)器端的NFS設(shè)置完成后俱恶,下面來(lái)設(shè)置客戶端的NFS。
mount NFS服務(wù)器IP:共享目錄 本地掛載目錄
例如: mount 192.168.1.108:/home/hao /mnt/ 表示將108服務(wù)器下的/home/hao目錄掛載到本地mnt目錄下范舀。
將 192.168.1.108:/home/hao /mnt nfs defaults 0 0 寫(xiě)入/etc/fstab文件合是,就可以讓系統(tǒng)開(kāi)機(jī)啟動(dòng)時(shí),自動(dòng)掛載NFS文件系統(tǒng)锭环。
掛載成功之后聪全,上述兩個(gè)目錄內(nèi)的文件保持同步變化。卸載已掛賬的NFS共享目錄umount /home/hao辅辩。
新版本上面难礼,已經(jīng)用rpcbind來(lái)代替portmap,用nfs-kernel-server來(lái)代替nfs玫锋。
上面介紹了nfs掛載的相關(guān)知識(shí)蛾茉,如果在共享目錄里面創(chuàng)建文件,那么這個(gè)文件屬于誰(shuí)呢景醇?這里面就牽涉到NFS的權(quán)限問(wèn)題臀稚,下面來(lái)介紹。
NFS的權(quán)限控制
同一個(gè)文件夾三痰,在兩個(gè)不同的Linux系統(tǒng)上可以進(jìn)行同時(shí)更改吧寺,創(chuàng)建窜管。如果A系統(tǒng)上是A用戶,B系統(tǒng)上是B用戶稚机,A用戶在自己目錄(非NFS共享目錄)下創(chuàng)建文件幕帆,文件的屬主屬于A,B用戶的屬于B赖条,這樣是沒(méi)有沖突的失乾。如果A和B都在NFS共享目錄里面創(chuàng)建文件,這又怎么來(lái)處理呢纬乍?
如果客戶端所在的共享目錄無(wú)法創(chuàng)建文件碱茁,原因可能是NFS服務(wù)器端的共享目錄本身的寫(xiě)權(quán)限沒(méi)有開(kāi)放給其他用戶,這可以通過(guò)chmod 777 –R 目錄來(lái)解決仿贬。
NFS有很多默認(rèn)的參數(shù)纽竣,打開(kāi)/var/lib/nfs/etab 查看分享文件夾的完整權(quán)限設(shè)定值。
root用戶創(chuàng)建文件的文件屬主和組默認(rèn)是nfsnobody茧泪,而普通用戶寫(xiě)入文件時(shí)就是自己的名字蜓氨,這保證了服務(wù)器的安全性
3. 在嵌入式領(lǐng)域的應(yīng)用
使用NFSROOT來(lái)啟動(dòng)開(kāi)發(fā)板,可以避免重復(fù)制作根文件系統(tǒng)(rootfs)鏡像以及燒寫(xiě)文件系統(tǒng)队伟,從而節(jié)省大量拷貝穴吹、傳送文件的操作,節(jié)省開(kāi)發(fā)時(shí)間嗜侮。
如何開(kāi)啟nfsroot功能港令?開(kāi)啟nfsroot功能需要具備如下幾個(gè)條件:
- 宿主機(jī)(一般為虛擬機(jī)里面的Linux系統(tǒng))要開(kāi)啟nfs server服務(wù)
2. 開(kāi)發(fā)板的網(wǎng)口要暢通
3. 開(kāi)發(fā)板的Linux內(nèi)核要支持nfsroot
1和2是硬件條件,一般都是支持的棘钞。第三項(xiàng)需要對(duì)內(nèi)核和uboot進(jìn)行相關(guān)設(shè)置才行缠借,下面來(lái)介紹:
首先,內(nèi)核配置里面宜猜,要選中有關(guān)NFSROOT的選項(xiàng)
選擇完畢后泼返,編譯運(yùn)行,然后燒寫(xiě)到Flash指定分區(qū)就行姨拥。這一步是讓kernel有能力去從nfs上掛載rootfs绅喉,但具體的路徑參數(shù)還不知道,剩下的需要通過(guò)配置uboot終端bootargs參數(shù)叫乌,這個(gè)參數(shù)會(huì)傳遞給kernel柴罐,kernel根據(jù)此參數(shù)去找具體的路徑并且掛載。下面介紹在Uboot中憨奸,啟動(dòng)nfs的相關(guān)參數(shù)
在Uboot命令行中革屠,輸入
setenv bootargs 'mem=64M console=ttyAMA0,115200
root=/dev/nfs rw nfsroot=192.168.4.165:/home/NFSROOT/rootfs_dir
ip=192.168.4.99:192.168.4.1:255.255.255.0
mtdparts=hi_sfc:256K(boot),256K(env),1792K(kernel),-(rootfs)'