http://linux.vbird.org/linux_server/0330nfs.php

13.2.3 /etc/exports 設定檔的語法與參數

在開始 NFS 伺服器的設定之前,你必須要瞭解的是,NFS 會直接使用到核心功能,所以你的核心必須要有支援 NFS 才行。萬一如果你的核心版本小於 2.2 版,或者重新自行編譯過核心的話,那麼就得要很注意啦!因為你可能會忘記選擇 NFS 的核心支援啊!

還好,我們 CentOS 或者是其他版本的 Linux ,預設核心通常是支援 NFS 功能的,所以你只要確認你的核心版本是目前新的 2.6.x 版,並且使用你的 distribution 所提供的核心,那應該就不會有問題啦!

Tips:
上面會提醒您這個問題的原因是,以前鳥哥都很喜歡自行編譯一個特別的核心,但是某次編譯核心時,卻忘記加上了 NFS的核心功能,結果 NFS server 無論如何也搞不起來~最後才想到原來俺的核心是非正規的… 鳥哥的圖示
至於 NFS 伺服器的架設實在很簡單,你只要編輯好主要設定檔 /etc/exports 之後,先啟動 rpcbind (若已經啟動了,就不要重新啟動),然後再啟動 nfs ,你的 NFS 就成功了!不過這樣的設定能否對用戶端生效?那就得要考慮你權限方面的設定能力了。廢話少說,我們就直接來看看那個 /etc/exports 應該如何設定吧!某些 distributions 並不會主動提供 /etc/exports 檔案,所以請你自行手動建立它吧。

[root@www ~]# vim /etc/exports
/tmp         192.168.100.0/24(ro)   localhost(rw)   *.ev.ncku.edu.tw(ro,sync)
[分享目錄]   [第一部主機(權限)]     [可用主機名]    [可用萬用字元]

你看看,這個設定檔有夠簡單吧!每一行最前面是要分享出來的目錄,注意喔!是以目錄為單位啊!然後這個目錄可以依照不同的權限分享給不同的主機,像鳥哥上面的例子說明是:要將 /tmp 分別分享給三個不同的主機或網域的意思。記得主機後面以小括號 () 設計權限參數,若權限參數不止一個時,則以逗號 (,) 分開。且主機名與小括號是連在一起的喔!在這個檔案內也可以利用 # 來註解呢。

至於主機名稱的設定主要有幾個方式:

可以使用完整的 IP 或者是網域,例如 192.168.100.10 或 192.168.100.0/24 ,或192.168.100.0/255.255.255.0 都可以接受!

也可以使用主機名稱,但這個主機名稱必須要在 /etc/hosts 內,或可使用 DNS 找到該名稱才行啊!反正重點是可找到 IP 就是了。如果是主機名稱的話,那麼他可以支援萬用字元,例如 * 或 ? 均可接受。
至於權限方面 (就是小括號內的參數) 常見的參數則有:

參數值 內容說明

rw
ro    該目錄分享的權限是可讀寫 (read-write) 或唯讀 (read-only),但最終能不能讀寫,還是與檔案系統的 rwx及身份有關。
sync
async    sync 代表資料會同步寫入到記憶體與硬碟中,async 則代表資料會先暫存於記憶體當中,而非直接寫入硬碟!
no_root_squash
root_squash    用戶端使用 NFS 檔案系統的帳號若為 root 時,系統該如何判斷這個帳號的身份?預設的情況下,用戶端 root 的身份會由 root_squash 的設定壓縮成 nfsnobody,如此對伺服器的系統會較有保障。但如果你想要開放用戶端使用 root 身份來操作伺服器的檔案系統,那麼這裡就得要開 no_root_squash 才行!
all_squash    不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名使用者,通常也就是 nobody(nfsnobody) 啦!
anonuid
anongid    anon 意指 anonymous (匿名者) 前面關於 *_squash 提到的匿名使用者的 UID 設定值,通常為 nobody(nfsnobody),但是你可以自行設定這個 UID 的值!當然,這個 UID 必需要存在於你的 /etc/passwd 當中!anonuid 指的是 UID 而 anongid 則是群組的 GID 囉。

