Linux NFS服務詳解

來源:互聯網
上載者:User

1.什麼是NFS(Network FileSystem)
NFS
就是 Network FileSystem 的縮寫,最早之前是由 Sun
所發展出來的。他最大的功能就是可以透過網路,讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 ( share file
),所以,也可以簡單的將他看做是一個 file server 呢!這個 NFS Server 可以讓你的 PC 來將網路遠端 NFS
主機分享的目錄,掛載到本地端的機器當中,所以,在本地端的機器看起來,那個遠程主機的目錄就好象是自己的 partition 一般!
雖然 NFS 有屬於自己的協議與使用的 port number ,但是在資料傳送或者其它相關訊息傳遞的時候, NFS 使用的則是一個稱為遠端程序呼叫( Remote Procedure Call, RPC )的協議來協助 NFS 本身的運作!

2.RPC
當我們在使用某些服務來進行遠程聯機的時候,有些資訊,例如主機的IP、服務的 port number、與對應到的服務之
PID 等等,都需要管理與對應!這些管理 port 的對應與服務相關性的工作,就是這個 Remote Procedure Call, RPC
的任務了
NFS 本身的服務並沒有提供資料傳遞的協議,但是 NFS 卻能讓我們進行檔案的分享,這其中的原因,就是 NFS
使用到一些其它相關的傳輸協議!而這些傳輸的協議,就是使用到這個所謂的 RPC 的功能囉!這也就是說, NFS 本身就是使用 RPC 的一個
program 就是了!說的更白話一點, NFS 也可以視作是一個 RPC server 啦!同時要注意到的是,在某些狀況中,不但跑 NFS
的 Server 需要啟用 RPC 的服務,連帶的,要掛載 NFS partition 的 Client 機器,也需要同步啟用 RPC
才行!這樣 Server 端與 Client 端才能藉由 RPC 的協議來進行 program port 的對應喔!NFS
主要在管理分享出來的目錄,而至於資料的傳遞,就直接將他丟給 RPC 的協議來運作就是了!

3.NFS 啟用的 RPC daemons
o rpc.nfsd:這個 daemon 主要的功能就是在管理 Client 是否能夠登入主機的許可權啦,其中還包含這個登入者的 ID 的判別
o rpc.mountd:這個 daemon 主要的功能,則是在管理 NFS 的檔案系統!當 Client 端順利的通過 rpc.nfsd
而登入主機之後,在他可以使用 NFS server 提供的檔案之前,還會經過檔案使用許可權 ( 就是那個 -rwxrwxrwx 與 owner,
group 那幾個許可權啦 ) 的認證程式!他會去讀 NFS 的設定檔 /etc/exports 來比對 Client
的許可權,當通過這一關之後, Client 就可以取得使用 NFS 檔案的許可權啦!(註:這個也是我們用來管理 NFS
分享之目錄的使用許可權與安全設定的地方哩)

4.NFS需要有兩個套件才行,分別是:
nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 這兩個 NFS daemons 與其它相關 documents 與說明檔案、執行檔等的套件!這個就是 NFS 的主要套件
portmap
就如同剛剛提的到,我們的 NFS 其實可以被視為一個 RPC server program,而要啟用任何一個 RPC server
program 之前,我們都需要做好 port 的對應 ( mapping ) 的工作才行,這個工作其實就是『 portmap
』這個服務所負責的!也就是說,在啟用任何一個 RPC server 之前,我們都需要啟用 portmap 才行呢!那麼這個 portmap
到底在幹嘛呢?就如同這個服務的名稱,哈哈!就是作 port 的 mapping 啊!舉個例子來說:當 Client 端嘗試來使用 RPC
server 所提供的服務時,由於 Client 需要取得一個可以串連的 port 才能夠使用 RPC server 所提供的服務,因此,
Client 首先就會去跟 portmap 講『喂!可不可以通知一下,給我個 port number ,好讓我可以跟 RPC
聯絡吧!』這個時候 portmap 就自動的將自己管理的 port mapping 告知 Client ,好讓他可以串連上來 server
呢!所以囉:『啟用 NFS 之前,請先啟用 portmap !』

