NFS 是 Network FileSystem 的縮寫,是讓不一樣的主機、不一樣的操做系統能夠共享存儲的服務。經過 NFS,咱們本地 NFS 的客戶端能夠透明地讀寫位於服務端 NFS 服務器上的文件,就像訪問本地文件同樣方便。vim
NFS 在文件傳送或信息傳送過程當中依賴於 RPC(Remote Procedure Call) 協議,即遠程過程調用, NFS 的各項功能都必需要向 RPC 來註冊,如此一來 RPC 才能瞭解 NFS 這個服務的各項功能 Port、PID、NFS 在服務器所監聽的 IP 等,而客戶端纔可以透過 RPC 的詢問找到正確對應的端口,因此,NFS 必需要有 RPC 存在時才能成功的提供服務,簡單的理解兩者關係:NFS是 一個文件存儲系統,而 RPC 是負責信息的傳輸。安全
下面詳細說明在Linux平臺上配置NFS服務的方法:服務器
這裏以CentOS和Ubuntu爲例來講明,物理機、雲主機或虛擬機都可,保障服務器和客戶機之間的網絡暢通。網絡
經過上邊簡要的介紹,咱們知道 NFS 服務須要依賴 RPC 服務,因此這裏 NFS 服務端須要安裝 rpcbind 和 nfs-utils,客戶端只須要安裝 nfs-utils 便可,因爲我選用的爲 CentOS 系統,因此可使用 yum 快速的安裝。app
#服務端 $ yum install -y nfs-utils rpcbind #客戶端 $ yum install -y nfs-utils
#服務端 apt install nfs-kernel-server #客戶端 apt install nfs-common
咱們在服務端建立一個共享目錄 /data/share ,做爲客戶端掛載的遠端入口,而後設置權限。async
$ mkdir -p /data/share $ chmod 666 /data/share
而後,修改 NFS 配置文件 /etc/exportstcp
$ vim /etc/exports #編輯文件內容以下: /data/share 10.222.77.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
說明一下,這裏配置後邊有不少參數,每一個參數有不一樣的含義,具體能夠參考下邊。此處,我配置了將 /data/share 文件目錄設置爲容許 IP 爲該 10.222.77.0/24 區間的客戶端掛載,固然,若是客戶端 IP 不在該區間也想要掛載的話,能夠設置 IP 區間更大或者設置爲 * 即容許全部客戶端掛載,例如:ide
#容許全部ip客戶端掛載 /data/share *(ro,sync,insecure,no_root_squash)
參數說明:測試
ro 只讀訪問 rw 讀寫訪問 sync 全部數據在請求時寫入共享 async nfs 在寫入數據前能夠響應請求 secure nfs 經過 1024 如下的安全 TCP/IP 端口發送 insecure nfs 經過 1024 以上的端口發送 wdelay 若是多個用戶要寫入 nfs 目錄,則歸組寫入(默認) no_wdelay 若是多個用戶要寫入 nfs 目錄,則當即寫入,當使用 async 時,無需此設置 hide 在 nfs 共享目錄中不共享其子目錄 no_hide 共享 nfs 目錄的子目錄 subtree_check 若是共享 /usr/bin 之類的子目錄時,強制 nfs 檢查父目錄的權限(默認) no_subtree_check 不檢查父目錄權限 all_squash 共享文件的 UID 和 GID 映射匿名用戶 anonymous,適合公用目錄 no_all_squash 保留共享文件的 UID 和 GID(默認) root_squash root 用戶的全部請求映射成如 anonymous 用戶同樣的權限(默認) no_root_squash root 用戶具備根目錄的徹底管理訪問權限 anonuid=xxx 指定 nfs 服務器 /etc/passwd 文件中匿名用戶的 UID anongid=xxx 指定 nfs 服務器 /etc/passwd 文件中匿名用戶的 GID
$ service rpcbind start #或者 $ /bin/systemctl start rpcbind.service
查看 NFS 服務項 rpc 服務器註冊的端口列表ui
$ rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper
注意:此時咱們尚未啓動 NFS 服務,只監聽了 111 端口,接着咱們來啓動 NFS 服務,再來看下注冊的端口列表。
$ service nfs start #或者 /bin/systemctl start nfs.service
啓動 NFS服務後 rpc 服務已經啓用了對 NFS 的端口映射列表:
$ rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 33745 status 100024 1 tcp 36980 status 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 100021 1 udp 38960 nlockmgr 100021 3 udp 38960 nlockmgr 100021 4 udp 38960 nlockmgr 100021 1 tcp 38362 nlockmgr 100021 3 tcp 38362 nlockmgr 100021 4 tcp 38362 nlockmgr
咱們發現,啓動了 NFS 服務後,rpc 註冊的端口列代表顯增多。OK 如今服務端都啓動起來了,在服務端看下是否正確加載了設置的 /etc/exports 配置。
$ showmount -e localhost Export list for localhost: /data/share 10.222.77.0/24
若是使用了防火牆,必定要在服務端把須要的端口打開,不然會客戶端沒法訪問。
默認狀況須要以下端口:
tcp 111 2049 20048 端口 udp 111 4046 端口
最後,在另外一臺 Linux 上測試一下,是否可以正確掛載吧。首先,咱們能夠在客戶端查看下 NFS 服務端 (上邊服務端 IP 爲:10.222.77.86) 設置可共享的目錄信息。
# showmount -e 10.222.77.86 Export list for 10.222.77.86: /data/share 10.222.77.0/24
而後,在客戶端建立掛在目錄 /share
$ mkdir -p /share
最後,掛載遠端目錄到本地 /share 目錄。
$ mount 10.222.77.86:/data/share /share $ df -h | grep 10.222.77.86 Filesystem Size Used Avail Use% Mounted on 10.222.77.86:/data/share 27G 11G 17G 40% /share
能夠看到,能夠正確將遠端 NFS 目錄掛載到本地。注意:掛載點 /share 目錄必須已經存在,並且目錄中沒有文件或子目錄。
最後,咱們在 NFS 服務端 /data/share 目錄下建立一個文件,看下客戶端是否可以正確讀取並修改。
服務端寫入文件
$ echo "This is NFS server." > /data/share/nfs.txt $ ll /data/share/ total 4 -rw-r--r-- 1 root root 20 Nov 5 16:49 nfs.txt
在客戶端讀取測試
$ ll /share/ total 4 -rw-r--r-- 1 root root 20 Nov 5 16:49 nfs.txt $ cat /share/nfs.txt This is NFS server.
客戶端寫入文件$ echo "This is NFS client." >> /share/nfs.txt
服務端讀取測試
$ cat /data/share/nfs.txt This is NFS server. This is NFS client.
都是木有問題的,這是由於上邊設置了 NFS 遠端目錄權限爲 rw 擁有讀寫權限,若是設置爲 ro,那麼客戶端只能讀取,不能寫入,根據實際應用場景合理配置,這裏就不在演示了。這裏提一下,NFS 默認使用用 UDP 協議來進行掛載,爲了提升 NFS 的穩定性,可使用 TCP 協議掛載,那麼客戶端掛載命令可以使用以下命令:
$ mount 10.222.77.86:/data/share /share -o proto=tcp -o nolock
最後,若是客戶端要卸載 NFS 掛載的話,使用以下命令便可。
$ umount /share