這是幾個比較常見的權限參數,如果你有興趣玩其他的參數時,請自行 man exports 可以發現很多有趣的資料。接下來我們利用上述的幾個參數來實際思考一下幾個有趣的小習題:

例題一:讓 root 保有 root 的權限
我想將 /tmp 分享出去給大家使用,由於這個目錄本來就是大家都可以讀寫的,因此想讓所有的人都可以存取。此外,我要讓 root 寫入的檔案還是具有 root 的權限,那如何設計設定檔?
答:

[root@www ~]# vim /etc/exports
#任何人都可以用我的 /tmp ,用萬用字元來處理主機名稱,重點在 no_root_squash
/tmp  *(rw,no_root_squash)

主機名稱可以使用萬用字元,上頭表示無論來自哪裡都可以使用我的 /tmp 這個目錄。再次提醒,『 *(rw,no_root_squash) 』這一串設定值中間是沒有空白字元的喔!而 /tmp 與 *(rw,no_root_squash) 則是有空白字元來隔開的!特別注意到那個 no_root_squash 的功能!在這個例子中,如果你是用戶端,而且你是以 root 的身份登入你的 Linux 主機,那麼當你 mount 上我這部主機的 /tmp 之後,你在該 mount 的目錄當中,將具有『root 的權限!』

例題二:同一目錄針對不同範圍開放不同權限
我要將一個公共的目錄 /home/public 公開出去,但是只有限定我的區域網路 192.168.100.0/24 這個網域且加入vbirdgroup (第一章的例題建立的群組) 的用戶才能夠讀寫,其他來源則只能讀取。
答:

[root@www ~]# mkdir /home/public
[root@www ~]# setfacl -m g:vbirdgroup:rwx /home/public
[root@www ~]# vim /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.100.0/24(rw)    *(ro)
#繼續累加在後面,注意,我有將主機與網域分為兩段 (用空白隔開) 喔!

上面的例子說的是,當我的 IP 是在 192.168.100.0/24 這個網段的時候,那麼當我在 Client 端掛載了 Server 端的 /home/public 後,針對這個被我掛載的目錄我就具有可以讀寫的權限~至於如果我不是在這個網段之內,那麼這個目錄的資料我就僅能讀取而已,亦即為唯讀的屬性啦!

需要注意的是,萬用字元僅能用在主機名稱的分辨上面,IP 或網段就只能用 192.168.100.0/24 的狀況,不可以使用 192.168.100.* 喔!

例題三:僅給某個單一主機使用的目錄設定
我要將一個私人的目錄 /home/test 開放給 192.168.100.10 這個 Client 端的機器來使用時,該如何設定?假設使用者的身份是 dmtsai 才具有完整的權限時。
答:

[root@www ~]# mkdir /home/test
[root@www ~]# setfacl -m u:dmtsai:rwx /home/test
[root@www ~]# vim /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.100.0/24(rw)    *(ro)
/home/test    192.168.100.10(rw)
#只要設定 IP 正確即可!

這樣就設定完成了!而且,只有 192.168.100.10 這部機器才能對 /home/test 這個目錄進行存取喔!

例題四:開放匿名登入的情況
我要讓 *.centos.vbird 網域的主機,登入我的 NFS 主機時,可以存取 /home/linux ,但是他們存資料的時候,我希望他們的 UID 與 GID 都變成 45 這個身份的使用者,假設我 NFS 伺服器上的 UID 45 與 GID 45 的用戶/群組名稱為 nfsanon。
答:

[root@www ~]# groupadd -g 45 nfsanon
[root@www ~]# useradd -u 45 -g nfsanon nfsanon
[root@www ~]# mkdir /home/linux
[root@www ~]# setfacl -m u:nfsanon:rwx /home/linux
[root@www ~]# vim /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.100.0/24(rw)    *(ro)
/home/test    192.168.100.10(rw)
/home/linux   *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
#如果要開放匿名,那麼重點是 all_squash,並且要配合 anonuid 喔!

