簡易 NFS 伺服器設定
本文已不再維護,更新文章請參考此處
最近更新日期:2003/09/10
 
NFS為 Network FileSystem 的簡稱,最早之前是由 Sun 這家公司所發展出來的,他的目的就是想讓不同的機器、不同的作業系統可以彼此分享個別的檔案啦!目前在 Unix Like 當中用來做為 file server 是相當不錯的一個方案喔!基本上, Unix Like 主機連接到另一部 Unix Like 主機來分享彼此的檔案時,使用 NFS 要比 SAMBA 快速且方便的多了!此外, NFS 的設定真的很簡單,幾乎只要記得啟動 Remote Procedure Call 這個咚咚 ( 就是 portmap 這個套件啦! ) 就一定可以架設的起來!真是不錯啊!不過,如果要達成 Windows 與 Linux 之間的溝通,那麼還是以 SAMBA 比較容易啊!無論如何, NFS 還是可以做為小公司或學校單位內部 Unix Like 機器共享 file 的一個 Server 喔!
 
NFS 的由來與其功能
  :什麼是 NFS ( Network FileSystem )
  :什麼是 RPC ( Remote Procedure Call )
  :NFS 啟動的 RPC daemons
需要的套件
Server 端的設定
  :NFS 的套件結構
  :主機的規劃技巧建議
  :設定流程(/etc/exports)
  :RPC server 的相關指令
Client 端的設定
關機或結束時的注意事項
安全設定(被防火牆擋掉了)
實際演練
重點回顧
本章與 LPI 的關係
參考資源
本章習題練習

NFS 的由來與其功能
需要的套件
Server 端的設定:
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 來掛載時,就會無法掛載上,這個權限概念沒問題吧!那麼您可以試試看:
  2. [root @test root]# mount -t nfs localhost:/home/test /home/nfs
    mount: localhost:/home/test failed, reason given by server: Permission denied
    所以囉!如果您發現上面的顯示的訊息時,就表示您的主機權限不能夠進入該目錄囉!如果確定您的 IP 沒有錯誤,那麼請回到 /etc/exports 這個檔案中,針對您自己的 IP 來進行修正吧!
     
  3. 忘記啟動 portmap :

  4. 這個最容易被忘記了!就是忘記了啟動 portmap 這個服務啦!如果您發現您的 mount 的訊息是這樣:
    [root@test root]# mount -t nfs localhost:/home/test /home/nfs
    mount: RPC: Port mapper failure - RPC: Unable to receive
    或者是:
    [root@test root]# mount -t nfs 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
     
  5. 被防火牆擋掉了

  6. 這個也很容易忘記了!那就是重新設定一下您的防火牆,這包含了兩部份,包括 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
    果真如此的話,由於 portmap 是由 portmap 這個 daemon 所啟動的,所以您就必須要在 /etc/hosts.allow 裡面加入這一行:
    [root@test root]# vi /etc/hosts.allow
    portmap: ALL 
    或者是將 ALL 改成您所想要讓他使用 NFS 的網域即可!這樣說可以瞭解了嗎?若想進一步瞭解一下防火牆,請參考前面章節提過的:簡易防火牆建置

關機或結束時的注意事項:
需要注意的是,由於 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 使用他的家目錄啦!
實地演練:
好了,那麼請您先不要看底下的答案,先自己動筆或者直接在自己的機器上面動手作作看,等到得到您要的答案之後,在看底下的說明吧! 整個步驟大致上就是這樣吶!加油喔!

重點回顧
本章與 LPI 的關係
在 LPI 網站 http://www.lpi.org 裡面提到的,關於 NFS 的考試題庫的地方,只有在 LPI level 1 的 102 ,裡面的 topic 113 Networking Services ,第四點當中,簡易的 NFS 設定。強調的是『應試者需瞭解 NFS 的設定、啟動與關閉的關係』至於會考的檔案與指令可能有這些:

參考資源:
本章習題練習
簡易 NFS 伺服器機設定

2002/11/17:第一次完成
2003/03/09:修改部分內容,並且新增 LPI 相關性與重點整理部分!
2003/09/10:又重新修改版面,以及新增主機的規劃等部分。