前言、本章学习目标
- 了解nfs服务用途
- 掌握nfs服务器的配置
- 掌握nfs客户端的配置使用
一、NFS简介
NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NFS在文件传送或信息传送的过程中,依赖于RPC协议。RPC,远程过程调用(Remote Procedure Call),是使客户端能够执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,就是因为NFS使用了RPC提供的传输协议,可以说NFS就是使用PRC的一个程序。
NFS 存储 服务器主要用于用户上传的数据 ,图片 音频 、等信息。
二、NFS工作原理
NFS服务依赖于RPC(Remote Procedure Call)服务。nfsd默认端口2049,实际使用过程中因为需要提供不同的服务,因此NFS启动时还会随机调用系统的空闲端口。在centos5.x中默认调用1024以下端口,centos6.x后默认调用的端口号一般较大,30000以上。因为NFS随机端口的原因所以需要RPC服务来和client端确认传输端口等。
使用场景:web集群中NFS服务器主要用于存储用户上传的信息,方便集群中机器获取用户数据。如图片 附件 头像 视频 音频。
缺点:
1:nfs属于本地文件系统,在高并发场景和大存储量下,需要使用分布式存储ceph, FastDFS, tfs(taobao)等。
2:客户端的数据都是通过明文传送。客户端没有用户认证机制,安全性能一般,所以建议一般在局域网内使用。
3:容易发生单点故障,即server服务器宕机所有的客户端都不能访问。
客户端连接nfs流程
当服务器在启动NFS时会随机选用数个端口,并主动地向RPC注册。因此RPC可以知道每个端口对应的NFS功能。然后RPC固定使用端口111来监听客户端的请求并回报客户端正确的端口,所以可以让NFS的启动更为容易。注意,启动NFS之前,要先启动RPC;否则NFS会无法向RPC注册。另外,重新启动RPC时原本注册的数据会不见,因此RPC重新启动后它管理的所有程序都需要重新启动以重新向RPC注册。
当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?
(1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求。
(2)服务器端找到对应的已注册的NFS daemon端口后会回报给客户端。
(3)客户端了解正确的端口后,就可以直接与NFS守护进程来联机。
三、NFS服务侧写
·类型:系统V (System V) 管理的服务
·软件包:nfs-utils
·守护进程: rpc.nfsd (主进程),rpc.lockd (锁定文件,防止多个客户端同时写入文件造成问题,非必要进程)rpiod,rpc.mountd (使用权限),rpcurquot;rpc.statd(文件一致性检查,非必要进程)
·脚本: /etc/init.d/nfs, /etc/init.d/nfslock
·端口:2049(nfsd),其它端口由portmap(111)分配
·配置文件: /etc/exports
·相关软件包portmap (必须)、tcp_wrappers
·红帽6中portmap进程由rpcbind代替
四、NFS服务器
在/etc/exports文件中定义导出目录
·每个条目都指定文件系统被导出到的主机,以及相关的权限和选项
·应该指定的选项
·默认选项:(ro,sync,root_squash)
sync所有数据在请求时写入共享
all_squash 不论NFS使用户者的身份如何,使用者身份都变成nfsnobody
no_all squash 保留共享文件的UID和GID(默认)
no_root_squash告知NFS允许客户端系统上的root用户在共享中也具有root权限
root_squash root用户的所有请求映射成如nobody用户一样的权限(默认)
备注:默认情况下,NFS服务器将NFS客户端上的root视作用户nfsnobody,即如果root尝试诚挂载的导出中的文件,服务器会将其视作用户nfsnobody访问。
五、NFS服务器配置文件介绍
格式:共享目录 指定共享对象(共享参数)
示例: /data 192.168.1.0/24(rw,sync)
将 /data 共享给192.168.1.x ,客户端权限rw
其中共享对象可以用通配符,比如 * 代表所有地址。
配置参数:
rw: 读写
ro :只读
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:是大数据时使用,是先写到缓存区,必要时再写到磁盘里。
all_squash:所有访问用户都映射为匿名用户或用户组;
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
root_squash(默认):将来访的root用户映射为匿名用户或用户组;
no_root_squash:来访的root用户保持root帐号权限;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree_check :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
no_subtree_check(默认):即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
NFS工具:
#exportfs -r//保存所有更改
或者: #service nfs reload
#exportfs-v //显示所有导出
showmount -e hostname
应用实例:
root@desktop4 ~]# showmount -e 192.168.0.4
Export list for 192.168.0.4:var/nfs 192.168.0.0/24
六、搭建nfs服务器实践
1、服务端配置
# rpm -qa |grep nfs
# rpm -qa | grep rpcbind
# service nfs status
# service nfs start
# chkconfig nfs on
# service rpcbind status //rpcbind服务替代了rhels中的pormap
# mkdir /var/nfs
# touch /var/nfs/f1
# vim /etc/exports
/var/nfs 192.168.0.0/24(ro,sync)
# service nfs restart
# netstat -tunlplgrep 2049 //2049-nfsd使用的端口
# netstat -tunlp I grep rpcbind
[root@desktop4~]# showmount-e 192.168.0.4
Export list for 192.168.0.4:
/var/nfs 192.168.0.0/24
2、nfs网络访问控制
# vim /etc/exports
var/nfs 192.168.0.0/24(w,sync) 192.168.1.0/24(ro)
# exportfs -r、exportfs -v
192.168.0.0/24(rw,wdelay,root squash,no_subtree_check)var/nfs
192.168.1.0/24(ro,wdelay,root_squash,no_subtree_check)var/nfs
# vim /etc/exports
/var/nfs 192.168.0.0/24(rw,sync)
/var/nfs 192.168.0.1.0/24(ro)
# exportfs -r、exportfs -v
192.168.0.0/24(rwwdelay,root_squash,no_subtree_check)/var/nfs192168.0.1.0/24(ro,wdelayroot squash,no_subtree_check)/var/nfs
# vim /etc/exports
/var/nfs 192.168.0.0/24(rw,sync)
/var/nfs 192.168.0.1.0/24(ro)
/var/nfs*(ro)
3、nfs客户端挂载使用:
1)安装nfs,并启动服务。
yum install -y nfs-utils
systemctl enable rpcbind.service
systemctl start rpcbind.service
客户端不需要启动nfs服务,只需要启动rpcbind服务.
2)检查 NFS 服务器端是否有目录共享
showmount -e 192.168.227.3
3)使用 mount 挂载A服务器端的目录/opt/nfs到客户端B的目录/opt/nfs下
[root@localhost ~]# mkdir /opt/nfs
[root@localhost ~]# mount -t nfs 192.168.227.3:/opt/nfs/ /opt/nfs/
4)加到开机自挂载
添加到/etc/fstab中,或添加挂载脚本至rc.local下
七、本章实验
1、搭建nfs服务,并从客户端挂载测试。