nfs mount 新參數: nosharecache

就在剛剛操作 Linux 的 nfs mount 時, 發現不管怎麼弄都會得到該目錄 “is already mounted or busy” 的錯誤訊息.

因為是在 QNAP TS-459U 上, 我想針對 “Network Recycle Bin 1” 這個 nfs 分享 mount 到某台 Linux server 上. (天哪, 我文法好差, 這段用中文要怎麼寫才順啊?) 所以我一直以為是目錄中有空格的關係, 導致 mount 的語法有問題. 但在用 google 找了很多資料後, 發現:

Kernel 2.6.18 後, nfs mount 對於同一台 server 分享出來的目錄, 不能下不同的參數來 mount 它們. 由於之前我是用 autofs 已經先 mount 一個目錄了 (有加 wsize 與 rsize 參數), 然而我手動 mount 第二個目錄時, 並沒有指定一樣的參數, 所以發生了錯誤.

我還是把 case 實例解說一下好了
TS459U: 是一台 QNAP NAS server
ELFC61: 是一台普通的 Linux server

TS459U 有很多 nfs exports, 包括
/Public
/Network Recycle Bin 1

首先我在 ELFC61 已經先 mount TS459U 的 /Public 了, 有使用參數 wsize=16384 與 rsize=16384
然後我在 ELFC61 想要手動 mount 另一個目錄 /Network Recycle Bin 1 到 ELFC61 的 /mnt/recycle1
結果就發生了錯誤訊息, 無法成功 mount 該目錄: “/mnt/recycle1 is already mounted or busy”
起先我一直誤以為是因為 Network Recycle Bin 1 這個目錄名稱有很多空格的關係, 以致於 mount 語法有誤, 後來才發現這根本是錯誤的方向.

解決方法有二:

1. 臨時要手動 mount 的話, 可利用 -o nosharecache 這個新的參數 [mount(8) 手冊沒有提到], 可暫時避免這個問題, 但不建議使用 (原因見最後面的 nfs 手冊節錄).

mount -o nosharecache TS459U:’/Network Recycle Bin 1′ /mnt/recycle1

2. 最好就是使用當時 mount TS459U:/Public 一樣的參數.

以此例而言, 由於之前我 mount /Public 時是下了 wsize=16384,rsize=16384
所以我這次手動 mount ‘/Network Recycle Bin 1’ 也應該用一模一樣的參數, 即可成功.

關於 nosharecache 其實在 nfs(5) 手冊中是有提到的, 茲節錄如下:

nosharecache: As of kernel 2.6.18, it is no longer possible to mount the same same filesystem with different mount options to a new mountpoint. It was deemed unsafe to do so, since cached data cannot be shared between the two mountpoints. In consequence, files or directories that were common to both mountpoint subtrees could often be seen to be out of sync following an update. This option allows administrators to select the pre-2.6.18 behaviour, permitting the same filesystem to be mounted with different mount options.
Beware: Use of this option is not recommended unless you are certain that there are no hard links or subtrees of this mountpoint that are mounted elsewhere.