環境: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目錄里寫入數據,大致會經過
如下幾個步驟:
- 客戶端把請求傳遞給自己的rpcbind服務
- rpcbind通過TCP/UDP協議把請求傳遞給服務端的rpcbind服務
- 服務端的rpcbind請求傳遞給服務端的nfs服務
- 服務端的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服務端配置套路已基本掌握,
也說明我上面的內容寫的不錯哈。不過現在記得,未必以后也記得,我在這里也總結下:
- rpcbind服務必須先啟動,然后再啟動nfs-server服務,否則NFS服務搭建失敗。
- 修改服務端配置文件后,需要重啟服務或重載配置文件使其生效。
- 要共享的目錄其所有者和所屬組必須是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