[Power by FreeBSD]
顏國雄 2003/08/17 初
NFS (Network File System)
2003/08/18 修改 

1. 認識 NFS

NFS (Network File System) 可以讓使用者透過網路來分享主機上的目錄和檔案,在大部份的 Unix like 的系統中都可以提供這項當初由 Sun Microsystems 所發展出來的網路服務,甚至在非 Unix like 的系統也可以使用 NFS 。它的架構是由 NFS server 將目錄分享出來後,clients 端透過網路將 server 的資源 mount 在目錄樹中,用起來就像是本機的檔案系統一樣。在 MS Windows 網路芳鄰的分享也可以達到類似的功能。

使用 NFS 的好處是可以讓磁磁空間得到較高的使用率,如果機器的磁碟空間較少甚至沒有硬碟,都可以利用有較大磁碟空間的 NFS server 上的資源。另外,也可以實現集中管理的的好處。

不過一般基於安全的考量,NFS 建議應用在小範圍而且無安全顧慮的區網中較佳,特別是不建議將服務開放給 Internet 上的機器來存取。

2. 建置 NFS 服務

由於 NFS 是 FreeBSD 系統中即內建的,程式的部份不用再安裝什麼,只需在 /etc/rc.conf 中增加幾個開啟服務的選項,讓它可以在下次開機時自動將服務程式執行(當然我們也可以直接下命令馬上執行),如果要當 server 則需要多設定一個資源分享清單的檔案 (/etc/exports)。

NFS 是由好幾支 daemons 合作來提供服務的,有的提供 server 的功能,有的提供 client 的功能,下面是在 FreeBSD 中和 NFS 相關的 daemons:

  • portmap:client 端及 server 端都需要執行
  • mountd:server 端需要執行
  • nfsd:server 端需要執行
  • nfsiod:client 端需要執行
  • rpc_lockd:server 端執行
  • rpc_statd:server 端執行
  • amd:client 端執行

在 FreeBSD 和 NFS 有關的設定檔如下:

  • /etc/rc.conf:前述 daemons 啟動的設定 (server & client)
  • /etc/exports:分享資源的設定 (server)
  • /etc/fstab:可設定自動掛載 NFS 資源 (client)

 

2.1 NFS Server 的設定

當我們要提供 NFS 服務給 clients 端使用時,至少需要啟動三個 daemons:portmap , mountdnfsd,另外相關的還有 rpc_lockd , rpc_statd

如果要讓 FreeBSD 在開機時自動啟動上述的三個 daemons 只要先編輯好 /etc/exports (這個檔原本是不存在的,設定方法參考後面的說明),然後在 /etc/rc.conf 中加入下面三行即可:


  portmap_enable="YES"
  nfs_server_enable="YES"
  nfs_reserved_port_only="YES"

2.1.1 portmap

portmap 這個 daemon 的主要任務是將 RPC 程式的 program numbers 轉換成 DARPA protocol 的 port numbers。簡單的說,在 RPC 程式啟動後會向 portmap 註冊,當 client 端需要服務時會向它查詢,因為 NFS 是屬於 RPC 的服務之一,所以無論是 NFS server 還是 NFS client 都必須先啟動 portmap 才可以正常運作。

2.1.1.1 啟動 portmap

在 FreeBSD 上要啟動 portmap 只要在 /etc/rc.conf 中加入一行:

portmap_enable="YES"

即可讓系統在開機的過程中由 /etc/rc.network 自動執行。

如果想要馬上啟動則可以執行 (需 root 的身份)下面的指令:

/usr/sbin/portmap

2.1.1.2 確認 portmap 是否執行

想知道 portmap 有沒有在跑,最簡單的就是用 ps aux | grep portmap 來查,例如:


ps aux | grep portmap
daemon   561  0.0  0.9   944  540  ??  Is    9:55AM   0:00.01 portmap

如果有出現第二行的 daemon xxx ........ 即表示已經在執行。

2.1.1.3 增強 portmap 的安全

