NFS 就是 Network File System 的縮寫,最早是由 Sun 這家公司所發展出來的。 它最大的功能就是可以透過網絡,讓不同的機器、不同的作業系統、可以彼此分享個别的檔案 (share files)。我們可以簡單的将他看做是一個檔案伺服器 (file server) !這個 NFS 伺服器可以讓你的 PC 來将網絡遠端的 NFS 伺服器分享的目錄,挂載到本地端的機器當中, 在本地端的機器看起來,那個遠端主機的目錄就好像是自己的一個磁盤分區一樣 (partition)!
RPC(Remote Procedure Call)——遠端過程調用,它是一種通過網絡從遠端計算機程式上請求服務,而不需要了解底層網絡技術的協定。RPC協定假定某些傳輸協定的存在,如TCP或UDP,為通信程式之間攜帶資訊資料。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程式在内的應用程式更加容易。NFS 伺服器在啟動的時候就得要向 RPC 注冊,是以 NFS 伺服器也是一種 RPC server 。
安裝好CentOS7.4Min的具有獨立IP的兩台或多台伺服器。本例以2台機器為例,服務端(提供NFS服務的一端,即資料實際存放端):192.168.237.21,用戶端:192.168.237.22。
架構圖。

1、服務端和用戶端必須軟體nfs-utils,事實上在安裝nfs-utils的同時,rpcbind作為依賴包被安裝,是以無需再單獨安裝rpcbind。單獨安裝rpcbind時不會同時安裝nfs-utils。
2、啟動服務端的nfs和rpcbind服務,并将其設定為開機啟動(作為伺服器,應保證服務在每次重新開機之後都能迅速提供服務)
3、在服務端建立共享目錄。
4、修改服務端配置檔案
修改服務端配置檔案/etc/exports,增加如下一行:
/nfs 192.168.237.22/24(rw,sync)
5、依次重新開機服務端rpcbind、nfs服務
6、 配置服務端防火牆
7、啟動用戶端nfs服務(用戶端可以不啟動rpcbind服務),挂載服務端nfs目錄。
8、測試。
在用戶端檢視一下挂載情況。
正常挂載,無異常。
在服務端及用戶端分别寫入資料,發現隻能在服務端對/nfs目錄進行讀寫,而在用戶端隻能讀取。因為都是使用root賬戶進行操作的,在用戶端看到的root是指服務端的root而并非用戶端的root。為了盡快使用、體驗nfs服務,在服務端将/nfs目錄的權限設定為7,此時就能愉快的體驗nfs帶來的樂趣了。但這并不嚴謹,不是我們想要達到的目标。
今天不是特别忙,一下子更新了好幾篇博文,難免疏漏,還望諸位多多提出意見或建議。
一到公司,做完日常巡檢,就繼續來完成昨天未完成的任務了。發現了2個問題:
(1)用戶端NFS挂載不上了,報錯:mount.nfs: access denied by server while mounting 192.168.237.21:/nfs
我仔細檢查了一遍防火牆、服務端nfs、rpcbind服務狀态、網絡等,都沒有發現任何問題。問題出在哪呢?忽然回憶起來,昨天關機之前改過/etc/exports檔案,把括号内的内容改為了(rwx,sync),去掉x之後依次重新開機服務端rpcbind、nfs服務,挂載成功!
(2)用戶端端無需啟動rpcbind及nfs服務即可挂載NFS,但是需要安裝nfs服務。
在用戶端設定開機自動挂載NFS服務:
[root@Geeklp-NFS-Client ~]# echo “/nfs 192.168.237.21:/nfs /mnt nfs defaults 0 0”>>/etc/fstab
移除rpcbind安裝包的時候,nfs也會作為依賴被删除。單獨删除nfs-utils時并不會同時删除rpcbind。nfs-utils不能脫離rpcbind而單獨存在。
移除rpcbind及nfs安裝包時如果沒有解除安裝NFS,那麼之前挂載的NFS目錄依然可以進行操作。但無法再次被挂載。要想挂載,必須安裝nfs-utils。
扯遠了,言歸正傳,說好在這一節咱們要來聊一聊NFS的進階配置的。以示區分,本次使用的NFS共享目錄為:/NFS-Server。
(一)在服務端建立NFS共享目錄/NFS-Server,在用戶端建立挂載點目錄/NFS-Client。
在此,我們先熟悉一下 /etc/exports 配置檔案的文法與參數,為接下來的内容做準備。
/NFS-Server:共享目錄
192.168.237.22/24(ro):共享給指定主機的IP,括号内為權限
localhost(rw):可使用主機名
*.geeklp.com(ro,sync):可使用域名,并且可以使用通配符
對于括号内的權限:
參數值
内容說明
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。
(二)幾個應用案例。
1、全面共享NFS目錄,讓誰都能以root權限來操作共享目錄裡面的内容。
在用戶端挂載此共享目錄:
回去服務端看一下:
不用在服務端修改權限咯!
2、在用戶端解除安裝共享目錄。再将/NFS-Server限定網段為192.168.237.0/24 且加入geeklpgroup的使用者才能夠讀寫,其他來源則隻能讀取。 此部分涉及到ACL權限管理的内容。
此時在用戶端挂載此NFS共享目錄,能夠正常讀,但是無法寫入資料。在用戶端也添加組geeklpgroup,建立使用者geeklp并将其添加至geeklpgroup内。切換到geeklp使用者,寫入資料成功!
如果要指定特定使用者對NFS共享目錄有讀寫執行的權限,使用ACL權限管理一樣能實作。
3、讓主機192.168.237.22/24,登入NFS 主機時,可以讀寫NFS共享目錄,并且在讀寫資料的時候都以指定的UID 與 GID來操作。例如指定uid為1001,gid為1002。
在本例中需要注意的要點是:NFS的共享目錄/NFS-Server的使用者與組必須與/etc/exports中指定的使用者uid群組gid相比對,否則是無法進行寫操作的。使用者可以屬于exports中指定組,也可以不屬于。
4、一些相關指令詳解
(1)exportfs
如果我們在啟動了NFS之後又修改了/etc/exports,是不是還要重新啟動nfs呢?這個時候我們就可以用exportfs 指令來使改動立刻生效,該指令格式如下:
# exportfs [-aruv]
-a 全部挂載或解除安裝 /etc/exports中的内容
-r 重新讀取/etc/exports 中的資訊 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 解除安裝單一目錄(和-a一起使用為解除安裝所有/etc/exports檔案中的目錄)
-v 在export的時候,将詳細的資訊輸出到螢幕上。
具體例子:
# exportfs -au 解除安裝所有共享目錄
# exportfs -rv 重新共享所有目錄并輸出詳細資訊
(2)nfsstat
檢視NFS的運作狀态。
(3)rpcinfo
檢視rpc執行資訊,可以用于檢測rpc運作情況的工具,利用rpcinfo -p 可以檢視出RPC開啟的端口所提供的程式有哪些。
(4)showmount
-a 顯示已經于用戶端連接配接上的目錄資訊
-e IP或者hostname 顯示此IP位址分享出來的目錄