NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS的数据传输基于RPC(remote procedure call)协议。
NFS 应用场景是:A,B,C 三台机器上需要保证被访问到的文件是一样的。A共享数据出来,B和C分别去挂载A共享的数据目录,从而B和C访问到的数据和A上的一致。
NFS服务需借助RPC协议实现通信。
服务端需要启动一个NFS服务,服务端要想给客户端提供服务,需要借助RPC协议,RPC协议是由rpcbind服务所实现的;在centos 5或者之前的版本叫portmap服务,centos6及之后的版本叫rpcbind服务,这两个都是一个服务,最终实现了RPC协议的通信,NFS服务默认不会监听任何端口(启动服务,但不会监听端口),最终监听端口,实现RPC通信的过程是由rpcbind服务产生的RPC协议实现的,RPC协议 默认监听的端口是111 端口;
整个流程为: 服务端的NFS服务监听一个端口通过RPC协议监听的端口,再去告诉客户端RPC协议,然后NFS客户端通过本机的RPC端口回传数据信息到服务端NFS监听的端口,最终实现通信.
准备两台虚拟机,一台作为服务端,一台作为客户端。
服务端IP:192.168.159.131
安装NFS工具:
[root@localhost ~]# yum install -y nfs-utils rpcbind
配置
编辑/etc/exports 文件,加入下面内容:
[root@localhost ~]# vim /etc/exports
/home/nfstestdir 192.168.159.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
// /home/nfstestdir 要分享出去的目录是哪一个,这个目录是不存在的,后期还需要创建。
// ip段 为指定要给哪个ip段机器去分享这个目录,也可以写单个ip。
启动NFS服务
在yum安装完成后,系统会自动启动rpcbind服务(在服务端进程名为systemd),默认监听的端口为111端口
[root@localhost ~]# ps aux | grep rpc
rpc 2390 0.0 0.0 64964 1044 ? Ss 21:19 0:00 /sbin/rpcbind -w
root 3826 0.0 0.0 112680 972 pts/0 R+ 21:31 0:00 grep --color=auto rpcbind
[root@localhost ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 1/systemd
......
tcp6 0 0 :::111 ::: LISTEN 1/systemd
......
启动NFS服务:
[root@localhost ~]# systemctl start nfs
//启动NFS 服务是会自动帮你启动rpc相关的服务
将NFS服务加入开机启动项:
[root@localhost ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
IP : 192.168.159.132
安装NFS工具
[root@localhost ~]# yum install -y nfs-utils
客户端挂载
检查客户端是否有权限访问服务端文件:
[root@localhost ~]# showmount -e 192.168.159.131 //131为服务端ip
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
// 报错!说明网络不通,不能和192.168.159.131 的113端口通信。
解决办法:
1、检查服务端NFS服务是否开启(有没有监听111端口)
2、如果确认服务端NFS服务已经开启,那么检查防火墙状态,关闭服务端和客户端firewalld和SELinux防火墙(systemctl stop firewalld)
关闭防火墙后再次检查客户端是否有权限访问服务端文件:
[root@localhost ~]# showmount -e 192.168.159.131
Export list for 192.168.159.131:
/home/nfstestdir 192.168.159.0/24
// 客户端已有权限访问服务端
开始挂载:
[root@localhost ~]# mount -t nfs 192.168.159.131:/home/nfstestdir /mnt/
// -t 指定文件系统类型
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
......
192.168.159.131:/home/nfstestdir 16G 5.2G 11G 33% /mnt
测试
在客户端/mnt目录下创建test文件
[root@localhost ~]# touch /mnt/test
[root@localhost ~]# ls -l /mnt/
总用量 0
-rw-r--r--. 1 mysql mysql 0 1月 16 22:05 test
查看服务端/home/nfstestdir/目录:
[root@localhost ~]# ls -l /home/nfstestdir/
总用量 0
-rw-r--r--. 1 mysql mysql 0 1月 16 22:05 test
// 存在个客户端上一样的文件,实现了同步共享。
其中,文件的用户和用户组都为mysql,是因为之前nfs服务端配置时,指定了anonuid=1000,anongid=1000。
服务端:
[root@localhost ~]# awk -F ‘:‘ ‘$3==1000 {print $0}‘ /etc/passwd
mysql:x:1000:1000::/home/mysql:/bin/bash
客户端:
[root@localhost ~]# awk -F ‘:‘ ‘$3==1000 {print $0}‘ /etc/passwd
mysql:x:1000:1000::/home/mysql:/bin/bash
// 由于两边uid都为1000,所以都为mysql用户。所以文件的所属组和所属主是由服务端配置文件中定义的anonuid,anongid决定的。(假设两个服务器上uid1000不是同一个用户,则同步文件在两个服务器上的属主和属组是不一样的。)
原文:http://blog.51cto.com/754599082/2061798