目錄:
NFS是Network File System(網絡文件系統)。主要功能是通過網絡讓不同的服務器之間可以共享文件或者目錄。NFS客戶端一般是應用服務器(比如web,負載均衡等),可以通過掛載的方式將NFS服務器端共享的目錄掛載到NFS客戶端本地的目錄下。
因為 NFS 支持的功能相當的多,而不同的功能都會使用不同的程序來啟動, 每啟動一個功能就會啟用一些端口來傳輸數據,因此, NFS 的功能所對應的端口才沒有固定住, 而是隨機取用一些未被使用的小於 1024 的埠口來作為傳輸之用。但如此一來又造成客戶端想要連上服務器時的困擾, 因為客戶端得要知道服務器端的相關埠口才能夠聯機吧!
此時我們就得需要遠程過程調用 (RPC) 的服務啦!RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給客戶端,讓客戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當服務器在啟動 NFS 時會隨機取用數個埠口,並主動的向 RPC 注冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然后 RPC 又是固定使用 port 111 來監聽客戶端的需求並回報客戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕松愉快了。
NFS在文件傳送過程中依賴與RPC(遠程過程調用)協議。NFS本身是沒有提供信息傳送的協議和功能的,但是能夠用過網絡進行圖片,視頻,附件等分享功能。只要用到NFS的地方都需要啟動RPC服務,不論是NFS的服務端還是客戶端。
NFS和RPC的關系:可以理解為NFS是一個網絡文件系統(比喻為租房的房主),而RPC是負責信息的傳輸(中介),客戶端(相當於租房的租客)。
要設定好 NFS 服務器我們必須要有兩個軟件才行,分別是:
- RPC 主程序:rpcbind
就如同剛剛提的到,我們的 NFS 其實可以被視為一個 RPC 服務,而要啟動任何一個 RPC 服務之前,我們都需要做好 port 的對應 (mapping) 的工作才行,這個工作其實就是『 rpcbind 』這個服務所負責的!也就是說, 在啟動任何一個 RPC 服務之前,我們都需要啟動 rpcbind 才行! (在 CentOS 5.x 以前這個軟件稱為 portmap,在 CentOS 6.x 之后才稱為 rpcbind 的!) - NFS 主程序:nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 這兩個 NFS daemons 與其他相關 documents 與說明文件、執行文件等的軟件!這個就是 NFS 服務所需要的主要軟件啦!一定要有喔!
NFS 這個咚咚真的是很簡單,上面我們提到的 NFS 軟件中,配置文件只有一個,執行檔也不多, 記錄文件也三三兩兩而已吶!趕緊先來看一看吧!
-
- 主要配置文件:/etc/exports
這個檔案就是 NFS 的主要配置文件了!不過,系統並沒有默認值,所以這個檔案『 不一定會存在』,你可能必須要使用 vim 主動的建立起這個檔案喔!我們等一下要談的設定也僅只是這個檔案而已吶! - NFS 文件系統維護指令:/usr/sbin/exportfs
這個是維護 NFS 分享資源的指令,我們可以利用這個指令重新分享 /etc/exports 變更的目錄資源、將 NFS Server 分享的目錄卸除或重新分享等等,這個指令是 NFS 系統里面相當重要的一個喔!至於指令的用法我們在底下會介紹。 - 分享資源的登錄檔:/var/lib/nfs/*tab
在 NFS 服務器的登錄文件都放置到 /var/lib/nfs/ 目錄里面,在該目錄下有兩個比較重要的登錄檔, 一個是 etab ,主要記錄了 NFS 所分享出來的目錄的完整權限設定值;另一個 xtab 則記錄曾經鏈接到此 NFS 服務器的相關客戶端數據。 - 客戶端查詢服務器分享資源的指令:/usr/sbin/showmount
這是另一個重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 則主要用在 Client 端。這個 showmount 可以用來察看 NFS 分享出來的目錄資源喔!
- 主要配置文件:/etc/exports
# yum -y install nfs-utils rpcbind
需要先啟動rpcbind服務
# systemctl enable nfs
# systemctl enable rpcbind
# systemctl start rpcbind
# systemctl start nfs
# mkdir /nfsfile #如果在配置文件中使用了all_squash權限壓縮,需要給nfsfile文件授權:# chown nfsnobody /nfsfile # cat /etc/exports /nfsfile 10.6.0.0/8(rw,all_squash,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 啰。 |
配置生效
# exportfs -rv
查看rpc使用狀況
# rpcinfo -p localhost
選項與參數: -p :針對某 IP (未寫則預設為本機) 顯示出所有的 port 與 porgram 的信息; -t :針對某主機的某支程序檢查其 TCP 封包所在的軟件版本; -u :針對某主機的某支程序檢查其 UDP 封包所在的軟件版本;
在你的 NFS 服務器設定妥當之后,我們可以在 server 端先自我測試一下是否可以聯機喔!就是利用 showmount 這個指令來查閱!
# showmount -e localhost Export list for localhost: /nfsfile 10.6.0.0/8
選項與參數: -a :顯示目前主機與客戶端的 NFS 聯機分享的狀態; -e :顯示某部主機的 /etc/exports 所分享的目錄數據。
# yum -y install nfs-utils
# mkdir /nfsmnt
# showmount -e 10.6.2.198 #查看NFS共享的目錄
Export list for 10.6.2.198:
/nfsfile 10.6.0.0/8
為了提高NFS的穩定性,使用TCP協議掛載,NFS默認用UDP協議
# mount -t nfs 10.6.2.198:/nfsfile /nfsmnt -o proto=tcp -o nolock
為了方便配置防火牆,需要固定nfs服務端口,NFS啟動時會隨機啟動多個端口並向RPC注冊,這樣如果使用iptables對NFS端口進行限制就會有點麻煩,可以更改配置文件固定NFS服務相關端口。
# rpcinfo -p localhost
# vim /etc/sysconfig/nfs
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004
# service nfs restart #再使用:# rpcinfo -p localhost 就可以查看到端口了。
安裝nfs客戶端:
導出列表在 10.6.2.198:
/nfsfile 10.6.0.0/8