NFS簡介node
NFS(Network File System)的縮寫,它的主要功能是:經過網絡、讓不一樣的機器、不一樣的OS能夠共享彼此的文件安全
NFS服務器能夠容許NFS客戶端將遠端NFS服務器的共享目錄掛載到本身的NFS客戶端,這樣客戶端就比如有在本地有一塊磁盤同樣,只不過是網絡磁盤而已。服務器
掛載結構圖網絡
如上圖,當咱們在NFS服務器設置好一個共享目錄/data/share後,其餘的有權限訪問NFS服務器的NFS客戶端就能夠講這個目錄掛載到本身的本地,而且能看到服務端/data/share下的全部數據app
NFS是經過網絡來進行Server端和Client端之間的數據傳輸,既然走網絡,雙方確定都要有端口,哪NFS Server怎麼知道使用哪一個端口來進行數據傳輸,NFS其實會隨機選擇端口來進行數據傳輸。那NFS客戶端又是如何知道NFS服務端究竟是使用哪一個端口呢?其實NFS服務器是經過遠程過程調用RPC(Remote Procedure Call)協議來實現的,因此,RPC管理服務端的NFS端口分配,客戶端要傳數據,那麼客戶端的RPC會先跟服務端的RPC去要服務器的端口,要到端口後,再創建鏈接,而後傳輸數據,見下圖async
NFS客戶端/NFS服務端、RPC關係圖
tcp
通訊過程:ide
1.首先服務器端啓動RPC服務,並開啓111端口測試
2.服務器端啓動NFS服務,並向RPC註冊端口信息ui
3.客戶端啓動RPC服務,向服務端的RPC服務請求服務端的NFS端口
4.服務端的RPC服務反饋NFS端口信息給客戶端。
5.客戶端經過獲取的NFS端口來創建和服務端的NFS鏈接並進行數據的傳輸。
機器清單
主機名 |
IP地址 |
操做系統版本 |
備註 |
node100 |
172.20.20.100 |
CentOS 7.6 x64 |
NFS服務端 |
node200 |
172.20.20.200 |
NFS客戶端 |
實驗環境
CentOS:CentOS Linux release 7.6.1810 (Core)
2臺都操做
配置主機名:
# cat >> /etc/hosts << EOF
172.20.20.100 node100
172.20.20.200 node200
EOF
NFS服務端操做
# rpm -qa nfs-utils rpcbind
# yum install nfs-utils rpcbind
創建目錄
# mkdir -p /data/share
# chmod 666 /data/share/
# cat >> /etc/exports << EOF
/data/share 172.20.20.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
EOF
# mkdir -p /data/share/soft/
啓動RPC服務
# systemctl start rpcbind.service
[root@node100 ~]# ps -ef|grep rpcbind
rpc 15712 1 0 03:41 ? 00:00:00 /sbin/rpcbind -w
root 15714 8035 0 03:41 pts/0 00:00:00 grep --color=auto rpcbind
[root@node100 ~]# 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服務
# service nfs start
[root@node100 ~]# 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 40044 status
100024 1 tcp 34946 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 37957 nlockmgr
100021 3 udp 37957 nlockmgr
100021 4 udp 37957 nlockmgr
100021 1 tcp 43494 nlockmgr
100021 3 tcp 43494 nlockmgr
100021 4 tcp 43494 nlockmgr
是否加載配置/etc/exports
[root@node100 ~]# showmount -e localhost
Export list for localhost:
/data/share 172.20.20.0/24
在NFS客戶端安裝
# yum install nfs-utils
[root@node200 ~]# showmount -e 172.20.20.100
Export list for 172.20.20.100:
/data/share 172.20.20.0/24
在NFS客戶端進行測試
# mkdir /root/soft/
# mount 172.20.20.100:/data/share/soft /root/soft
[root@node200 soft]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 xfs 36G 1.1G 35G 4% /
devtmpfs devtmpfs 224M 0 224M 0% /dev
tmpfs tmpfs 235M 0 235M 0% /dev/shm
tmpfs tmpfs 235M 5.6M 229M 3% /run
tmpfs tmpfs 235M 0 235M 0% /sys/fs/cgroup
/dev/sda1 xfs 897M 127M 771M 15% /boot
tmpfs tmpfs 47M 0 47M 0% /run/user/0
172.20.20.100:/data/share/soft nfs4 36G 1.1G 35G 4% /root/soft
遇到的問題
[root@node200 ~]# showmount -e 172.20.20.100
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
由於iptables沒有添加規則所致,解決方法:
一是關閉防火牆,這樣不×××全。另外一個能夠向iptables中添加nfs的全部端口
這裏使用第一種方法:
systemctl stop firewalld.service
service iptables stop
相關參數說明:
參數 |
說明 |
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 |