鳥哥的 Linux ADSL 私房菜


簡易 NFS 伺服器機設定
最近更新日期:2002/11/16
NFS 的由來與其功能
  什麼是 NFS ( Network FileSystem )
  什麼是 RPC ( Remote Procedure Call )
  NFS 啟動的 RPC daemons
需要的套件
Server 端的設定
Client 端的設定
RPC server 的相關指令
關機或結束時的注意事項
安全設定(被防火牆擋掉了)
實際演練

NFS 的由來與其功能

需要的套件
Server 端的設定:
前面對於 NFS 稍微解釋了一下,哇!怎麼看起來好像粉難喔!其實一點也不!為什麼呢?因為 portmap 只要一支 scripts 就可以啟動, NFS 只要設定一個檔案就可以順利運作!那麼怎麼能說不簡單呢!呵呵!這個 NFS 真是他 X 的太太太.....簡單了∼在開始 NFS 之前,讓我們先以 Windows 的系統當中的『資源分享』來說明一下整個流程吧:
  1. 在 Windows Server 上面,開啟檔案總管,在某個目錄上面按右鍵選擇啟動資源分享;
  2. 在資源分享的內容當中,需要設定『使用者權限』( 以 Windows 2000 為例 );
  3. 在 Client 端需要登入 Windows server 時,需要啟動『網路上的芳鄰』來尋找可用的網路上面分享的目錄,然後點選該目錄,若可以登入該 Windows server 時,則可以依據步驟一的權限使用該目錄下的檔案!
呵呵!沒錯! NFS 的整個流程也差不多是這樣: 哈哈!果然很簡單吧!所以底下我們就來一個一個步驟的說明一下 NFS 怎麼設定囉:
  1. 系統需求
  2. /etc/exports
  3. 關於權限問題
  4. 啟動服務 portmap, nfsd
  5. exportfs
  6. 檢驗目錄 /var/lib/nfs/xtab
  7. showmount
  8. 觀察啟動的 port number
OK!每個咚咚的細部項目就來談一談吧:

Client 端的設定:
OK啦!所以我們得先知道一下我們的主機裡面有什麼?假設我的主機名稱是 test.linux.org ,那麼我要知道裡頭有些什麼藉由 NFS 分享出來的目錄,就給他 showmount 一下囉!
 
[root @test root]# showmount -e test.linux.org
Export list for localhost:
/tmp         *
/home/linux  *.linux.org
/home/public (everyone)
/home/test   192.168.0.100
 
然後呢?假設我要將 /home/public 掛載在我的 /home/nfs/public 底下,那麼我就得先有這個目錄才行呀!然後再利用 mount 這個指令來掛載 /home/public 這個目錄!有點像這樣:
 
[root @test root]# mkdir -p /home/nfs/public  <==建立 public 這個目錄,加 -p 可以持續增加目錄
[root @test root]# mount -t nfs test.linux.org:/home/public /home/nfs/public
掛載的格式:
[root @test root]# mount -t nfs hostname(orIP):/directory /mount/point
[root @test root]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda1              1904920   1235380    572776  69% /
/dev/hdb1               976344    115212    810736  13% /backup
test.linux.org:/home/public
                       1904920   1235376    572776  69% /home/nfs/public <==這個是遠端主機的容量
 
先注意一下掛載 NFS 檔案的格式範例喔!呵呵!這樣就可以將資料掛載進來啦!請注意喔!以後,只要你進入你的目錄 /home/nfs/public 就等於到了 test.linux.org 那部遠端主機的 /home/public 那個目錄中囉!很不錯吧!那麼如何將掛載的 NFS 目錄卸載呢?就使用 umount 啊!
 
[root @test root]# umount /home/nfs/public
 
