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