NFS(Network File System)即網絡文件系統,是由Sun公司開發的一種通過網絡方式共享文件系統的通用共享解決方案。可以將遠程Linux系統上的文件共享資源掛載到本地主機(Linux客戶端)的目錄上,從而使得本地主機(Linux客戶端)基於TCP/IP協議,像使用本地主機上的資源那樣讀寫遠程Linux系統上的共享文件。
一、安裝和配置NFS
yum install nfs-utils rpcbind
第1步:為了檢驗NFS服務配置的效果,需要使用兩台Linux主機(一台充當NFS服務器,一台充當NFS客戶端),下表是它們所使用的操作系統以及IP地址。
兩台Linux主機所使用的操作系統以及IP地址 |
||
主機名稱 | 操作系統 | IP地址 |
NFS服務端 | CentOS7.5 | 192.168.5.136 |
NFS客戶端 | CentOS7.5 | 192.168.5.65 |
第2步:在NFS服務器上建立用於NFS文件共享的目錄,並設置足夠的權限確保其他人也有寫入權限。
mkdir /nfsfile
chmod -Rf 777 /nfsfile
echo "Welcome to NFS" > /nfsfile/readme
第3步:NFS服務程序的配置文件為/etc/exports,設定哪些客戶端可以訪問哪些NFS共享文件系統,默認情況下里面沒有任何內容,該文件的書寫原則如下。
(1)空白行將被忽略;
(2)以#符號開頭的內容為注釋;
(3)配置文件中可以通過符號轉義換行;
(4)每個共享的文件系統需要獨立一行條目;
(5)客戶端主機列表需要使用空格隔開;
(6)配置文件中支持通配符。
一條完整的共享條目語法結構如下,定義要共享的目錄與相應的權限,其中,客戶端主機可以是一個網段、單台主機或主機名。
共享目錄的路徑 允許訪問的NFS客戶端(共享權限參數)
也可以為多個客戶主機設置不同的訪問選項,語法結構如下:
共享目錄的路徑 允許訪問的NFS客戶端1(共享權限參數) 允許訪問的NFS客戶端2(共享權限參數)...
例如,如果想要把/nfsfile目錄共享給192.168.5.0/24網段內的所有主機,讓這些主機都擁有讀寫權限,在將數據寫入到NFS服務器的硬盤中后才會結束操作,最大限度保證數據不丟失,以及把來訪客戶端root管理員映射為本地的匿名用戶等,則可以按照下面命令中的格式,將下表中的參數寫到NFS服務程序的配置文件中。
用於配置NFS服務程序配置文件的參數 | |
參數 | 作用 |
ro | 只讀 |
rw | 讀寫 |
wdelay | 延遲寫操作 |
root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的匿名用戶 |
no_root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的root管理員 |
all_squash | 無論NFS客戶端使用什么賬戶訪問,均映射為NFS服務器的匿名用戶 |
sync | 同時將數據寫入到內存與硬盤中,保證不丟失數據 |
async | 優先將數據保存到內存,然后再寫入硬盤;這樣效率更高,但可能會丟失數據 |
以上參數中,ro與rw比較容易理解,用來定義客戶端訪問共享時可以獲得的權限是只讀訪問還是可讀寫訪問。計算機對數據進行修改時會先將修改的內容寫入快速的內存,隨后才會慢慢寫入慢速的硬盤設備中,async選項允許NFS服務器在沒有完全把數據寫入硬盤前就返回成功消息給客戶端,而此時數據實際還存放在內存中,但客戶端則顯示數據已經寫入成功。注意,該選項僅影響操作消息的返回時間,並不決定如何進行寫操作,sync選項將確保在數據真正寫入存儲設備后才會返回成功信息。wdelay為延遲寫入選項。也就是說,它決定了先將數據寫入內存,再寫入硬盤,然后將多個寫入請求合並后寫入硬盤,這樣可以減少對硬盤I/O的次數,從而優化性能,該選項可以優化NFS性能,但有可能導致非正常關閉NFS時數據丟失情況的發生。與此相反的選項是no_wdelay,但該選項與async選項一起使用時將不會生效,因為async是基於wdelay實現對客戶端的一種響應功能。默認情況下,NFS會自動屏蔽root用戶的權限,root_squash 使得客戶端使用root賬號訪問NFS時,服務器系統默認會自動將root映射為服務器本地的匿名賬號,通過anonuid可以指定匿名賬號ID,默認anonuid為65534,也就是nfsnobody賬號,使用no_root_squash可以防止這種映射而保留root權限,all_squash選項則可以屏蔽所有的賬戶權限,將所有的用戶對NFS的訪問自動映射為服務器本地的匿名賬戶。默認情況下,普通賬號的權限是保留的,也就是沒有進行squash操作。
下面進行/etc/exports配置文件的設置:
vim /etc/exports
# 需要注意,NFS客戶端地址與權限之間沒有空格
/nfsfile 192.168.5.0/24(rw,sync,root_squash)
注意:最簡單的NFS配置可以僅給定一個共享目錄的路徑與一個允許訪問的NFS客戶端主機,而不指定選項,因為沒有選項時,NFS將使用默認設置,而默認屬性為ro、sync、wdelay、root_squash。
第4步:啟動和啟用NFS服務程序。由於在使用NFS服務進行文件共享之前,需要使用RPC(Remote Procedure Call,遠程過程調用)服務將NFS服務器的IP地址和端口號等信息發送給客戶端。因此,在啟動NFS服務之前,還需要順帶重啟並啟用rpcbind服務程序,並將這兩個服務一並加入開機啟動項中。
systemctl restart rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
NFS默認使用TCP與UDP的2049端口,rpcbind使用TCP與UDP的111端口。
這里順便再記錄下NFS的工作原理(參考自:https://www.cnblogs.com/JohnABC/p/5868674.html)
NFS並不是單獨存在的,它和另外2個模塊共同存在,試想兩台網絡當中的主機如何進行通訊,當然只有通過ip+port來發送數據。
包括NFS在內,這三個模塊(nfs的三個模塊的作用?)分別是NFS,RPC,PORTMAP。NFS只負責將數據通過以文件系統的方式共享出去,並進行登錄管理和權限管理,並不負責數據的傳輸,而數據的傳輸則有RPC(Remote Procedure Call,遠程過程調用)來完成。試想遠程客戶端在進行鏈接的時候需要知道哪個端口可用,以便將可用的端口用於NFS數據傳輸(NFS的數據傳輸方式有端口來完成),而負責維護可用端口與遠程主機的映射關系則是有PORTMAP的完成的。
NFS的兩個子模塊,登錄管理和權限管理分別是由rpc.nfsd和rpc.mountd這兩個子模塊來完成的。在nfs的啟動代碼當中可以看到這兩個程序的存在。
不難想出,NFS的工作流程是,遠程客戶端進行nfs請求,RPC獲得請求,通知PORTMAP來獲取端口號,然后PORTMAP將可用的端口號傳給NFS、RPC,然后NFS模塊再進行權限檢驗,如果有足夠的權限,RPC就通過PORTMAP給出的端口進行數據傳輸,並通過該端口到達客戶端。
nfs的幾個模塊大致是這樣協調的,具體的權限管理,模塊配置則可以通過具體的配置文件來完成。
二、客戶端訪問NFS共享
NFS客戶端的配置步驟也十分簡單。先使用showmount命令(以及必要的參數,見下表)查詢NFS服務器的遠程共享信息,其輸出格式為“共享的目錄名稱 允許使用客戶端地址”。
showmount命令中可用的參數以及作用 | |
參數 | 作用 |
-e | 顯示NFS服務器的共享列表 |
-a | 顯示本機掛載的文件資源的情況NFS資源的情況 |
-v | 顯示版本號 |
客戶端安裝nfs-utils后,才能使用showmount命令:
yum install nfs-utils
showmount -e 192.168.5.136
然后在NFS客戶端創建一個掛載目錄。使用mount命令並結合-t參數,指定要掛載的文件系統的類型,並在命令后面寫上服務器的IP地址、服務器上的共享目錄以及要掛載到本地系統(即客戶端)的目錄。
掛載成功后就應該能夠順利地看到在執行前面的操作時寫入的文件內容了
cat /nfsfile/readme
如果希望NFS文件共享服務能一直有效,則需要將其寫入到fstab文件中:
vim /etc/fstab
如下圖所示:
卸載掛載目錄命令:
umount /nfsfile/
三、AutoFs自動掛載服務(可參考其他博客:https://blog.51cto.com/andyxu/2171468)
無論是Samba服務還是NFS服務,都要把掛載信息寫入到/etc/fstab中,這樣遠程共享資源就會自動隨服務器開機而進行掛載。雖然這很方便,但是如果掛載的遠程資源太多,則會給網絡帶寬和服務器的硬件資源帶來很大負載。如果在資源掛載后長期不使用,也會造成服務器硬件資源的浪費。
autofs自動掛載服務可以解決這一問題。與mount命令不同,autofs服務程序是一種Linux系統守護進程,當檢測到用戶試圖訪問一個尚未掛載的文件系統時,將自動掛載該文件系統。換句話說,我們將掛載信息填入/etc/fstab文件后,系統在每次開機時都自動將其掛載,而autofs服務程序則是在用戶需要使用該文件系統時才去動態掛載,從而節約了網絡資源和服務器的硬件資源。
安裝autofs服務:
yum install autofs
處於生產環境中的Linux服務器,一般會同時管理許多設備的掛載操作。如果把這些設備掛載信息都寫入到autofs服務的主配置文件中,無疑會讓主配置文件臃腫不堪,不利於服務執行效率,也不利於日后修改里面的配置內容,因此在autofs服務程序的主配置文件中需要按照“掛載目錄 子配置文件”的格式進行填寫。掛載目錄是設備掛載位置的上一級目錄。例如,要將NFS服務器共享文件掛載到客戶端 /nfsfile/demo 目錄中,那么掛載目錄寫成 /nfsfile 即可。對應的子配置文件則是對這個掛載目錄內的掛載設備信息作進一步的說明。子配置文件需要用戶自行定義,文件名字沒有嚴格要求,但后綴建議以.misc結束。具體的配置參數如下圖第7行所示。
vim /etc/auto.master
保存退出!
新建文件:vim /var/nfs_auto.misc
寫入以下內容:
demo 192.168.5.136:/nfsfile
格式為:客戶端本地子目錄 [-掛載參數] NFS服務器共享目錄
掛載參數可不寫
# 重啟autofs服務
systemctl restart autofs
systemctl enable autofs
# 驗證是否可自動掛載
可以看到成功了!
本文參考自:《Linux就該這么學》 劉遄 著