1. 程式人生 > >NFS-網絡文件共享服務

NFS-網絡文件共享服務

oot hello 背景 加網 完全 基於 實現 標識 重載

目錄

  • NFS介紹
    • 什麽是NFS(Network File System)
    • 搭建NFS服務需要的軟件包
  • 極簡步驟搭建NFS服務
    • 準備兩臺機器
    • 配置服務端(nfs-server)
    • 配置客戶端(web-client)
    • NFS服務簡單執行流程
  • NFS文件訪問權限
  • NFS服務端配置
    • 客戶端地址的表示方法
    • /etc/exports參數
    • /etc/exports生效
    • 創建共享目錄
    • NFS服務端配置小結
  • NFS客戶端配置
    • 查看遠端共享目錄
    • 掛載共享目錄
    • 卸載共享目錄
  • 參考資料

環境:VMware-Workstation-12-Pro,Windows-10,CentOS-7.5,Xshell5

NFS介紹

什麽是NFS(Network File System)

簡單來說NFS就是實現文件共享功能的,與windows文件共享功能類似,但本篇博客只討論多臺Linux
服務器之間通過NFS共享文件,不涉及windows。NFS一般的用法是,選一臺Linux服務器作為NFS服務
端,把該機器上某個目錄共享出去,一般是共享到局域網內,然後局域網內的其它機器都連接上這臺
服務器,操作NFS服務端共享出來的指定目錄。

NFS也是一套標準的文件系統協議,是1984年Sun Microsystems開發的,現在是RFC維護,最新
版本是NFSv4.2。

我們知道把數據共享給其它機器,那是需要聯網傳輸數據的,而NFS本身不具備通過網絡傳輸數據的
功能,而是依賴RPC服務(Remote Procedure Call)實現的,RPC最早也是Sun Microsystems

開發的,現在也是RFC標準,RPC傳輸數據是基於TCP/UDP協議的,使用的是固定端口111。

搭建NFS服務需要的軟件包

在CentOS7裏,如果我們使用yum安裝nfs-utils,不要著急確認,可以看到提示的依賴信息如下
圖所示:

技術分享圖片

看到了吧,其中我們需要關心的的依賴軟件包就是rpcbind。也就是說搭建NFS服務需要安裝兩個軟件
包nfs-utils和rpcbind,分別對應了NFS母體和其所需要的數據傳輸服務RPC,不過使用yum安裝系統
會自動處理依賴,即只需安裝nfs-utils包即可。

如果我們使用yum卸載nfs-utils包,其安裝時所對應的依賴,都是不會被卸載的。

安裝完畢之後我們可以使用rpm -ql nfs-utils

,看一下該包裏都有哪些命令和文件:

[root@nfs-server ~]# rpm -ql nfs-utils
/usr/lib/systemd/system/nfs-server.service
/usr/sbin/exportfs
/usr/sbin/showmount
/var/lib/nfs/etab

上面的輸出省略了一些內容。

極簡步驟搭建NFS服務

俗話說的好,光說不練假把式,本節我們就用最少的步驟,完全不考慮原理,專註實現功能,讓讀者
快速看到效果。

準備兩臺機器

首先啟動兩臺Linux虛擬機,關閉防火墻和SELinux,使用Xshell連接好。最關鍵的,IP地址和
主機名按照下面的表格配置:

機器 主機名 公網IP 內網IP
1號虛擬機 nfs-server 10.0.0.31 10.0.0.7
2號虛擬機 web-client 172.16.1.31 172.16.1.7

這裏我簡單解釋下,1號虛擬機是NFS服務器,就是共享目錄給別人用的機器,2號虛擬機是客戶端,
就是使用1號機器共享出來的目錄的機器。這裏我給每個機器都配置了兩塊網卡,這不是必須的,
事實上一塊網卡也能實現效果。另外具有一定計算機網絡背景知識的讀者可以看到,我寫的雖然是
公網IP,其實也是用於局域網的IP來模擬的,如果在生產環境中,會根據實際需要,替換成真正的
公網IP地址。