特別注意到那個 all_squash 與 anonuid, anongid 的功能!如此一來,當 clientlinux.centos.vbird 登入這部 NFS 主機,並且在 /home/linux 寫入檔案時,該檔案的所有人與所有群組,就會變成 /etc/passwd 裡面對應的 UID 為 45 的那個身份的使用者了!

上面四個案例的權限如果依照13.1.4 存取設定權限來思考的話,那麼權限會是什麼情況呢?讓我們來檢查一下:

用戶端與伺服器端具有相同的 UID 與帳號:
假設我在 192.168.100.10 登入這部 NFS (IP 假設為 192.168.100.254) 伺服器,並且我在 192.168.100.10 的帳號為 dmtsai 這個身份,同時,在這部 NFS 上面也有 dmtsai 這個帳號,並具有相同的 UID ,果真如此的話,那麼:

由於 192.168.100.254 這部 NFS 伺服器的 /tmp 權限為 -rwxrwxrwt ,所以我 (dmtsai 在 192.168.100.10 上面) 在 /tmp 底下具有存取的權限,並且寫入的檔案所有人為 dmtsai ;
在 /home/public 當中,由於我有讀寫的權限,所以如果在 /home/public 這個目錄的權限對於 dmtsai 有開放寫入的話,那麼我就可以讀寫,並且我寫入的檔案所有人是 dmtsai 。但是萬一 /home/public 對於 dmtsai 這個使用者並沒有開放可以寫入的權限時,那麼我還是沒有辦法寫入檔案喔!這點請特別留意!
在 /home/test 當中,我的權限與 /home/public 相同的狀態!還需要 NFS 伺服器的 /home/test 對於 dmtsai 有開放權限;
在 /home/linux 當中就比較麻煩!因為不論你是何種 user ,你的身份一定會被變成 UID=45 這個帳號!所以,這個目錄就必需要針對 UID = 45 的那個帳號名稱,修改他的權限才行!

用戶端與伺服器端的帳號並未相同時:
假如我在 192.168.100.10 的身份為 vbird (uid 為 600),但是 192.168.100.254 這部 NFS 主機卻沒有 uid=600的帳號時,情況會變成怎樣呢?

我在 /tmp 底下還是可以寫入,只是該檔案的權限會保持為 UID=600 ,因此伺服器端看起來就會怪怪的,因為找不到 UID=600 這個帳號的顯示,故檔案擁有者會填上 600 呦!
我在 /home/public 裡面是否可以寫入,還需要視 /home/public 的權限而定,不過,由於沒有加上 all_squash 的參數,因此在該目錄下會保留用戶端的使用者 UID,同上一點所示。
/home/test 的觀點與 /home/public 相同!
/home/linux 底下,我的身份就被變成 UID = 45 那個使用者就是了!

當用戶端的身份為 root 時:
假如我在 192.168.100.10 的身份為 root 呢? root 這個帳號每個系統都會有呀!權限變成怎樣呢?

我在 /tmp 裡面可以寫入,並且由於 no_root_squash 的參數,改變了預設的 root_squash 設定值,所以在 /tmp 寫入的檔案所有人為 root 喔!
我在 /home/public 底下的身份還是被壓縮成為 nobody 了!因為預設屬性裡面都具有 root_squash 呢!所以,如果 /home/public 有針對 nobody 開放寫入權限時,那麼我就可以寫入,但是檔案所有人變成 nobody 就是了!
/home/test 與 /home/public 相同;
/home/linux 的情況中,我 root 的身份也被壓縮成為 UID = 45 的那個使用者了!

這樣的權限講解之後,你可以瞭解了嗎?這裡是最重要的地方,如果這一關通過了,底下的咚咚就沒有問題啦! ^_^!在你將本文讀完後,最好還是回到13.1.4 NFS 的檔案存取權限好好的瞧一瞧,才能解決 NFS 的問題喔!

文档更新时间: 2020-06-30 23:58   作者:月影鹏鹏