5.NFS server端的設定:
a)./etc/exports
分享的目錄 主機名稱1或IP1(參數1,參數2) 主機名稱2或IP2(參數3,參數4)
b).參數
rw: 可擦寫的許可權
ro: 唯讀許可權
no_root_squash: 登入 NFS 主機使用分享目錄的使用者,如果是 root 的話,那麼對於這個分享的目錄來說,他就具有 root 的許可權!這個項目『極不安全』,不建議使用!
root_squash: 在登入 NFS 主機使用分享之目錄的使用者如果是 root 時,那麼這個使用者的許可權將被壓縮成為匿名使用者,通常他的 UID 與 GID 都會變成 nobody 那個身份;
all_squash: 不論登入 NFS 的使用者身份為何,他的身份都會被壓縮成為匿名使用者,通常也就是 nobody 啦!
anonuid: 前面關於 *_squash 提到的匿名使用者的 UID 設定值,通常為 nobody,但是你可以自行設定這個 UID 的值!當然,這個 UID 必需要存在於你的 /etc/passwd 當中!
anongid: 同 anonuid ,但是變成 group ID 就是了
sync: 資料同步寫入到記憶體與硬碟當中
async: 資料會先暫存於記憶體當中,而非直接寫入硬碟

6.設定的執行個體:
a). /tmp *(rw,no_root_squash)   //*號表示所有的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) //只對某部機器設定許可權
d). /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)
//當*.linux.org登陸此NFS主機,並且在/home/linux下面寫入檔案時,該檔案的所有人與所有組,就會變成/etc/passwd
裡面對應的UID為40的那個身份的使用者了.

7.許可權問題
假設/etc/exports裡面的內容為
#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)
假設我們在192.168.0.100這個client端登陸此NFS主機(192.168.0.2),那麼
情況一:在192.168.0.100的帳號為test這個身份,同時,NFS主機上也有test這個帳號
   a).由於NFS主機的/tmp許可權為-rwxrwxrwt,所以我(test在192.168.0.100上)在/tmp下面具有存取的許可權,並且寫入檔案的所有人為test.
  
b).在/home/public中,由於我有讀寫的許可權,如果NFS主機在/home/public這個目錄的許可權對於test開放寫入的話,那麼就可
以讀寫,並且寫入檔案的所有人是test。如果NFS主機的/home/public對於test這個使用者並沒有開放寫入許可權時,那就無法寫入,雖然
/etc/exports裡面是rw,也不起作用.
   c).在/home/test中,許可權與/home/public有相同的狀態,需要NFS主機的/home/test對於test有開放的許可權.
   d).在/home/linux當中,不論是何種的user,身份都會被變成UID=40的這個帳號
情況二:如果我們在192.168.0.100的身份為test2,但是NFS主機卻沒有test2這個帳號時
   a).在/tmp下還是可以寫入,但是寫入的檔案所有人變成nobody.
   b).在/home/public與/home/test裡面是否可以寫入,還需要看/home/public的許可權而定,不過身份就被變成nobody了
   c)/home/linux下的身份還是變成UID=40的帳號.
情況三:在192.168.0.100的身份為root
   a).在/tmp裡面可以寫入,但是由於no_root_squash的參數,改變了預設的root_squash的設定值,所以在/tmp寫入檔案的所有人為root了.
   b).在/home/public底下的身份被壓縮成了nobody,因為預設的屬性都具有root_squash,所以檔案所有人就變成了nobody.
   c)./home/test情況與/home/public相同.
   d)./home/linux中,root的身份也被壓縮成UID=40的那個使用者了.

8.啟動服務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服務,只要用exportfs重新掃描一次/etc/exports,並且重新載入即可
文法: exportfs [-aruv]
-a: 全部掛載(或卸載) /etc/exports檔案內的設定
-r: 重新掛載/etc/exports裡面的設定,也同步的更新/etc/exports和/var/lib/nfs/xtab裡面的內容
-u:卸載某一目錄
-v:在export的時候,將分享的目錄顯示到熒屏上.
例子
#exportfs -rv //重新export一次
#exportfs -au //全部卸載

