目录
一、NFS服务介绍
NFS(Network File System)翻译过来就是网络文件系统。
- 主要用于linux系统上实现文件共享的一种协议,其客户端主要是Linux。
- 没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只在局域网中使用(让不同的主机系统之间可以共享文件或目录)。
- 支持多节点同时挂载及并发写入。
企业应用:为集群中的web server提供后端存储。
Tip: nfs服务和samba服务类似只不过一般情况下,Windows网络共享服务或samba服务用于办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,如果是大型网站,那么有可能还会用到更复杂的 分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS 。
该服务包括的组件:
RPC(Remote Procedure Call Protocol): 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一 些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输之用 。NFS服务所使用的端口号在每次启动的时候是不同的,通过RPC(远程过程调用 Remote Procedure Call简称RPC)协议/服务来实现,这个RPC服务的应用在门户级的网站有很多。例如:百度。
由于端口不固定,这就会造成访问的困难。所以rpc此时就起到了作用。RPC扮演了"电话接线员"的角色——当客户端需要访问NFS服务时,RPC负责在服务端找到对应的程序端口号。特别有趣的是那个"手掌叠放"的比喻,形象说明了启动顺序的重要性:必须先启动RPC服务(rpcbind),然后才能启动NFS服务,就像必须先铺好右手再叠左手。用户可能更关心实际工作流程而非理论。可以拆解成三个典型步骤:客户端发起NFS请求时,RPC客户端组件会联系服务端的RPC守护进程;RPC服务端查表返回具体端口;随后客户端直接与NFS服务通信。
- rpcbind :负责NFS的数据传输,远程过程调用 tcp/udp协议 端口111。
- nfs-utils :控制共享哪些文件,权限管理。
二、NFS服务相关软件包
nfs-utils-1.2.3-26.el6.x86_64 nfs服务的一个脚本控制工具(服务端与客户端)
nfs4-acl-tools-0.3.3-6.el6.x86_64 acl 工具包
nfs-utils-lib-1.1.5-4.el6.x86_64 nfs 库文件
三、配置文件解读
#配置文件的位置/etc/exports
man 5 exports
共享目录 共享选项
/nfs/share *(ro,sync)
共享主机:
- * :代表所有主机
- 192.168.0.0/24:代表共享给某个网段
- 192.168.0.0/24(rw) 192.168.1.0/24(ro) :代表共享给不同网段
- 192.168.0.254:共享给某个IP
- *.itcast.com:代表共享给某个域下的所有主机
共享选项:
- ro:只读。
- rw:读写。
- sync:实时同步,直接写入磁盘。
- async:异步,先缓存在内存再同步磁盘。
- anonuid:设置访问nfs服务的用户的uid,uid需要在/etc/passwd中存在。
- anongid:设置访问nfs服务的用户的gid。
- root_squash :默认选项 root用户创建的文件的属主和属组都变成nfsnobody,其他人nfs-server端是它自己,client端是nobody。
- no_root_squash:root用户创建的文件属主和属组还是root,其他人server端是它自己uid,client端是nobody。no_root_squash NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录 来说,也拥有root权限。尽量不要使用,会有误删、乱删等系列的风险。
- no_all_squash :不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都不会 拥有匿名用户权限。
- all_squash: 不管是root还是其他普通用户创建的文件的属主和属组都是nfsnobody。
说明:
- anonuid和anongid参数和all_squash一起使用。
- all_squash表示不管是root还是其他普通用户从客户端所创建的文件在服务器端的拥有者和所属组都是nfsnobody;服务端为了对文件做相应管理,可以设置anonuid和anongid进而指定文件的拥有者和所属组
四、NFS服务搭建
注:在防火墙中添加规则或者关闭防火墙进行测试验证!!!
1、相关软件的安装
# yum install nfs-utils -y
######安装之后进行查询,确保安装成功#####
# rpm -q rpcbind
# rpm -aq|grep ^nfs
nfsv3中必须单独安装rpcbind,虽然上面我没有显示安装 rpcbind,但是nfsv4中在nfs-utils的安装包中已经声明了对rpcbind的依赖,所以还是会间接性的依赖。
2、服务端创建一个共享目录,如/share_nfs
# mkdir /share_nfs
3、编写NFS主配置文件
# vim /etc/exports
共享目录 共享选项
/share_nfs 10.1.1.0/24(rw,sync,no_root_squash)
4、服务端启动相关的NFS服务
# systemctl start rpcbind #目前这一步可有可无,nfsv4中直接启动nfs会自动调用并启动rpcbind
# systemctl start nfs
# ss -naltp |grep 111 111端口
5、在客户端挂载NFS
# mount -t nfs 10.1.1.12:/share_nfs /media
或
# mount.nfs 10.1.1.12:/share_nfs /media
###使用df -h 可以查看是否挂载成功###
#df -h
注:如果客户端没有安装nfs工具可能导致挂载失败(nfs-utilsnfs---服务的一个脚本控制工具【服务端与客户端】、 nfs-utils-lib【acl 工具包】 、nfs4-acl-tools【nfs 库文件】)。
6、在/share创建或删除文件进行验证
# ll /media
total 0
drwxr-xr-x. 2 root root 6 Jun 4 13:08 test
# rm -rf test
# ll
total 0
五、拓展——对NFS服务器进行实时备份
NFS备份服务器:/share_nfs目录有变化,马上rsync进行同步Backup备份服务器的/backup目录
第一步:在NFS服务器端上安装inotify工具
- 原码安装或者结合epel源使用yum 进行安装
第二步:编写rsync.sh脚本,监控/share_nfs目录的变化
# vim rsync.sh
#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /share_nfs |while read events
do
rsync -a --delete /share/ 10.1.1.13:/backup/
echo "`date +%F\ %T`出现事件$events" >> /var/log/rsync.log 2>&1
done
第三步:给rsync添加x权限
# chmod +x rsync.sh
第四步:把NFS服务器与Backup备份服务器进行免密登录
# ssh-keygen
# ssh-copy-id root@10.1.1.13
第五步:在Backup服务器中创建一个/backup目录,用于实时备份
# mkdir /backup
第六步:在NFS服务器中执行rsync脚本
# nohup ./rsync.sh &
本 篇 完 结 … …
持 续 更 新 中 … …