NFS簡介
NFS(Network File System)的縮寫,它的主要功能是:通過網絡、讓不同的機器、不同的OS可以共享彼此的文件
NFS服務器可以允許NFS客戶端將遠端NFS服務器的共享目錄掛載到自己的NFS客戶端,這樣客戶端就好比有在本地有一塊磁盤一樣,只不過是網絡磁盤而已。
掛載結構圖
如上圖,當我們在NFS服務器設置好一個共享目錄/data/share後,其他的有權限訪問NFS服務器的NFS客戶端就可以講這個目錄掛載到自己的本地,並且能看到服務端/data/share下的所有數據
NFS是通過網絡來進行Server端和Client端之間的數據傳輸,既然走網絡,雙方肯定都要有端口,哪NFS Server怎麼知道使用哪個端口來進行數據傳輸,NFS其實會隨機選擇端口來進行數據傳輸。那NFS客戶端又是如何知道NFS服務端到底是使用哪個端口呢?其實NFS服務器是通過遠程過程調用RPC(Remote Procedure Call)協議來實現的,所以,RPC管理服務端的NFS端口分配,客戶端要傳數據,那麼客戶端的RPC會先跟服務端的RPC去要服務器的端口,要到端口後,再建立連接,然後傳輸數據,見下圖
NFS客戶端/NFS服務端、RPC關係圖
如上圖,當我們在NFS服務器設置好一個共享目錄/data/share後,其他的有權限訪問NFS服務器的NFS客戶端就可以講這個目錄掛載到自己的本地,並且能看到服務端/data/share下的所有數據
NFS是通過網絡來進行Server端和Client端之間的數據傳輸,既然走網絡,雙方肯定都要有端口,哪NFS Server怎麼知道使用哪個端口來進行數據傳輸,NFS其實會隨機選擇端口來進行數據傳輸。那NFS客戶端又是如何知道NFS服務端到底是使用哪個端口呢?其實NFS服務器是通過遠程過程調用RPC(Remote Procedure Call)協議來實現的,所以,RPC管理服務端的NFS端口分配,客戶端要傳數據,那麼客戶端的RPC會先跟服務端的RPC去要服務器的端口,要到端口後,再建立連接,然後傳輸數據,見下圖
通信過程:
1.首先服務器端啓動RPC服務,並開啓111端口
2.服務器端啓動NFS服務,並向RPC註冊端口信息
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 |