您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何使用Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何使用Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)”吧!
0.什么是NFS(Network FileSystem)
NFS 就是 Network FileSystem 的縮寫,最早之前是由 Sun 所發(fā)展出來(lái)的。他最大的功能就是可以透過(guò)網(wǎng)絡(luò),讓不同的機(jī)器、不同的操作系統(tǒng)、可以彼此分享個(gè)別的檔案 ( share file ),所以,也可以簡(jiǎn)單的將他看做是一個(gè) file server !這個(gè) NFS Server 可以讓你的 PC 來(lái)將網(wǎng)絡(luò)遠(yuǎn)程的 NFS 主機(jī)分享的目錄,掛載到本地端的機(jī)器當(dāng)中,所以,在本地端的機(jī)器看起來(lái),那個(gè)遠(yuǎn)程主機(jī)的目錄就好象是自己的 partition 一樣!
雖然 NFS 有屬于自己的協(xié)議與使用的 port number ,但是在資料傳送或者其它相關(guān)訊息傳遞的時(shí)候, NFS 使用的則是一個(gè)稱為遠(yuǎn)程過(guò)程調(diào)用( Remote Procedure Call, RPC )的協(xié)議來(lái)協(xié)助 NFS 本身的運(yùn)作!
1. NFS至少有兩個(gè)主要部分:一臺(tái)服務(wù)器和一臺(tái)(或者更多)客戶機(jī)??蛻魴C(jī)遠(yuǎn)程訪問(wèn)存放在服務(wù)器上的數(shù)據(jù)。為了正常工作,一些進(jìn)程需要被配置并運(yùn)行。
NFS服務(wù)器的安裝:
檢查linux系統(tǒng)中是否安裝了nfs-utils和portmap兩個(gè)軟件包
(RHEL4系統(tǒng)默認(rèn)已經(jīng)安裝了這兩個(gè)軟件包)
命令
代碼如下:
#rpm –q nfs-utils portmap
查看NFS服務(wù)器是否啟動(dòng):
命令
代碼如下:
#service nfs starus
#service portmap status
如果服務(wù)器沒(méi)有啟動(dòng),則開(kāi)啟服務(wù)(默認(rèn)服務(wù)下nfs沒(méi)有完全開(kāi)啟)
命令
代碼如下:
#service nfs start
#service portmap start
2.RPC
當(dāng)我們?cè)谑褂媚承┓?wù)來(lái)進(jìn)行遠(yuǎn)程聯(lián)機(jī)的時(shí)候,有些信息,例如主機(jī)的IP、服務(wù)的 port number、與對(duì)應(yīng)到的服務(wù)之 PID 等等,都需要管理與對(duì)應(yīng)!這些管理 port 的對(duì)應(yīng)與服務(wù)相關(guān)性的工作,就是這個(gè) Remote Procedure Call, RPC 的任務(wù)了。NFS 本身的服務(wù)并沒(méi)有提供資料傳遞的協(xié)議,但是 NFS 卻能讓我們進(jìn)行檔案的分享,這其中的原因,就是 NFS 使用到一些其它相關(guān)的傳輸協(xié)議!而這些傳輸?shù)膮f(xié)議,就是使用到這個(gè)所謂的 RPC 的功能啰!這也就是說(shuō), NFS 本身就是使用 RPC 的一個(gè) program 就是了!說(shuō)的更白話一點(diǎn), NFS 也可以視作是一個(gè) RPC server 啦!同時(shí)要注意到的是,在某些狀況中,不但跑 NFS 的 Server 需要激活 RPC 的服務(wù),連帶的,要掛載 NFS partition 的 Client 機(jī)器,也需要同步激活 RPC 才行!這樣 Server 端與 Client 端才能藉由 RPC 的協(xié)議來(lái)進(jìn)行 program port 的對(duì)應(yīng)喔!NFS 主要在管理分享出來(lái)的目錄,而至于資料的傳遞,就直接將他丟給 RPC 的協(xié)議來(lái)運(yùn)作就是了!
3.NFS 激活的 RPC daemons
rpc.nfsd:這個(gè) daemon 主要的功能就是在管理 Client 是否能夠登入主機(jī)的權(quán)限啦,其中還包含這個(gè)登入者的 ID 的判別
rpc.mountd:這個(gè) daemon 主要的功能,則是在管理 NFS 的檔案系統(tǒng)!當(dāng) Client 端順利的通過(guò) rpc.nfsd 而登入主機(jī)之后,在他可以使用 NFS server 提供的檔案之前,還會(huì)經(jīng)過(guò)檔案使用權(quán)限 ( 就是那個(gè) -rwxrwxrwx 與 owner, group 那幾個(gè)權(quán)限啦 ) 的認(rèn)證程序!他會(huì)去讀 NFS 的設(shè)定檔 /etc/exports 來(lái)比對(duì) Client 的權(quán)限,當(dāng)通過(guò)這一關(guān)之后, Client 就可以取得使用 NFS 檔案的權(quán)限啦!(注:這個(gè)也是我們用來(lái)管理 NFS 分享之目錄的使用權(quán)限與安全設(shè)定的地方哩)
4.NFS需要有兩個(gè)套件才行,分別是:
nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 這兩個(gè) NFS daemons 與其它相關(guān) documents 與說(shuō)明文件、執(zhí)行檔等的套件!這個(gè)就是 NFS 的主要套件
portmap
就如同剛剛提的到,我們的 NFS 其實(shí)可以被視為一個(gè) RPC server program,而要激活任何一個(gè) RPC server program 之前,我們都需要做好 port 的對(duì)應(yīng) ( mapping ) 的工作才行,這個(gè)工作其實(shí)就是『 portmap 』這個(gè)服務(wù)所負(fù)責(zé)的!也就是說(shuō),在激活任何一個(gè) RPC server 之前,我們都需要激活 portmap 才行呢!那么這個(gè) portmap 到底在干嘛呢?就如同這個(gè)服務(wù)的名稱,哈哈!就是作 port 的 mapping 啊!舉個(gè)例子來(lái)說(shuō):當(dāng) Client 端嘗試來(lái)使用 RPC server 所提供的服務(wù)時(shí),由于 Client 需要取得一個(gè)可以連接的 port 才能夠使用 RPC server 所提供的服務(wù),因此, Client 首先就會(huì)去跟 portmap 講『喂!可不可以通知一下,給我個(gè) port number ,好讓我可以跟 RPC 聯(lián)絡(luò)吧!』這個(gè)時(shí)候 portmap 就自動(dòng)的將自己管理的 port mapping 告知 Client ,好讓他可以連接上來(lái) server 呢!所以啰:『激活 NFS 之前,請(qǐng)先激活 portmap !』
5.NFS server端的設(shè)定:
a)/etc/exports
分享的目錄 主機(jī)名稱1或IP1(參數(shù)1,參數(shù)2) 主機(jī)名稱2或IP2(參數(shù)3,參數(shù)4)
b).參數(shù)
rw: 可擦寫的權(quán)限
ro: 只讀的權(quán)限
no_root_squash: 登入 NFS 主機(jī)使用分享目錄的使用者,如果是 root 的話,那么對(duì)于這個(gè)分享的目錄來(lái)說(shuō),他就具有 root 的權(quán)限!這個(gè)項(xiàng)目『極不安全』,不建議使用!
root_squash: 在登入 NFS 主機(jī)使用分享之目錄的使用者如果是 root 時(shí),那么這個(gè)使用者的權(quán)限將被壓縮成為匿名使用者,通常他的 UID 與 GID 都會(huì)變成 nobody 那個(gè)身份;
all_squash: 不論登入 NFS 的使用者身份為何,他的身份都會(huì)被壓縮成為匿名使用者,通常也就是 nobody 啦!
anonuid: 前面關(guān)于 *_squash 提到的匿名使用者的 UID 設(shè)定值,通常為 nobody,但是你可以自行設(shè)定這個(gè) UID 的值!當(dāng)然,這個(gè) UID 必需要存在于你的 /etc/passwd 當(dāng)中!
anongid: 同 anonuid ,但是變成 group ID 就是了
sync: 資料同步寫入到內(nèi)存與硬盤當(dāng)中
async: 資料會(huì)先暫存于內(nèi)存當(dāng)中,而非直接寫入硬盤
6.設(shè)置的實(shí)例:
a)/tmp *(rw,no_root_squash) //*號(hào)表示所有的IP都可以訪問(wèn)
b)/tmp *(rw)
/home/public 192.168.0.*(rw) *(ro) //下面兩行作用一樣
/home/public 192.168.0.0/24(rw) *(ro)
c)/home/test 192.168.0.100(rw) //只對(duì)某部機(jī)器設(shè)置權(quán)限
d)/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40) //當(dāng)*.linux.org登陸此NFS主機(jī),并且在/home/linux下面寫入檔案時(shí),該檔案的所有人與所有組,就會(huì)變成/etc/passwd里面對(duì)應(yīng)的UID為40的那個(gè)身份的使用者了.
7.權(quán)限問(wèn)題
假設(shè)/etc/exports里面的內(nèi)容為
代碼如下:
#vi /etc/exports
/tmp *(rw,no_root_squash)
/home/public 192.168.0.*(rw) *(ro)
/home/test 192.168.0.100(rw)
/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)
假設(shè)我們?cè)?92.168.0.100這個(gè)client端登陸此NFS主機(jī)(192.168.0.2),那么
情況一:在192.168.0.100的帳號(hào)為test這個(gè)身份,同時(shí),NFS主機(jī)上也有test這個(gè)帳號(hào)
a).由于NFS主機(jī)的/tmp權(quán)限為-rwxrwxrwt,所以我(test在192.168.0.100上)在/tmp下面具有存取的權(quán)限,并且寫入檔案的所有人為test.
b).在/home/public中,由于我有讀寫的權(quán)限,如果NFS主機(jī)在/home/public這個(gè)目錄的權(quán)限對(duì)于test開(kāi)放寫入的話,那么就可以讀寫,并且寫入檔案的所有人是test。如果NFS主機(jī)的/home/public對(duì)于test這個(gè)使用者并沒(méi)有開(kāi)放寫入權(quán)限時(shí),那就無(wú)法寫入,雖然/etc/exports里面是rw,也不起作用.
c).在/home/test中,權(quán)限與/home/public有相同的狀態(tài),需要NFS主機(jī)的/home/test對(duì)于test有開(kāi)放的權(quán)限.
d).在/home/linux當(dāng)中,不論是何種的user,身份都會(huì)被變成UID=40的這個(gè)帳號(hào)
情況二:如果我們?cè)?92.168.0.100的身份為test2,但是NFS主機(jī)卻沒(méi)有test2這個(gè)帳號(hào)時(shí)
a).在/tmp下還是可以寫入,但是寫入的檔案所有人變成nobody.
b).在/home/public與/home/test里面是否可以寫入,還需要看/home/public的權(quán)限而定,不過(guò)身份就被變成nobody了
c)/home/linux下的身份還是變成UID=40的帳號(hào).
情況三:在192.168.0.100的身份為root
a).在/tmp里面可以寫入,但是由于no_root_squash的參數(shù),改變了預(yù)設(shè)的root_squash的設(shè)定值,所以在/tmp寫入檔案的所有人為root了.
b).在/home/public底下的身份被壓縮成了nobody,因?yàn)轭A(yù)設(shè)的屬性都具有root_squash,所以檔案所有人就變成了nobody.
c)./home/test情況與/home/public相同.
d)./home/linux中,root的身份也被壓縮成UID=40的那個(gè)使用者了.
8.啟動(dòng)服務(wù)portmap,nfs
代碼如下:
#/etc/rc.d/init.d/portmap start
(or:
代碼如下:
#service portmap start
)
代碼如下:
#/etc/rc.d/init.d/nfs start
(or:
代碼如下:
#service nfs start
)
可以到/var/log/messages里面查看是否正確激活
9.exportfs的用法
如果我們修改了/etc/exports后,并不需要重啟nfs服務(wù),只要用exportfs重新掃描一次/etc/exports,并且重新加載即可
語(yǔ)法: exportfs [-aruv]
-a: 全部掛載(或卸載) /etc/exports檔案內(nèi)的設(shè)定
-r: 重新掛載/etc/exports里面的設(shè)定,也同步的更新/etc/exports和/var/lib/nfs/xtab里面的內(nèi)容
-u:卸載某一目錄
-v:在export的時(shí)候,將分享的目錄顯示到熒屏上.
例子
代碼如下:
#exportfs -rv //重新export一次
#exportfs -au //全部卸載
10./var/lib/nfs/xtab里面可以查看每個(gè)目錄的分享權(quán)限(但是我怎么也沒(méi)有找到,靠,找到了,原來(lái)要有人mount上nfs后才會(huì)出現(xiàn)內(nèi)容),如:
/tmp node3(ro,sync,wdelay,hide,secure,root_squash,no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
為什么anonuid=-2呢?呵呵!其實(shí)它說(shuō)的是將 65536 - 2 的值,也就是 65534 的那個(gè) UID 啦!對(duì)照一下 /etc/passwd ,你就會(huì)發(fā)現(xiàn),哇!原來(lái)那就是 nobody 的啦
11.showmount命令
語(yǔ)法: showmount [-ae] hostname
-a: 顯示目前主機(jī)與client所連上來(lái)的使用目錄的狀態(tài)
-e: 顯示hostname的/etc/exports里面共享的目錄
12.查看激活的portnumber
代碼如下:
#netstat -utln
nfs 自己所開(kāi)啟的 port ,就是那個(gè) 2049 的 port 啦!就是 NFS 主要產(chǎn)生的 port NFS server 在前面我們就提過(guò)了,他是 RPC server 的一種,而 NFS 由于提供了多個(gè) program ( 例如 rpc.mountd, rpc.rquotad, rpc.nfsd... ) ,因此就需要激活多個(gè) port 了!而且這些 port 是『隨機(jī)產(chǎn)生的』,也就是那個(gè) port number 不會(huì)是固定的啦!每次 restart nfs 都會(huì)得到不一樣的 port number 呢!那么 Client 端怎么知道要連接上那個(gè) port 來(lái)呼叫需要的 program 呢?呵呵!那就是 sunrpc ( port 111 ) 那個(gè) portmap 服務(wù)所產(chǎn)生的 port number 的功用啦!Client 會(huì)先連接到 sunrpc 那個(gè) port 去知道應(yīng)該到那個(gè) port 去呼叫所需要的程序!所以啰, rpc.xxxx 等之類的 daemon 自然就不需要有固定的 port number 啰!
NFS客戶端的設(shè)定
代碼如下:
#mount -t nfs hostname(orIP):/directory /mountpoint
搞定,就這么簡(jiǎn)單
為了擔(dān)心會(huì)不小心將 NFS 端掛進(jìn)來(lái)的具有 SUID 權(quán)限檔案的程序執(zhí)行,root可以將NFS 所分享的目錄以較為安全的情況掛載進(jìn)來(lái),可以
代碼如下:
#mount -t nfs -o nosuid,ro hostname:/directory /mountponit
可能出問(wèn)題的地方:
1.權(quán)限的設(shè)定不符合
2.忘記了激活portmap,此時(shí)會(huì)報(bào)錯(cuò):
mount: RPC: Port mapper failure - RPC: Unable to receive 或者
mount: RPC: Program not registered
那么,啟動(dòng)portmap,并且重新啟動(dòng)nfs
代碼如下:
#service portmap start
#service nfs restart
3.被防火墻搞掉
重新設(shè)置防火墻,包括iptables與TCP_Wrappers,因?yàn)榧せ盍藀ortmap,所以port 111必須提供出去.因此在iptables rules中,要增加:
代碼如下:
iptables -A INPUT -p TCP --dport 111 -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -j ACCEPT
如果還不行,那就是TCP_Wrappers的問(wèn)題,檢查/etc/hosts.deny,如果有一行是:
代碼如下:
ALL: ALL: deny
那就必須在/etc/hosts.allow中增加:
代碼如下:
portmap: ALL: allow
如果我們的NFS針對(duì)內(nèi)部網(wǎng)絡(luò)開(kāi)發(fā),對(duì)于外部網(wǎng)絡(luò)只對(duì)學(xué)術(shù)網(wǎng)絡(luò)開(kāi)發(fā)(140.0.0.0/8),可以:
代碼如下:
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
還可以使用TCP_Wrappers,在/etc/hosts.allow里面規(guī)定連上 NFS 主機(jī)的主機(jī) IP 與名稱,例如
代碼如下:
#vi /.etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 :allow
portmap: 140.113.23.23 :allow
portmap: .sdu.edu.cn :allow
RPC Server的相關(guān)命令
代碼如下:
rpcinfo
#rpcinfo -p hostname(orIP)
要注意的問(wèn)題:
需要注意的是,由于 NFS 使用的這個(gè) RPC 在 client 端連上主機(jī)時(shí),那么你的主機(jī)想要關(guān)機(jī),那可就會(huì)成為『不可能的任務(wù)』!我還不知道正確的原因是什么,但是,如果你的 Server 上面還有 Client 在聯(lián)機(jī),那么你要關(guān)機(jī),可能得要等到數(shù)個(gè)鐘頭才能夠正常的關(guān)機(jī)成功!嗄!真的假的!不相信嗎?不然您自個(gè)兒試試看! ^_^!所以啰,建議您的 NFS Server 想要關(guān)機(jī)之前,能更先『關(guān)掉 portmap 與 nfs 』這兩個(gè)東西!如果無(wú)法正確的將這兩個(gè) daemons 關(guān)掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 將他關(guān)掉先!這樣才有辦法正常的關(guān)機(jī)成功喔!這個(gè)請(qǐng)?zhí)貏e特別的注意呢!
在TurboLinux8.0 for AMD64 (kernel 2.4.21-4smp),mount NFS時(shí)候報(bào)錯(cuò)為:
portmap: server localhost not responding, timed out
解決辦法:
代碼如下:
mount -t nfs -o nolock node1:/public /public
即增加-o nolock參數(shù),原因:
Unfsd doesn't support NLM locking, and it's causing the lockd daemon to be started (which again requires the portmapper to be installed etc.)
到此,相信大家對(duì)“如何使用Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。