linux使用NFS共享目錄或者文件

NFS技術

NFS可以通過網絡讓不同的主機系統之間彼此共享文件或者目錄。

在服務器的使用過程中,通常會有專門的數據存放機器和應用服務機器。我們所要做的就是如何讓應用服務機訪問到數據機的數據。這裏使用NFS(network file system)技術。

NFS使用的方式也是基於C/S架構,就是說,數據機可以充當S端,而訪問者充當C端。通過掛載的方式,可以使數據端的目錄如同本地目錄一樣訪問。

由於數據和應用程序是在不同的機器上的,那麼可以知道NFS是通過網絡來進行數據傳輸的,那麼也就會使用一些端口來傳輸數據,在端口選擇的時候,通常是隨機選擇的。而爲了NFS的客戶端能夠知道服務端到底使用了哪個端口,通常會用RPC(遠程過程調用,Remote Procedure Call)協議/服務來實現。

RPC技術

NFS功能非常多,而不同的功能涉及到網絡傳輸時,都會啓用一些端口來傳輸數據,因此,NFS功能所對應的端口才無法固定,而是隨機選用一些未使用的端口來傳輸。這些端口必須要進行記錄,這樣才能夠保證不同的客戶端在訪問服務器時,能夠通過不同的端口,找到正確的數據。
RPC的主要功能就是記錄每個NFS功能所對應的端口號,並在NFS客戶端請求時將該端口和功能對應的信息傳遞給客戶端,保證客戶端可以正確的連接到NFS端口上。相當於中介的功能。

NFS工作流程

NFS工作原理

大致如以下幾點:

1、首先用戶訪問網站程序,由程序在NFS客戶端上發出NFS文件存取功能的詢問請求,這時NFS客戶端(即執行程序的服務器)RPC服務(portmap或rpcbind服務)就會通過網絡向NFS服務端的RPC服務(portmap或rpcbind)的某個端口發出NFS文件存取功能的詢問請求。

2、NFS服務器端的RPC服務(即portmap或rpcbind)找到對應的已註冊的NFS daemon端口後,通知NFS客戶端的RPC服務(即portmap或rpcbind服務)

3、此時NFS客戶端就可以獲取到正確的端口,然後就直接與NFS daemon聯機存取數據了。

4、NFS客戶端把數據存取成功後,返回給當前訪問程序,告知用戶存取結果,作爲網站用戶,我們就完成了一次存取操作。 由於NFS的各項功能都需要向RPC服務註冊,所以RPC服務才能獲取到NFS服務的各項功能對應的端口、PID、NFS在主機所監聽的IP等,NFS客戶端才能夠通過向RPC服務詢問才找到正確的端口。也就是說,NFS需要有RPC服務的協助才能成功對外提供服務。由上面的描述,我們不難推出:無論是NFS客戶端還是NFS服務器端,當要使用NFS時,都需要首先啓動RPC服務,然後在啓動NFS服務,客戶端可以不啓動NFS服務。

部署實例

服務端

sudo apt-get update

sudo apt install nfs-kernel-server

sudo apt install rpcbind

檢查各項服務的狀態

ps -ef | grep rpcbind/nfs
# 或
/etc/init.d/rpcbind status

啓動rpcbind服務:

/etc/init.d/rpcbind start/restart

查看rpc信息 rpcinfo

rpcinfo -p localhost
#program vers proto   port  service
#1000004   tcp111  portmapper
#1000003   tcp111  portmapper
#1000002   tcp111  portmapper
#1000004   udp111  portmapper
#1000003   udp111  portmapper
#1000002   udp111  portmapper

如果沒有開啓,則上述指令會報錯:

rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused

啓動nfs服務

/etc/init.d/nfs-kernel-server start/restart

再次查看rpc信息 rpcinfo

rpcinfo -p localhost
#program vers proto   port  service
#1000004   tcp111  portmapper
#1000003   tcp111  portmapper
#1000002   tcp111  portmapper
#1000004   udp111  portmapper
#1000003   udp111  portmapper
#1000002   udp111  portmapper
#1000052   udp  50921  mountd
#1000052   tcp  36843  mountd
#1000053   udp  55650  mountd
#1000053   tcp  45212  mountd

上面可以看出,多了一些端口,說明NFS已經向RPC服務進行了端口註冊

客戶端

和服務端一樣,客戶端只需要啓動RPC服務就可以了,具體使用方式和上面一樣。

配置服務端

後面假設服務端的ip地址爲:1, 2, 3, 4,客戶端的ip地址爲5,6, 7, 8

  1. 創建共享目錄
mkdir /data
chmod 777 data
  1. 配置/etc/exports
vim /etc/exports
在最下面添加一行
/data 5.6.7.8(rw, sync, no_root_squash, no_subtree_check)

其中,5.6.7.8這個網址就是客戶端的ip地址,表示該客戶端可以對/data文件夾進行操作,操作的權限在括號中的參數中指定。如果將這個地址設爲*,那麼表示允許任意客戶端來訪問該文件夾。