在下面的敘述中,有時我會顯示說明實在哪臺機器上進行操作,有時讀者則需要通過主機名來判斷,
當前需要操作哪臺機器。

推薦使用克隆虛擬機來搭建測試環境,關於虛擬機克隆以及克隆後添加網卡和修改網絡參數,可以
參考這裏:

配置服務端(nfs-server)

1 安裝nfs-utils

[root@nfs-server ~]# yum install nfs-utils -y

2 重啟rpcbind服務

[root@nfs-server ~]# systemctl restart rpcbind

3 配置/etc/exports

[root@nfs-server ~]# vim /etc/exports
[root@nfs-server ~]# cat /etc/exports
/data *(rw)

4 創建要共享的目錄並更改所有者為nfsnobody

[root@nfs-server ~]# mkdir /data
[root@nfs-server ~]# chown -R nfsnobody:nfsnobody /data

5 重啟nfs-server服務

[root@nfs-server ~]# systemctl restart nfs-server

配置客戶端(web-client)

1 安裝nfs-utils

[root@web-client ~]# yum install nfs-utils -y

2 重啟rpcbind服務

[root@web-client ~]# systemctl restart rpcbind

3 掛載遠端(172.16.1.31)上的目錄

[root@web-client ~]# mkdir /data
[root@web-client ~]# mount -t nfs 172.16.1.31:/data /data

4 測試

[root@nfs-server ~]# ls /data
f1.txt  f2.txt  f3.txt
[root@web-client ~]# ls /data
f1.txt  f2.txt  f3.txt
[root@web-client ~]# echo "123456" > /data/f4.txt
[root@web-client ~]# ls /data
f1.txt  f2.txt  f3.txt  f4.txt
[root@web-client ~]# cat f4.txt 
123
[root@nfs-server ~]# ls /data
f1.txt  f2.txt  f3.txt  f4.txt
[root@nfs-server ~]# cat /data/f4.txt 
123456

從上述測試效果中可以看出,客戶掛載完畢遠端共享出來的目錄/data後,在客戶端操作/data目錄
幾乎和操作本地目錄一致,也就是對客戶端來說遠端nfs服務器是透明的,無需關心,正常操作/data
目錄即可。無論是在客戶端還是在本地端操作/data目錄,操作的都是同一塊磁盤,讀寫的都是相同
的物理空間。

NFS服務簡單執行流程

比如現在NFS服務器共享了一個/data目錄給客戶端,客戶端要往/data目錄裏寫入數據,大致會經過
如下幾個步驟:

  1. 客戶端把請求傳遞給自己的rpcbind服務
  2. rpcbind通過TCP/UDP協議把請求傳遞給服務端的rpcbind服務
  3. 服務端的rpcbind請求傳遞給服務端的nfs服務
  4. 服務端的nfs服務,操作本地件,寫入數據

可以看到rpcbind服務在NFS共享服務之間起到了中介的作用,事實上nfs服務具有非常多的端口,
而且是隨機的,直接通過這些端口與客戶端操作非常不便,而rpcbind使用的是固定端口111,
這樣客戶端與服務端只需要監聽111端口,即可完成通信。正是rpcbind在其中承擔了客戶端和
服務端之間端口映射與轉換的工作。

基本了解nfs共享服務的操作流程之後,下面我們就開始詳細說說上面每一步的操作步驟都是何含義,
並且對關鍵部分進行展開細說,下面很多內容都會提到上面的極簡案例。首先一個比較關鍵的,就是
要弄明白,共享文件的訪問權限。

NFS文件訪問權限