可能發生的問題
通常無法掛載的原因有底下這幾個:
  1. 使用者的權限不符:以上面的例子來說明,我的 /home/test 只能提供 192.168.0.0/24 這個網域,所以,如果我在 test.linux.org 這部機器中,以 localhost 來掛載時,就會無法掛載上,這個權限概念沒問題吧!那麼你可以試試看:
    [root @test root]# mount -t localhost:/home/test /home/nfs
    mount: localhost:/home/test failed, reason given by server: Permission denied
    所以囉!如果你發現上面的顯示的訊息時,就表示你的主機權限不能夠進入該目錄囉!如果確定你的 IP 沒有錯誤,那麼請回到 /etc/exports 這個檔案中,針對你自己的 IP 來進行修正吧!
     
  2. 忘記啟動 portmap :
    這個最容易被忘記了!就是忘記了啟動 portmap 這個服務啦!如果你發現你的 mount 的訊息是這樣:
    [root @test root]# mount -t localhost:/home/test /home/nfs
    mount: RPC: Port mapper failure - RPC: Unable to receive
    或者是:
    [root @test root]# mount -t localhost:/home/test /home/nfs
    mount: RPC: Program not registered
    那麼就趕緊將 portmap 啟動吧!!並且也需要將 nfs 重新啟動喔!
    [root @test root]# /etc/rc.d/init.d/portmap start
    [root @test root]# /etc/rc.d/init.d/nfs restart
     
  3. 被防火牆擋掉了
    這個也很容易忘記了!那就是重新設定一下你的防火牆,這包含了兩部份,包括 iptables 與 TCP_Wrappers !因為我們啟動了 portmap ,這個東西有兩個資料需要分享出來,一個是 port 111 需要提供出去,因此你的 iptables 規則當中,需要開放這個 port 喔!有點像這樣的幾行字要加入你的 iptables rules 當中:
    iptables -A INPUT -p TCP --dport 111 -j ACCEPT
    iptables -A INPUT -p UDP --dport 111 -j ACCEPT
    如果你已經開放了這個 port 的連接權限,卻還是無法連接成功,那麼應該就是 TCP_Wrappers 的問題了!檢查一下你的 /etc/hosts.deny 裡頭是否有這行:
    [root @test root]# vi /etc/hosts.deny
    ALL: ALL: deny
    果真如此的話,由於 portmap 是由 portmap 這個 daemon 所啟動的,所以你就必須要在 /etc/hosts.allow 裡面加入這一行:
    [root @test root]# vi /etc/hosts.allow
    portmap: ALL : allow
    或者是將 ALL 改成你所想要讓他使用 NFS 的網域即可!這樣說可以瞭解了嗎?若想進一步瞭解一下防火牆,請參考:簡易防火牆建置

RPC server 的相關指令:
好了,既然我們知道這個 NFS 其實使用的是 RPC 這個咚咚,所以當然要知道 RPC 的每個 port 在幹什麼呀!這個時候,就不能不知道 rpcinfo 這個指令了!先來談一談這個指令的用法吧!
 
語法:
[root @test root]# rpcinfo [-p] hostname(orIP)
-p :顯示所有的 port 與 program 的資訊!
範例:
[root @test root]# rpcinfo -p test.linux.org
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp   1014  rquotad
    100011    2   udp   1014  rquotad
    100011    1   tcp   1017  rquotad
    100011    2   tcp   1017  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100021    1   udp   1339  nlockmgr
    100021    3   udp   1339  nlockmgr
    100021    4   udp   1339  nlockmgr
    100005    1   udp   1340  mountd
    100005    1   tcp   1271  mountd
    100005    2   udp   1340  mountd
    100005    2   tcp   1271  mountd
    100005    3   udp   1340  mountd
    100005    3   tcp   1271  mountd

這樣就可以知道每個 port number 所對應的 program 囉!您也就知道這個 RPC server 提供給你的 program 是什麼了!當然了,要讓這個 rpcinfo 可以正確的動作,你的 portmap 得真的動起來才行吶!加油囉!


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

安全設定(被防火牆擋掉了):
好了!一些注意事項講完了之後,再來呢?對了!又是最重要的安全設定方面的問題了!那麼 NFS 可以設定安全的地方有哪裡呢?其實還不少呢?由外而內可以這樣看:
  1. iptables 防火牆設定;
  2. TCP_Wrappers 防火牆設定;
  3. /etc/exports 權限設定。
防火牆的基本概念請參考『簡易防火牆建置』一文,最好能將該篇文章給他看完,否則還真難瞭解底下在幹嘛∼嗯!假設您已經看完該篇短文了,接著下來我們就得要一步一步的接著建立防火牆囉! 通常我們都會約略的建議,不要啟動 NFS Server ,即使要啟動,最好也是針對某個範圍來進行目錄的分享!並且,『要分使用者層級來管理』會比較好一些喔!底下我們就來實際的在您的機器上面搞一個簡單的 NFS server 吧!

實際演練:
假設環境:
  1. 假設我的 Linux 主機為 192.168.0.100 這一部;
  2. 預計將 /tmp 以可讀寫,並且不限制使用者身份的方式分享給所有 192.168.0.0/24 這個網域中的所有 Linux 工作站;
  3. 預計開放 /home/nfs 這個目錄,使用的屬性為唯讀,可提供除了網域內的工作站外,向外亦提供資料內容;
  4. 預計開放 /home/upload 做為 192.168.0.0/24 這個網域的資料上傳目錄,其中,這個 /home/upload 的使用者及所屬群組為 nfs-upload 這個名字,他的 UID 與 GID 均為 210;
  5. 預計將 /home/andy 這個目錄僅分享給 192.168.0.50 這部 Linux 主機,以提供該主機上面 andy 這個使用者來使用,也就是說, andy 在 192.168.0.50 及 192.168.0.100 均有帳號,且帳號均為 andy ,所以預計開放 /home/andy 給 andy 使用他的家目錄啦!
實地演練:
好了,那麼請你先不要看底下的答案,先自己動筆或者直接在自己的機器上面動手作作看,等到得到你要的答案之後,在看底下的說明吧! 整個步驟大致上就是這樣吶!加油喔!
2002/11/17以來統計人數


Designed by VBird during 2001-2003.  Aerosol Lab.