佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)的基本使用教程

Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)的基本使用教程

熱門標(biāo)簽:服務(wù)器配置 百度競價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 家政服務(wù)網(wǎng)絡(luò) 外呼系統(tǒng) 硅谷的囚徒呼叫中心 美團(tuán) 電話機(jī)器人搭建 解決方案

0.什么是NFS(Network FileSystem)
    NFS 就是 Network FileSystem 的縮寫,最早之前是由 Sun 所發(fā)展出來的。他最大的功能就是可以透過網(wǎng)絡(luò),讓不同的機(jī)器、不同的操作系統(tǒng)、可以彼此分享個(gè)別的檔案 ( share file ),所以,也可以簡單的將他看做是一個(gè) file server !這個(gè) NFS Server 可以讓你的 PC 來將網(wǎng)絡(luò)遠(yuǎn)程的 NFS 主機(jī)分享的目錄,掛載到本地端的機(jī)器當(dāng)中,所以,在本地端的機(jī)器看起來,那個(gè)遠(yuǎn)程主機(jī)的目錄就好象是自己的 partition 一樣!
雖然 NFS 有屬于自己的協(xié)議與使用的 port number ,但是在資料傳送或者其它相關(guān)訊息傳遞的時(shí)候, NFS 使用的則是一個(gè)稱為遠(yuǎn)程過程調(diào)用( Remote Procedure Call, RPC )的協(xié)議來協(xié)助 NFS 本身的運(yùn)作!

1. NFS至少有兩個(gè)主要部分:一臺(tái)服務(wù)器和一臺(tái)(或者更多)客戶機(jī)??蛻魴C(jī)遠(yuǎ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è)軟件包)
命令

復(fù)制代碼
代碼如下:
#rpm –q nfs-utils portmap

查看NFS服務(wù)器是否啟動(dòng):
命令
復(fù)制代碼
代碼如下:
#service nfs starus
#service portmap status

如果服務(wù)器沒有啟動(dòng),則開啟服務(wù)(默認(rèn)服務(wù)下nfs沒有完全開啟)
命令
復(fù)制代碼
代碼如下:
#service nfs start
#service portmap start

2.RPC
    當(dāng)我們?cè)谑褂媚承┓?wù)來進(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ù)并沒有提供資料傳遞的協(xié)議,但是 NFS 卻能讓我們進(jìn)行檔案的分享,這其中的原因,就是 NFS 使用到一些其它相關(guān)的傳輸協(xié)議!而這些傳輸?shù)膮f(xié)議,就是使用到這個(gè)所謂的 RPC 的功能啰!這也就是說, NFS 本身就是使用 RPC 的一個(gè) program 就是了!說的更白話一點(diǎn), NFS 也可以視作是一個(gè) RPC server 啦!同時(shí)要注意到的是,在某些狀況中,不但跑 NFS 的 Server 需要激活 RPC 的服務(wù),連帶的,要掛載 NFS partition 的 Client 機(jī)器,也需要同步激活 RPC 才行!這樣 Server 端與 Client 端才能藉由 RPC 的協(xié)議來進(jìn)行 program port 的對(duì)應(yīng)喔!NFS 主要在管理分享出來的目錄,而至于資料的傳遞,就直接將他丟給 RPC 的協(xié)議來運(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 端順利的通過 rpc.nfsd 而登入主機(jī)之后,在他可以使用 NFS server 提供的檔案之前,還會(huì)經(jīng)過檔案使用權(quán)限 ( 就是那個(gè) -rwxrwxrwx 與 owner, group 那幾個(gè)權(quán)限啦 ) 的認(rèn)證程序!他會(huì)去讀 NFS 的設(shè)定檔 /etc/exports 來比對(duì) Client 的權(quán)限,當(dāng)通過這一關(guān)之后, Client 就可以取得使用 NFS 檔案的權(quán)限啦!(注:這個(gè)也是我們用來管理 NFS 分享之目錄的使用權(quán)限與安全設(shè)定的地方哩)

4.NFS需要有兩個(gè)套件才行,分別是:
 nfs-utils
 就是提供 rpc.nfsd 及 rpc.mountd 這兩個(gè) NFS daemons 與其它相關(guān) documents 與說明文件、執(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é)的!也就是說,在激活任何一個(gè) RPC server 之前,我們都需要激活 portmap 才行呢!那么這個(gè) portmap 到底在干嘛呢?就如同這個(gè)服務(wù)的名稱,哈哈!就是作 port 的 mapping 啊!舉個(gè)例子來說:當(dāng) Client 端嘗試來使用 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 ,好讓他可以連接上來 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è)分享的目錄來說,他就具有 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都可以訪問
 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)限問題
假設(shè)/etc/exports里面的內(nèi)容為

復(fù)制代碼
代碼如下:

#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開放寫入的話,那么就可以讀寫,并且寫入檔案的所有人是test。如果NFS主機(jī)的/home/public對(duì)于test這個(gè)使用者并沒有開放寫入權(quán)限時(shí),那就無法寫入,雖然/etc/exports里面是rw,也不起作用.
  c).在/home/test中,權(quán)限與/home/public有相同的狀態(tài),需要NFS主機(jī)的/home/test對(duì)于test有開放的權(quán)限.
  d).在/home/linux當(dāng)中,不論是何種的user,身份都會(huì)被變成UID=40的這個(gè)帳號(hào)
 情況二:如果我們?cè)?92.168.0.100的身份為test2,但是NFS主機(jī)卻沒有test2這個(gè)帳號(hào)時(shí)
  a).在/tmp下還是可以寫入,但是寫入的檔案所有人變成nobody.
  b).在/home/public與/home/test里面是否可以寫入,還需要看/home/public的權(quán)限而定,不過身份就被變成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