10./var/lib/nfs/xtab裡面可以查看每個目錄的分享許可權(但是我怎麼也沒有找到,靠,找到了,原來要有人mount上nfs後才會出現內容),如:
/tmp   
node3(ro,sync,wdelay,hide,secure,root_squash,no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
為什麼anonuid=-2呢?呵呵!其實它說的是將 65536 - 2 的值,也就是 65534 的那個 UID 啦!對照一下 /etc/passwd ,你就會發現,哇!原來那就是 nobody 的啦

11.showmount命令
文法: showmount [-ae] hostname
-a: 顯示目前主機與client所連上來的使用目錄的狀態
-e: 顯示hostname的/etc/exports裡面共用的目錄

12.查看啟用的portnumber
#netstat -utln
nfs 自己所開啟的 port ,就是那個
2049 的 port 啦!就是 NFS 主要產生的 port NFS server 在前面我們就提過了,他是 RPC server
的一種,而 NFS 由於提供了多個 program ( 例如 rpc.mountd, rpc.rquotad, rpc.nfsd... )
,因此就需要啟用多個 port 了!而且這些 port 是『隨機產生的』,也就是那個 port number 不會是固定的啦!每次
restart nfs 都會得到不一樣的 port number 呢!那麼 Client 端怎麼知道要串連上那個 port 來呼叫需要的
program 呢?呵呵!那就是 sunrpc ( port 111 ) 那個 portmap 服務所產生的 port number
的功用啦!Client 會先串連到 sunrpc 那個 port 去知道應該到那個 port 去呼叫所需要的程式!所以囉, rpc.xxxx
等之類的 daemon 自然就不需要有固定的 port number 囉!

***********************************************
NFS用戶端的設定
#mount -t nfs hostname(orIP):/directory /mountpoint   搞定,就這麼簡單
為了擔心會不小心將 NFS 端掛進來的具有 SUID 許可權檔案的程式執行,root可以將NFS 所分享的目錄以較為安全的情況掛載進來,可以
#mount -t nfs -o nosuid,ro hostname:/directory /mountponit

可能出問題的地方:
1.許可權的設定不符合
2.忘記了啟用portmap,此時會報錯:
mount: RPC: Port mapper failure - RPC: Unable to receive 或者
mount: RPC: Program not registered
那麼,啟動portmap,並且重新啟動nfs
#service portmap start
#service nfs restart
3.被防火牆搞掉
重新設定防火牆,包括iptables與TCP_Wrappers,因為啟用了portmap,所以port 111必須提供出去.因此在iptables rules中,要增加:
iptables -A INPUT -p TCP --dport 111 -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -j ACCEPT
如果還不行,那就是TCP_Wrappers的問題,檢查/etc/hosts.deny,如果有一行是:
   ALL: ALL: deny
那就必須在/etc/hosts.allow中增加:
   portmap: ALL: allow
如果我們的NFS針對內部網路開發,對於外部網路只對學術網路開發(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裡面規定連上 NFS 主機的主機 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的相關命令
rpcinfo
#rpcinfo -p hostname(orIP)

要注意的問題:
需要注意的是,由於 NFS 使用的這個 RPC 在 client
端連上主機時,那麼你的主機想要關機,那可就會成為『不可能的任務』!我還不知道正確的原因是什麼,但是,如果你的 Server 上面還有
Client 在聯機,那麼你要關機,可能得要等到數個鐘頭才能夠正常的關機成功!嗄!真的假的!不相信嗎?不然您自個兒試試看!
^_^!所以囉,建議您的 NFS Server 想要關機之前,能更先『關掉 portmap 與 nfs 』這兩個東西!如果無法正確的將這兩個
daemons 關掉,那麼先以 netstat -utlp 找出 PID ,然後以 kill
將他關掉先!這樣才有辦法正常的關機成功喔!這個請特別特別的注意呢!

在TurboLinux8.0 for AMD64 (kernel 2.4.21-4smp),mount NFS時候報錯為:
   portmap: server localhost not responding, timed out
解決辦法:
   mount -t nfs -o nolock node1:/public /public
即增加-o nolock參數,原因:
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.)

 

 

------------------------

當我用虛擬機器來mount區域網路中的一台機器的目錄時,出現mountd[5065]: refused mount request from 10.12.33.216 for
/home/hammer (/home/hammer): illegal port 62423 ? 但是我可以ping通,用區域網路中的其他機器也可以mount,後來知道是防火牆造成的,在/etc/exports中增加insecure即可

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.