要共享一個目錄給別人用,我們直覺能想到的就是,需要共享什麽目錄,共享給誰,這兩個基本問題。
另外還有一個非常重要的部分:共享文件的權限。我們上面的極簡示例中,服務端共享/data目錄,
客戶端掛載/data目錄,之後就可正常讀寫,且慢,大家有沒有註意到我在客戶端是使用root用戶
讀寫/data目錄裏的內容的,假如在客戶端換成普通用戶呢?這裏我明確的告訴大家,對於上述極簡
示例中,客戶端使用普通用戶,只能讀,不能寫,示例如下:

[oldboy@web-client ~]$ cat /data/f4.txt 
123456
[root@web-client ~]# su - oldboy
[oldboy@web-client ~]$ echo "hello" >> /data/f4.txt
-bash: /data/f4.txt: Permission denied

到這裏,相信讀者已經開始思考了,我們先拋開NFS,就我們已有的Linux文件系統權限的知識先分析
一下,在上面的極簡案例中我們設置了這樣一條:

[root@nfs-server ~]# chown -R nfsnobody:nfsnobody /data

這是什麽鬼呢,首先chown是更改目錄所有者和所屬組,-R參數是遞歸修改子目錄和子文件,這是我們
已有的知識,那nfsnobody是什麽鬼,讓我告訴你,這個用戶是我們安裝nfs-utils自動為我們創建
的,這個軟件包還為我們創建了一些其它用戶,大家可以檢查/etc/passwd看到,不過我們只關
心nfsnobody這個用戶,可以id命令先看下這個用戶的信息:

[root@nfs-server ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

這裏的名字和ID都是固定的,只要安裝了nfs-utils包,該用戶就會自動被創建。現在我們在服務端
檢查一下/data目錄的屬性:

[root@nfs-server ~]# ls -ld /data
drwxr-xr-x 2 nfsnobody nfsnobody 62 Sep  8 21:12 /data

可以看到,在服務端本地,/data目錄的所有者和所述組都是nfsnobody,那我們在服務端建立一個
文件,觀察下,這個文件的權限又是什麽:

[root@nfs-server ~]# touch /data/f5.txt
[root@nfs-server ~]# ls -l /data/f5.txt
-rw-r--r-- 1 root root 0 Sep  8 21:50 /data/f5.txt

可以看到符合我們的預期f5.txt的所有者和所屬組都是root用戶。那麽我們換到客戶端,看一下在
服務端/data目錄是什麽權限:

[root@web-client ~]# umount /data
[root@web-client ~]# ls -ld /data
drwxr-xr-x 2 root root 6 Sep  6 12:24 /data
[root@web-client ~]# mount -t nfs 172.16.1.31:/data /data
[root@web-client ~]# ls -ld /data
drwxr-xr-x 2 nfsnobody nfsnobody 90 Sep  8 21:50 /data

可以看到,未掛載遠端共享的/data目錄,查看本地的/data目錄其所有者和所屬組都是root,而
掛載到遠端/data目錄後,所有者和所屬組和遠端/data目錄保持一致,是nfsnobody,符合預期。
現在我們在客戶端/data目錄裏創建一個文件,看一下其權限:

[root@web-client ~]# touch /data/f6.txt
[root@web-client ~]# ls -l /data/f6.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep  8 21:50 /data/f6.txt

問題出現了,我們明明用的是root用戶,但是創建出來的文件其所有者和所述組確是nfsnobody,這是
怎麽一回事,不用說這肯定是服務端nfs的配置文件在起作用。

穩住,我知道大家看到這裏,仍是雲裏霧裏,似乎不知所雲,相信我,本節看完,一切豁然開朗。

我們再看一下在極簡案例中,我們服務端的配置文件/etc/exports

[root@nfs-server ~]# cat /etc/exports
/data *(rw)

這裏的/data就是服務器要共享的目錄名,*(星號)表示共享給所有機器使用,rw表示客戶端對該目錄
具有讀寫權限。實際上小括號裏可以配置多個參數,我們這裏雖然只寫了一個參數,但是nfs服務默認
就有一些預設參數,即默認值,這些默認參數到底有哪些呢,可以在/var/lib/nfs/etab中看到:

技術分享圖片

上面的內容都是在一行的,黃色部分是我們直接配的,小括號裏其它參數則都是nfs的默認值,我們
重點關註的是裏面的紅色默認參數:

anonuid=65534,anongid=65534
    正好是我們的nfsnobody用戶的uid和gid
        
root_squash
    直接翻譯過來是壓縮root用戶,這是針對客戶端來說的,含義是當客戶端使用root用戶
    操作/data目錄裏的文件時,將其"壓縮"(轉換成)anonuid和anongid對應的用戶,在
    極簡案例中就是nfsnobody用戶
    
no_all_squash
    也是針對客戶端來說的,含義就是,客戶端不管使用什麽用戶身份操作,都保持其原始身
    份不變,即原始是什麽用戶身份映射到服務端還是什麽身份。在我們的極簡案例中,root
    用戶除外,其映射到服務端會被轉換成nfsnobody身份,英文我們默認參數單獨定義了
    root_squash來規定root的映射規則。
    
    該參數不常用,正如我們上文舉例那樣,客戶端假如使用的不是root用戶,比如客戶端
    使用的是oldboy普通用戶,/data目錄的所有者是nfsnobody,那麽oldboy對於/data
    目錄來說,就是其它人,即只具有讀的權限,可見這種默認的配置,服務端已經配置了
    /data目錄開放讀寫權限給客戶端,但是客戶端必須使用root用戶操作/data,這樣才
    能映射為服務端的nfsnobody身份,也就是對/data目錄具有了讀寫權限。

    讀者可能會想,我在客戶端就是使用nfsnobody用戶登錄,來操作/data目錄,這樣不就也  
    可以執行寫操作了嗎,不行的。nfsnobody是虛擬用戶,不允許登錄。

那麽問題來了,如果我們把/etc/exports配置成/data *(rw),其含義就是其它客戶端機器必須
使用root用戶操作/data,才能正常讀寫遠程/data目錄。我們的需求是,服務端不管使用什麽用戶
操作遠程/data目錄,我們都給映射到服務器這邊的nfsnobody用戶,這樣/data目錄裏清一色,
所有者和所屬組都是nfsnobody,看起來清爽的同時也便於我們維護,那麽如何修改/etc/exports
才能實現我們的需求呢,請看下一節。

NFS服務端配置

NFS服務器端的配置參數在/etc/exports。該配置文件說明了這臺NFS服務器有哪些目錄共享
給客戶端使用,客戶端對這些目錄具有什麽操作權限等。可以使用man exports查看參數配置
幫助。

簡單示例如下:

[root@nfs-server ~]# cat /etc/exports
/data 172.16.1.7(rw)

上面的配置參數表示,服務器把/data目錄共享給172.16.1.7這臺機器使用,客戶端具有的權限是
讀和寫(rw)

通過示例可以看到,NFS服務器端/etc/exports配置參數,基本格式如下:

NFS共享目錄 客戶端地址1(參數1,參數2, ...) 客戶端地址2(參數1,參數2, ...)

客戶端地址的表示方法

星號(*),表示所有服務器。
172.16.1.7,表示這一臺機器。
172.16.1.0/24,該配置最常用,表示同一個局域網內的所有機器(★★★)
web-client,這是直接使用主機名標識客戶端地址,需要做DNS解析,原理還是找到主機名對應的
IP地址。

/etc/exports參數

NFS共享參數 作用
rw 讀寫權限
ro 只讀權限(read-only)
root_squash 默認值,客戶端root用戶映射為服務端指定用戶
no_root_squash 客戶端root用戶映射為服務端root用戶
all_squash 客戶端所有用戶映射為服務端指定用戶
no_all_squash 默認值,客戶端什麽用戶映射到服務端還是什麽用戶
sync 默認值,寫入數據時,硬盤與內存保持同步
async 寫入數據時,先寫入內存,再寫入硬盤
anonuid 指定映射用戶的uid,默認值65534(nfsnobody)
anongid 指定映射用戶的gid,默認值65534(nfsnobody)

指定用戶即anonuid和anongid所指定的用戶。
sync和async一般認為異步性能高,同步數據安全,然實際情況區別不大,使用默認值即可。
no_root_squash,該參數對於服務端比較危險,隨便在局域網內找一臺機器使用root登錄,
操作遠程/data目錄,映射到NFS服務端這邊也是root用戶,權限過大。
上面表格列出了10個參數,其中前4對,都是2選一,最後2個參數一般同時指定。

現在我們解決,在NFS文件訪問權限那一節裏留下的問題,我們可以使用下述配置:

[root@nfs-server ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)

上面這個配置是比較常用的配置,同一局域網內的所有客戶端,操作遠程/data目錄時,都會被映射
為服務端上的nfsnobody用戶。

/etc/exports裏面的配置是可以用#,註釋掉的

/etc/exports生效

修改完畢/etc/exports之後,有兩種方式可以使其生效:

1 重啟nfs-server服務

[root@nfs-server nfs]# systemctl restart nfs-server

2 重載/etc/exports配置文件

[root@nfs-server nfs]# exportfs -arv
exporting 172.16.1.0/24:/data

a(all 所有),r(reexport 重新),v(verbose 詳細信息),這三個參數一般連用表示從新加載
/etc/exports文件裏所有的配置,應用新的配置。

還可以使用exportfs -auv,u(unexport 取消),表示取消該臺NFS服務器上共享的所有目錄。
更多exportfs用法,請參考man exportfs

重啟服務比較強硬,而重載服務則比較溫柔,平滑一些。什麽,重啟服務器是配置參數生效?別鬧。

3 服務端查看配置參數是否修改成功(/var/lib/nfs/etab)

比如我們把服務端的/etc/exports配置成如下內容:

[root@nfs-server ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs-server nfs]# systemctl restart nfs-server

此時可以檢查下/var/lib/nfs/etab,該文件裏的內容,是否已經成功變更為我們所修改的內容,
當然此文件裏還包含默認共享參數:

技術分享圖片

可以看到我們的修改已經生效。

4 客戶端的操作(非必須)

如果客戶端已經事先知道服務端修改了共享參數,可以重新掛載遠程目錄:

[root@web-client ~]# umount /data
[root@web-client ~]# mount -t nfs 172.16.1.31:/data /data

上述操作不是必須的,服務端只要修改了共享參數,則客戶端立即生效,比如剛開始共享為讀寫權限,
隨後修改為只讀權限,那麽客戶端即刻就無法在向共享目錄裏寫入數據,這很好理解客戶端的操作最終
都是通過rpcbind遠程映射到服務端,然後服務端再進一步通過NFS相關服務向磁盤中寫入數據的。

只不過在有些情況下,服務端修改了配置參數而客戶端沒有重新掛載,這時第1次操作遠端目錄時,會
等待一會。

創建共享目錄

服務端除了啟動rpcbind和nfs-server服務,配置/etc/exports之外,另外一個重要的步驟就是
要創建共享目錄了,這是必須的,要共享這個目錄而這個目錄沒有,那肯定要報錯的。在我們的極
簡單案例中,我們執行了如下兩條命令:

[root@nfs-server ~]# mkdir /data
[root@nfs-server ~]# chown -R nfsnobody:nfsnobody /data

這個時候我們就知道,為什麽需要把/data目錄的所有者和所屬組改成nfsnobody,該用戶是安裝
nfs-utils包自動為我們創建的,它的uid和gid都是65534,而/etc/exports裏anonuid和
anongid默認的值正是65534,所對應的就是nfsnobody用戶,說白了就是NFS為了我們方便,當我
們並不關心/data的所有者是誰時,給它指定成nfsnobody即可。

現在情況有變,我們不想讓/data目錄的所有者和所屬組都是nfsnobody,想指定一個id和名字都
固定的其它用戶,比如uid和gid都是666的www用戶,這時我們對客戶端和服務端都需要進行操作:

1 服務端操作

[root@nfs-server ~]# groupadd -g 666 www
[root@nfs-server ~]# useradd -u 666 -g 666 -s /sbin/nologin -M www
[root@nfs-server ~]# id www
uid=666(www) gid=666(www) groups=666(www)
[root@nfs-server ~]# vim /etc/exports
[root@nfs-server ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs-server ~]# exportfs -arv
exporting 172.16.1.0/24:/data
[root@nfs-server ~]# chown -R www:www /data
[root@nfs-server ~]# ls -ld /data
drwxr-xr-x 2 www www 90 Sep  8 23:11 /data

把www用戶建立成虛擬用戶不是必須的,只不過為了安全考慮,默認的nfsnobody就是虛擬用戶,其
無法登錄系統。uid和gid都設置成固定值是為了便於管理。

2 客戶端操作

[root@web-client ~]# groupadd -g 666 www
[root@web-client ~]# useradd -u 666 -g 666 -s /sbin/nologin -M www
[root@nfs-web-client ~]# id www
uid=666(www) gid=666(www) groups=666(www)

客戶端建立同ID,同名稱的www用戶不是必須的,但是如果我們不建立,那麽在客戶端查看/data目錄
下的屬性時,會像下面這樣:

[root@web-client ~]# ls -l /data
total 12
-rw-r--r-- 1 666 666 14 Sep  8 12:27 f1.txt
-rw-r--r-- 1 666 666  7 Sep  8 09:27 f2.txt
-rw-r--r-- 1 666 666  0 Sep  7 19:28 f3.txt

那麽多666?一點都不順,而是老別扭了,因此我們需要在客戶端這邊也建立同ID,同名稱的用戶,
需要註意,Linux系統是根據ID識別用戶的,客戶端這邊最好不要有其它用戶id是666,那就太亂
了。創建好同樣的ID後,我再看一下屬性:

[root@web-client ~]# ls -l /data
total 12
-rw-r--r-- 1 www www 14 Sep  8 12:27 f1.txt
-rw-r--r-- 1 www www  7 Sep  8 09:27 f2.txt
-rw-r--r-- 1 www www  0 Sep  7 19:28 f3.txt

這樣才符合我們的認知直覺。

NFS服務端配置小結

現在,我們再看一下極簡案例中配置NFS服務端配置的步驟(稍作修改):

[root@nfs-server ~]# yum install nfs-utils -y
[root@nfs-server ~]# systemctl restart rpcbind
[root@nfs-server ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs-server ~]# mkdir /data
[root@nfs-server ~]# chown -R nfsnobody:nfsnobody /data
[root@nfs-server ~]# systemctl restart nfs-server

如果對上面的每一行都清楚其作用的話,那麽恭喜你也感謝你,說明NFS服務端配置套路已基本掌握,
也說明我上面的內容寫的不錯哈。不過現在記得,未必以後也記得,我在這裏也總結下:

  1. rpcbind服務必須先啟動,然後再啟動nfs-server服務,否則NFS服務搭建失敗。
  2. 修改服務端配置文件後,需要重啟服務或重載配置文件使其生效。
  3. 要共享的目錄其所有者和所屬組必須是anonuid和anongid指定的用戶。

NFS客戶端配置

服務端已經配置完畢,現在就等著客戶端使用了。NFS服務是rpcbind服務進行遠程通信的,顯然
客戶端這邊同樣需要rpcbind服務,不過為了方便我們在客戶端也直接裝上nfs-utils包,不過只
需啟動rpcbind服務即可。

[root@web-client ~]# yum install nfs-utils -y
[root@nfs-server ~]# systemctl restart rpcbind

另外如果服務端共享目錄的所有者和所屬組不是nfsnobody,在客戶端最好也創建一個同ID,用名稱
的用戶,創建方法見上文。

查看遠端共享目錄

rpcbind服務已經啟動完畢,現在可以掛載遠端目錄了,但是且慢,如果我們不知道遠端共享的是什麽
目錄呢,這時我們需要看一下遠端共享了哪些目錄,此時我們可以使用下面的命令:

[root@web-client ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

完整語法如下:

showmount [ --exports ] [ --help ] [ --version ] [ host ]
-e or --exports,顯示遠程服務器,可供使用的掛載列表

showmount在客戶端和服務端都可以使用,只要安裝了nfs-utils包,就有該命令,基本上用法就上面
一種,可以看到172.16.1.31這臺NFS服務器共享了其/data目錄給大家使用。大家可能會感覺上面給
出的共享參數信息,有點少啊,比如不知道是否對該目錄有寫入權限,如果看到的信息類似與在服務
cat /etc/exports那樣,似乎更好一些,但是本人多方查找資料,基本確定沒有辦法在客戶端
看到共享參數權限的詳細信息,要想知道自己是否對某個共享目錄具有寫入權限,只能靠人工測試,
如果沒有寫入權限,會得到如下所示的提示:

[root@web-client ~]# echo '123' > /data/f1.txt
bash: /data/f1.txt: Read-only file system

showmount命令不加參數直接回車,無任何效果並且Xshell會卡住,CTRL+C無效,只能等待。

掛載共享目錄

知道是哪個遠端機器,共享的什麽目錄,就可以開始掛載了:

[root@web-client ~]# mkdir /data
[root@web-client ~]# mount -t nfs 172.16.1.31:/data /data

註意遠端的/data目錄不一定必須掛載在本地的/data目錄,其它目錄也一樣可以。掛載完畢之後,
可以使用df -h命令查看一下:

技術分享圖片

這樣掛載之後,我們就可以正常在本地/data目錄裏使用遠程/data目錄裏的文件了,本地和遠端
操作的都是同一塊硬盤,對客戶端來說遠程NFS服務器仿佛是透明的。

卸載共享目錄

回顧一下正常掛載的語法:mount -t type device dir
正常卸載的語法:umount dir

完整卸載的語法:
umount [-dflnrv] {dir|device}... ,其中-lf參數比較常用,下面分別進行介紹。

-l, --lazy
直接翻譯是懶惰卸載,可以理解為平滑卸載。請看下面的示例:

[root@web-client data]# pwd
/data
[root@web-client data]# umount /data
umount.nfs4: /data: device is busy

我們知道這種情況無法卸載的原因顯而易見,就是我們當前處於/data目錄,從而提示設備
被占用,導致我們無法卸載。但有時提示設備被占用,我們也不知道到底是哪個程序占用了
/data目錄裏的文件,或者我們不關註/data是不是還有文件正在使用,就是要直接卸載
/data,此時就可以添加-l,如下:

[root@web-client data]# umount -l /data

此時我們使用df -h,已經看不到/data目錄的掛載信息了,但是/data目錄並沒有被立即
卸載,系統會自動判斷當我們已經沒有程序占用/data目錄時,自動卸載/data目錄

-f, --force
強制卸載,通常用在NFS系統上,經常配合-l參數使用。比如當前系統/data目錄是NFS
遠程共享的,若果遠程的NFS服務器,突然故障,此時我們無法訪問/data目錄,並且正常
卸載/data目錄也無法卸載,則可以使用:

[root@web-client /]# umount -lf /data

強制進行卸載。

參考資料

http://cn.linux.vbird.org/linux_server/0330nfs.php#exec
http://docs.etiantian.org/15323330999008.html#toc_5
https://en.wikipedia.org/wiki/Network_File_System
https://en.wikipedia.org/wiki/Open_Network_Computing_Remote_Procedure_Call
跟老男孩學Linux運維-Web集群實戰-老男孩著

作者:阿勝4K
出處:https://www.cnblogs.com/asheng2016/p/9613065.html

NFS-網絡文件共享服務