復(fù)制代碼
代碼如下:

#/etc/rc.d/init.d/portmap start
(or:
復(fù)制代碼
代碼如下:
#service portmap start
)

復(fù)制代碼
代碼如下:
#/etc/rc.d/init.d/nfs start
  (or:
復(fù)制代碼
代碼如下:
#service nfs start
)
 可以到/var/log/messages里面查看是否正確激活

9.exportfs的用法
 如果我們修改了/etc/exports后,并不需要重啟nfs服務(wù),只要用exportfs重新掃描一次/etc/exports,并且重新加載即可
 語法: exportfs [-aruv]
 -a: 全部掛載(或卸載) /etc/exports檔案內(nèi)的設(shè)定
 -r: 重新掛載/etc/exports里面的設(shè)定,也同步的更新/etc/exports和/var/lib/nfs/xtab里面的內(nèi)容
 -u:卸載某一目錄
 -v:在export的時(shí)候,將分享的目錄顯示到熒屏上.
 例子
 

復(fù)制代碼
代碼如下:

#exportfs -rv //重新export一次
#exportfs -au //全部卸載

10./var/lib/nfs/xtab里面可以查看每個(gè)目錄的分享權(quán)限(但是我怎么也沒有找到,靠,找到了,原來要有人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í)它說的是將 65536 - 2 的值,也就是 65534 的那個(gè) UID 啦!對(duì)照一下 /etc/passwd ,你就會(huì)發(fā)現(xiàn),哇!原來那就是 nobody 的啦

11.showmount命令
 語法: showmount [-ae] hostname
 -a: 顯示目前主機(jī)與client所連上來的使用目錄的狀態(tài)
 -e: 顯示hostname的/etc/exports里面共享的目錄

12.查看激活的portnumber

復(fù)制代碼
代碼如下:

#netstat -utln

 nfs 自己所開啟的 port ,就是那個(gè) 2049 的 port 啦!就是 NFS 主要產(chǎn)生的 port NFS server 在前面我們就提過了,他是 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 來呼叫需要的 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è)定
 
復(fù)制代碼
代碼如下:

#mount -t nfs hostname(orIP):/directory /mountpoint
   搞定,就這么簡單
 為了擔(dān)心會(huì)不小心將 NFS 端掛進(jìn)來的具有 SUID 權(quán)限檔案的程序執(zhí)行,root可以將NFS 所分享的目錄以較為安全的情況掛載進(jìn)來,可以
 
復(fù)制代碼
代碼如下:
#mount -t nfs -o nosuid,ro hostname:/directory /mountponit

可能出問題的地方:
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
 

復(fù)制代碼
代碼如下:

#service portmap start
#service nfs restart

3.被防火墻搞掉
 重新設(shè)置防火墻,包括iptables與TCP_Wrappers,因?yàn)榧せ盍藀ortmap,所以port 111必須提供出去.因此在iptables rules中,要增加:
 
復(fù)制代碼
代碼如下:

iptables -A INPUT -p TCP --dport 111 -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -j ACCEPT

 如果還不行,那就是TCP_Wrappers的問題,檢查/etc/hosts.deny,如果有一行是:
 
復(fù)制代碼
代碼如下:

ALL: ALL: deny

 那就必須在/etc/hosts.allow中增加:
 
復(fù)制代碼
代碼如下:

portmap: ALL: allow

 如果我們的NFS針對(duì)內(nèi)部網(wǎng)絡(luò)開發(fā),對(duì)于外部網(wǎng)絡(luò)只對(duì)學(xué)術(shù)網(wǎng)絡(luò)開發(fā)(140.0.0.0/8),可以:
 
復(fù)制代碼
代碼如下:

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 與名稱,例如
 
復(fù)制代碼
代碼如下:

#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)命令

復(fù)制代碼
代碼如下:

rpcinfo
#rpcinfo -p hostname(orIP)

 
要注意的問題:
 需要注意的是,由于 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è)東西!如果無法正確的將這兩個(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
 解決辦法:
 
復(fù)制代碼
代碼如下:

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.)

標(biāo)簽:南昌 韶關(guān) 撫州 臨沂 邢臺(tái) 北海 烏蘭察布 防城港

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux下NFS網(wǎng)絡(luò)文件系統(tǒng)的基本使用教程》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    白银市| 湟源县| 上高县| 盱眙县| 临清市| 三都| 孟州市| 淮滨县| 长宁区| 松江区| 田林县| 潼南县| 新龙县| 荆州市| 始兴县| 图们市| 屏南县| 临武县| 文登市| 奇台县| 潞西市| 金阳县| 桦川县| 齐河县| 尼玛县| 尚志市| 富锦市| 龙江县| 青河县| 灵武市| 田东县| 昔阳县| 静宁县| 商水县| 商南县| 昭苏县| 济南市| 玉树县| 岚皋县| 乐清市| 墨江|