由於所的 RPC 服務都需要用到 portmap ,基於安全考量我們可以利用 tcpwrapper 管制可連線的機器,例如:只想讓本機 (127.0.0.1) 及 自己管的區網(192.168.1.0/255.255.255.0) 可連線就可以在 /etc/hosts.allow 加入下列幾行:


  portmap : 127.0.0.1 : allow
  portmap : 192.168.1.0/255.255.255.0 : allow
  portmap : ALL : deny

加的時候要注意:FreeBSD 的 /etc/hosts.allow 有 first match 的規則,而預設放在最上面第一條居然是 ALL : ALL : allow ,也就是全部放行了,加在它後面的規則都無法發揮作用,所以上述的三行一定要加在 ALL : ALL : allow 的前面才行。

2.1.2 mountd

mountd 也是 NFS servers 必備的 daemon,它主要用來處理 client 端送來的 mount 請求,在 FreeBSD 的啟動流程中,如果 nfs_server_enable="YES" 的話,系統會去檢查 /etc/exports 是否存在,檔案存在就會自動執行 mountd ,而 mountd 會去讀取裡面的設定值。

2.1.2.1 啟動 mountd

如果希望 FreeBSD 自行啟動 mountd 只要在 /etc/rc.conf 中加入一行:

nfs_server_enable="YES"

即可在開機的過程中由 /etc/rc.network 自動執行。

不過,如果 /etc/rc.network 找不到 /etc/exports 這個檔案的話,我們只好在編寫完該檔案後自行執行 (需 root 的身份)下面的指令:

/usr/sbin/mountd -r

2.1.2.2 確認 mountd 是否執行

想知道 mountd 有沒有在跑,最簡單的就是用 ps aux | grep mountd 來查,例如:


ps aux|grep mountd
root     752  0.0  0.5   524  308  ??  Ss   11:08AM   0:00.01 mountd -r

如果有出現第二行的 root xxx ........ 即表示已經在執行。

2.1.2.3 讓 mountd 重新讀取 /etc/exports

mountd 在啟動時會讀取 /etc/exports 的設定,如果 daemon 已經在跑,修改完 /etc/exports 我們可以執行 (需 root 的身份) 下列的指令通知它重新讀取:

kill -HUP `cat /var/run/mountd.pid`

說明:上面的『 `』 在鍵盤上是 Esc 下方那個按鍵 (和毛毛蟲同按鍵)。

2.1.3 nfsd

要架設 NFS server,nfsd 當然是必備的 daemon,FreeBSD 預設會啟動四個 nfsd 等著服務 (可由 /etc/rc.conf 中的 nfs_client_flags 來控制)。

2.1.3.1 啟動 nfsd

開機時要讓系統自動啟動就在 /etc/rc.conf 中加入:

nfs_server_enable="YES"

如果想手動啟動則可以執行下列的指令:

/sbin/nfsd -n 4

2.1.3.2 確認 nfsd 是否執行

我們可以用 ps ax | grep nfsd 來確認 nfsd 有執行,例如:


ps ax | grep nfsd
  862  ??  I      0:00.00 nfsd: server (nfsd)
  863  ??  I      0:00.00 nfsd: server (nfsd)
  864  ??  I      0:00.00 nfsd: server (nfsd)
  865  ??  I      0:00.00 nfsd: server (nfsd)

如果有出現第二行起的 ........ (nfsd) 即表示已經在執行。

2.1.3.3 增加 nfsd 的安全

另外,為了增增系統的安全,讓 nfsd 執行時只使用 reserved port (小於 1024 的 ports) ,建議在 /etc/rc.conf 加入下面這行:

nfs_reserved_port_only="YES"

2.1.4 設定要分享的目錄 (/etc/exports)

NFS server 到底釋放哪些目錄分享?又哪些 clients 可以 mount ?完全由 /etc/exports 控制,要想知道裡面如何設定,最好的方法就是 man exports 囉!

/etc/exports 中主要可分為兩種欄位:左邊是要分享的目錄,右邊則為選項(選項的開頭是減號 - ),常見的選項有:

  • clients 以 root 存檔時 server 要以等號後的身份儲存:-maproot=user
  • clients 存檔時,無論誰存的通通以後面身份儲存:-mapall=user
  • 讓分享出去的 FileSystem 中的目錄都可以當 clients mount 的路徑:-alldirs
  • 指定網路:-network=192.168.2
  • 指定網路的 netmask:-mask=255.255.255.0
  • 讓分享的目錄只能唯讀,clients 無法寫入:-ro

例如:


/usr/src  /usr/obj  -ro 192.168.1.3 192.168.1.4
/tftpboot -ro -maproot=0 -network=192.168.1 -mask=255.255.255.0

第一行設定將 /usr/src 及 /usr/obj 分享給 192.168.1.3 和 192.168.1.4 而且是唯讀的。
第二行設定則把 /tftpboot 分享給 192.168.1.0/255.255.255.0 上的機器而且是唯讀的,client 端無法寫入。

每次修改完 /etc/exports 後記得要通知 mountd 重新讀取才會生效,可以執行:

kill -HUP `cat /var/run/mountd.pid`

說明:上面的『 `』 在鍵盤上是 Esc 下方那個按鍵 (和毛毛蟲同按鍵)。

 

