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 |