共计 3854 个字符,预计需要花费 10 分钟才能阅读完成。
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 |