NFSv4 就是 NFS 的第四版,他與上一代的 NFSv3 有些差異,若是沒有注意到他更動的地方,可能會被他搞得一頭霧水(筆者就是這樣),所以在這裡特別記錄一下,免得自己以後忘記,又要再重頭來研究一遍,Open Source 的東西就是更新很快,是很大的優點,也是很大的缺點,每隔沒多久就要學新的東西,累死老人家。

這裡以 Ubuntu Linux 為例,示範如何安裝 NFSv4 的 Server 與 Client,並比較 NFSv4 與 NFSv3 的差異。

NFS Server

首先安裝 NFS Server,在 apt 中有好幾個 nfs 相關的套件可以選擇,不過一般都是用 nfs-kernel-server,因為這個套件效能比較好:

sudo apt-get install nfs-kernel-server

接著設定要 export 出去的資料夾,傳統的做法是直接在 /etc/exports 設定每一個要 export 的路徑就可以了,但是從 NFSv4 開始有些不一樣,所有被 export 出去的資料都會被整合進一個單一的檔案系統中,然後再一起 export 出去,我們直接看範例比較清楚。

假設我們要 export /home/users/usr/local/data 兩個資料夾,首先就是要將這兩個分開的資料夾以 bind 的方式綁在一個虛擬的檔案系統中,一開始先建立一個作為虛擬根目錄的目錄:

mkdir /export

然後再將要 export 的目錄綁進來這個目錄中:

mkdir /export/users
mkdir /export/data
mount --bind /home/users /export/users
mount --bind /usr/local/data /export/data

這個設定在重新開機後,就會不見,建議直接寫進 /etc/fstab 中,一勞永逸,即在 /etc/fstab 中加入兩行:

/home/users      /export/users  none    bind    0       0
/usr/local/data  /export/data   none    bind    0       0

這樣就會將 /home/users/usr/local/data 兩個資料夾分別掛載至 /export/users/exports/data,如以一來就建立一個虛擬的檔案系統。

更改 /etc/default/nfs-kernel-server 設定檔,將 NEED_SVCGSSD 設為 no

NEED_SVCGSSD=no

更改 /etc/default/nfs-common 設定檔,將 NEED_IDMAPD 設為 yesNEED_GSSD 設為 no

NEED_IDMAPD=yes
NEED_GSSD=no

接著設定 /etc/exports

/export       192.168.1.0/24(rw,fsid=0,no_subtree_check,sync)
/export/users 192.168.1.0/24(rw,nohide,insecure,no_subtree_check,sync)
/export/data  192.168.1.0/24(rw,nohide,insecure,no_subtree_check,sync)

第一行是設定 /export 為根錄目(fsid=0 即是設定為根目錄的意思),另外將 /export/users/export/data 也開放給 192.168.1.0/24 這個網域的所有機器。

接著重新啓動 NFS Server 與 idmapd:

sudo /etc/init.d/nfs-kernel-server restart
sudo start idmapd   # or...
sudo service idmapd restart

NFS Client

NFS 的 Client 端要先安裝 nfs-common 套件:

sudo apt-get install nfs-common

再設定 /etc/default/nfs-common,將 NEED_IDMAPD 設為 yes

NEED_IDMAPD=yes

(重新)啟動 idmapd:

# start idmapd   # or...
# service idmapd restart

接下來就可以掛載了,最簡單的方式就是直接將整個虛擬檔案系統掛上來,一次解決:

sudo mount -t nfs4 -o proto=tcp,port=2049 nfs-server:/ /mnt

其中 nfs-server 要換成自己的 NFS Server 的 IP 位址(建議用 IP 位址)或是 hostname,而 /mnt 就是在 Client 上要掛載的位置,而這裡根 NFSv3 不一樣的地方在於指定 Server 上的目錄是根目錄(/),這個根目錄就會對應到 NFS Server 上 /etc/exports 設定為根目錄的位置,以這裡來說就是對應到 /export

若是測試沒問題,就可以寫入 /etc/fstab 了,在 /etc/fstab 加入:

nfs-server:/   /mnt   nfs4    _netdev,auto  0  0

參考資料:NFSv4HowtoSettingUpNFSHowTo