什么是NFS
NFS, 网络文件系统,英文Network File System,是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
NFS可以让服务端跟客户端通过网络共享主机磁盘上的一些数据,主要是在unix和linux系统上实现的一种文件共享方式。
我们可以简单的将NFS看做是一个文件服务器 (file server) 。这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区一样 (partition)。
NFS工作在OSI的会话层,端口号为111
开始部署
这里我用两台linux虚拟机做实验,一台为ubuntu(ip: 192.168.35.128),另一台为centos(ip:192.168.35.135)。用finalshell连接后开始进行部署。
服务端部署(centos)
- 首先要安装
nfs-utils
yum -y install nfs-utils
rpcbind作为依赖包在此过程中也会被安装,因此无需再单独安装rpcbind。
- 启动nfs,并将其设置为开机启动(作为服务器,应保证服务在每次重启之后都能迅速提供服务)
systemctl start nfs
systemctl enable nfs
这里不需要先启动rpc服务,使用ps -ef|grep rpcbind
发现启动nfs之后rpcbind已经启动了。
- 设置共享目录,并修改其权限
mkdir /data
chmod 755 /data
- 修改服务端配置文件(安装完nfs-utils后,会自动生成 /etc/exports这个文件,这是nfs主要的配置文件)
vi /etc/exports
按i
插入如下内容:
/data/ 192.168.35.0/24(rw,sync,no_root_sqush,no_all_squash)
配置相应主机对于这个共享文件夹所拥有的权限等内容,
/etc/exports具体文件内容格式如下
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
a. 输出目录:
输出目录是指NFS系统中需要共享给客户机使用的目录;
b. 客户端:
客户端是指网络中可以访问这个NFS输出目录的计算机
客户端常用的指定方式
- 指定ip地址的主机:192.168.0.200
- 指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
- 指定域名的主机:david.bsmart.cn
- 指定域中的所有主机:*.bsmart.cn
- 所有主机:*
c. 选项:
选项用来设置输出目录的访问权限、用户映射等。
NFS主要有3类选项:
访问权限选项
- 设置输出目录只读:ro
- 设置输出目录读写:rw
用户映射选项
- all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
- no_all_squash:与all_squash取反(默认设置);
- root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
- no_root_squash:与rootsquash取反;
- anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
- anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项
- secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
- insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
- sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
- async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
- wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
- no_wdelay:若有写操作则立即执行,应与sync配合使用;
- subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
- no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
配置好后还需要重启nfs服务
systemctl restart nfs
- 查看挂载
showmount -e localhost
发现共享文件挂载成功
最后需要关闭防火墙
systemctl stop firewalld
setenforce 0
如果不关闭防火墙,客户端无法看到服务端的共享文件夹
客户端部署(ubuntu)
ubuntu上部署与在centos上部署不太一样
首先安装nfs-common包
apt-get install nfs-common
同样的,也会自动安装rpcbind包
需要启动rpcbind
systemctl start rpcbind
查看远端服务器的共享目录
showmount -e 192.168.35.135
客户端创建挂载目录
mkdir /data
挂载共享目录
mount -t nfs 192.168.35.135:/data /data
使用df查看磁盘情况可以看到挂载成功
总结
当然NFS适用于不同系统、不同类型主机之间进行文件共享,不止局限于ubuntu,centos,甚至windows平台也可以配置NFS。
在配置过程中经常出现如下错误
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
说明服务端防火墙没有关闭,没有关闭的话客户端是无法通过网络连接到服务器那端的。服务端部署的最后一步一定要执行。
可能有人会问,为什么NFS部署的过程中为什么会涉及到rpcbind包?
因为nfs协议本身是没有网络传输功能的,而是基于远程的调度,需要使用rpc提供一个面向远程服务的一个端口,这样就可以通过网络从远程主机进行一些请求
参考文章:
https://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html