第十八章 NFS

18.1 概論

NFS 是 Network File System。NFS 就好像是 UNIX 系統中的網路芳鄰,您可以使用 NFS 將伺服器上的資料夾匯出,讓其他 UNIX 主機可以將所匯出的資料夾掛入。當您有多台 UNIX 主機時,使用 NFS 可以讓您共享同一個資料夾。如此一來,同一份資料就不必放在多台機器上,而可以經由 NFS 來節省空間並達到資料的同步。

18.2 NFS 設定

使用 NFS,我們必須啟動三個 Daemon,nfsd、mountd、及 portmap。nfsd 用以接收 NFS client 所傳來的連線要求。當接到連線要求時,nfsd 會將連線的請求交由 mountd 來執行。而 portmap 是用來讓 client 端可以正確找到 NFS server 所開放的 port,以使 client 能找到 server 上正確的連線窗口。

首先,我們要先編輯 server 端的 /etc/rc.conf ,並加入下列的設定:

# 如果您使用 FreeBSD 4.x,請使用 portmap_enable。
portmap_enable="YES"
# 由於 FreeBSD 5.x 中,portmap 這支程式己被取代為 rpcbind,
# 所以如果您使用 FreeBSD 5.x,請使用 rpcbind_enable。
rpcbind_enable="YES"
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4"
mountd_enable="YES"
mountd_flags="-r"

在選項 nfs_server_flags 中,-u 表示我們提供 UDP 方式連線,而 -t 表示以 TCP 方式連線。如果您所要使用 NFS 的 client 都是 FreeBSD,您可以只以 TCP 連線,如此可以有較佳的效能。-n 4 表示我們一次打開四個 nfsd 的 daemon。

接著我們要設定 /etc/exports,這個檔案是用來設定我們所要分享的資料夾及其權限。/etc/exports 可能長得像這個樣子。

/usr/src /usr/local     -maproot=root
/home      -alldirs    -maproot=root  -network  192.168.0.0  -mask  255.255.255.0
/cdrom    -ro    -mapall=alex

第一個欄位為所要分享的目錄,如果所要分享的目錄位於同一個 slice 上,則必須寫在同一行。例如我們要分享的目錄是 /usr/src 及 /usr/local,因為這二個目錄位於同一個硬碟的分割區上,所以必須寫在同一行,也就是說同一個分割區只有一種權限。在目錄之後,我們會指定一些設定權限的參數,其意義如下:

參數 意義
-ro 表示 read only,唯讀。
-maproot=user 如果 client 以 root 存取,則將它的權限對映成本機 user 的權限。
-mapall=user 將所有 client 的存取連線對映到 user,也就是說所有人的身份都轉成 user。
-alldirs 可以讓使用者將該分享資料夾的任一目錄做為 mount point。也就是說當我們分享的是 /usr 時,client 也可以將 /usr/include 當成掛入點來 mount。但前提是 /usr 必須是一個獨立的 filesystem,也就是說 /usr 必須是獨立分割成一個 slice。
-network IP -mask MASK  指定允許連線的網域。

您可以 man exports 來獲得更多關於 exports 格式的資訊。我們每次設定完 /etc/exports 都必須以下列指令重新啟動 mountd:

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

不過由於我們是第一次設定,所以連 mountd 都還沒有啟動,所以你可以選擇重新開機或是執行下列指令來啟動 NFS 服務。

首先是啟動 RPC port map,如果您是使用 FreeBSD 4.x,請將下列 rpcbind 指令改為 portmap

# rpcbind
# nfsd -u -t -n 4
# mountd -r

完成了 Server 端的設定後,我們還要做 client 端的設定。在 client 端的 rc.conf 中,我們要加入下列的設定:

nfs_client_enable="YES"
nfs_client_flags="-n 4"

當設定了 nfs_client_enable 為 YES 後,在開機時即會自動啟動 nfsiod ,而這裡的 -n 4 和 server 的設定一樣,代表我們一次要啟動四份 nfsiod 來做 nfs 連線。我們不一定要在 NFS client 啟動 nfsiod,如果沒有 nfsiod,照樣可以使用,但 nfsiod 可以提高連線效率。

設定完 rc.conf 後,要重新開機才會生效,同樣的,如果您不想重新開機,你可以手動執行下列指令來讓 nfs client 生效:

# nfsiod -n 4

現在我們可以開始使用 NFS 了。首先,我們可以使用 showmount 這個指令來查看 server 上有哪些分享的資料夾,假設 NFS server為 192.168.1.1:

# showmount -e 192.168.1.1
Exports list on 192.168.1.1:
/home Everyone
/usr 192.168.1.2

接著我們就可以將想要掛入的資料夾 mount 進來:

# mount 192.168.1.1:/home /mnt

如果您要想在一開機就將該資料夾掛入,您可以編輯 /etc/fstab,並加入下列設定:

192.168.1.1:/home   /mnt    nfs rw  0   0

18.3 NFS 的限制

在使用 NFS 時,有些事我們必須特別注意。如果您 NFS server 負擔相當重,也許你會發現該伺服器時常沒有回應,而 client 端也會因此而無法動作。這並非 FreeBSD 獨有的問題,使用 NFS 時,網路卡的選擇及網路整體的品質很重要。否則在 client 和 server 系統負擔不一時,很容易產生沒有回應的情形。

有時候我們將 mount 某台伺服器的資料夾,但如果該伺服器關機或是停止 NFS 服務,當您 ls 所掛入的目錄時,整台機器會因而停止動作。此時除非該 NFS 伺服器又開啟,否則您只能重新啟動了。因此,建議您 mount NFS 並完成所需的存取動作後,就立即 umount,才不會使 client hang 住。如果您希望當所 mount 的伺服器發生問題時,本機可以不受到影響,您可以改用 mount_nfs 指令並加上參數 -i 及 -s。

# mount_nfs -s -i 192.168.1.1:/home /mnt

參數 -i 允許我們在使用 Ctrl+C 來中斷 mount 的動作。參數 -s 是使用 soft mount 模式,當檔案系統對於所 mount 的伺服器操作失敗時,重試幾次後就不再試了。