2.2 NFS Clients 的設定

對 NFS clients 來說,只需要在 /etc/rc.conf 中加入兩行,FreeBSD 在開機時會檢查 kernel 是否有將 NFS FileSystem 的選項啟動,如果沒有就會自動以 kldload 將 nfs 的 module 載入,然後把需啟動 daemon nfsiod 自動執行。

要當 NFS client 就在 /etc/rc.conf 中加入下面這兩行:


  portmap_enable="YES"
  nfs_client_enable="YES"

2.2.1 nfsiod

NFS clients 除了要執行 portmap 外,另外 nfsiod 則負責處理和 NFS 主機連線時的 I/O 同步問題,它可以增加整個服務的效能。在 /etc/rc.conf 中加入那行 nfs_client_enable="YES" ,開機時 /etc/rc.network 即會自動啟動 nfsiod

2.2.2 查詢 NFS server 上提供的資源

利用 showmount 這道指令我們可以用來查詢 NFS servers 到底分享了什資源,假設 NFS server 叫 server1 ,我們可以執行:

  • 查出 server1 分享的資源:showmount -e server1
  • 查出 server1 上 clients 正在使用的資源:showmount -a server1

 

2.2.2 mount 和 /etc/fstab

在 NFS server 及 client 該啟動的 daemons 都執行後,我們就可以用 mount 將 server 分享出來的資源掛 (mount) 在現有的目錄樹中,例如:server1 上分享了 /usr/src 及 /usr/obj ,我們可以用下面的指令掛在 /usr/src 和 /usr/obj 上

mount -t nfs server1:/usr/src /usr/src
mount -t nfs server1:/usr/obj /usr/obj

如果 client 端希望以後開機時可以自動 mount 上來,可將參數加入 /etc/fstab 中,以前例來說,我們可以在 /etc/fstab 中加入下面兩行:


server1:/usr/src            /usr/src        nfs     ro       0       0
server1:/usr/obj            /usr/obj        nfs     ro       0       0

如果 NFS server 分享出來的目錄可以寫入,上面的 ro 記得改成 rw

3. 相關資料

關於 NFS 的詳細資料可以查看:

FreeBSD HandBooks 的第十九章

相關手冊 (man):nfsd , exports , fstab , mount_nfs , mountd , portmap , nfsiod , rpc.lockd , rpc_statd , rpc.rquotad , amd , hosts_access(5)


 


 基礎: 書籤 - 簡介 - 安裝 - Slices - Unix基礎 - 基本指令 - 首次登入 - 目錄架構
 系統: 核心編譯 - 系統升級 - Packages - Ports - PicoBSD - Quota
 網路: 服務管理 - WWW - FTP - MAIL - DNS - Samba - NFS - DHCP - webmin - IMP - OpenWebmail
 其它: Backup - UPS - 系統安全 - ipfw&natd - 撥接服務 - 計時制ADSL - 雜記 - FAQ

北市文山區力行國小顏國雄