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关系图
通信过程:
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