後面的參數意思如下:

參數 說明
rw read-write,讀寫權限
ro read-only,只讀權限
sync 同步,請求或寫入數據時,數據同步寫入到NFS Server的硬盤後才返回
async 異步,請求或寫入數據時,先返回請求,再將數據寫入到內存緩存和硬盤中,即異步寫入數據。此參數可以提升NFS性能,但是會降低數據的安全性。因此,一般情況下建議不用,如果NFS處於瓶頸狀態,並且允許數據丟失的話可以打開此參數提升性能。寫入時會先放到內存緩衝區,等硬盤有空檔再寫入磁盤,這樣可以提升寫入效率,風險:服務器宕機或不正常關機,會損失緩衝區中未寫入磁盤的數據。
no_root_squash 訪問NFS Server共享目錄的用戶,如果是root,它對該共享目錄具有root權限,這個配置原本爲無盤客戶端準備的,用戶應避免使用。
root_squash 對於訪問NFS Server共享目錄的用戶,如果是root,則它的權限將被壓縮成匿名用戶,同時它的UID和GID通常會變成nobody或nfsnobody賬號身份。
all_squash 不管訪問NFS Server共享目錄的用戶身份如何,它的權限都將被壓縮成匿名用戶,同時他的UID和GID都會變成nobody或nfsnobody賬號身份,在多個NFS客戶端同時讀寫NFS Server數據時,這個參數很有用。
anonuid 參數以anon*開頭是指anonymous匿名用戶,這個用戶的UID設置值通常爲nobody和nfsnobody的UID值,當然我們也可以自行設置這個UID值。但是UID必須存在於/etc/passwd中。在多個NFS Client時,如多臺web server共享一個NFS目錄時,通過這個參數可以使得不同的NFS Client寫入的數據對所有的NFS Client保持同樣的用戶權限,即爲配置的匿名UID對應用戶權限,這個參數很有用。
anongid 同上,區別就在於uid和gid
secure 不允許Client使用大於1024的端口號,也就是從Server傳遞的資料到Client端的目標port要小於1024,此時,Client端一定要使用root賬號才能mount遠端NFS Server,建議使用insecure
insecure 允許Client端自行決定個你自己機器使用的port,通常都會設置這個,如此非root賬號的client端才能 mount NFS Server
nohide 當export出兩個目錄,而其中一個目錄是另外一個目錄的子目錄,例如:我們使用虛擬目錄的例子,此時我們mount跟目錄時,會自動把所有子目錄mount起來。建議使用這個選項比較方便,尤其是在NFSv4有虛擬目錄的情形。
hide 當mount跟目錄時,export出的子目錄需要自己明確的再掛載
subtree_check 當分享的目錄是某個檔案系統的子目錄,選用這個可以確定父目錄的權限讓NFS Server分享使用。
no_subtree_check 剛好和上面的相反,因爲不做權限測試,效能比較好
fsid=0 定義NFSv4中的目錄,只能有一個
  1. 檢查配置結果
cat /etc/exports

cat /etc/exports

cat /etc/exports

可能在修改exports之後沒有立即生效,這時可以通過重啓rpc和nfs服務,這樣再執行上面的命令,就可以看到修改之後的結果。上面的結果表明允許任何客戶端訪問,開放狀態。

  1. 服務端自身檢查
showmount -e localhost

服務端情況

服務端情況

表示這個路徑是開放的。

配置客戶端

  1. 客戶端檢查

查看服務端的情況

showmount -e 1,2,3,4

客戶端檢查

客戶端情況
  1. 客戶端掛載目錄

在客戶端上執行下面的命令

sudo mount -t nfs 1.2.3.4:/data /本地目錄
  1. 檢查磁盤情況
df -h

磁盤情況

磁盤掛載情況

可以看到,出現了服務端的地址和對應的目錄,包括容量大小,最後還有本地掛載的目錄的絕對路徑

出錯情況

  1. 出現permissiong deny的情況一般都是權限問題,所以檢查文件的權限。
  2. 偶爾會出現服務器重啓或者因爲各種不明原因,導致服務器的路徑/data出現了問題,這時如果在客戶端在進行訪問的時候,就會發現訪問掛載在本地的目錄時會出現:"mount.nfs: stale file handle"的報錯

通過指令進行查看文件屬性,掛載的目錄結果可能是下面這樣的:

ls -al

查看文件屬性

文件屬性變化

無法通過rm等命令進行刪除,並且提示這是個句柄。
解決這個問題,可以通過在宿主機目錄中,將該目錄卸載來進行處理:

umount -rf /本地目錄絕對路徑

然後再次查看的話,可以發現目錄已經還原到本地文件夾正常形式,這時候可以進行刪除等其他操作。
對於服務端也是這樣。
之後再按照前面的方式進行再次配置就可以了。

後續問題

可以通過參考NFS講解來繼續瞭解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章