什么是NFS ?
代码语言:javascript复制存储空间共享服务
初级:单设备存储(分区、格式化、挂载、逻辑卷、磁盘阵列)
中级:网络文件系统:通过网络实现多设备共享存储{samba/cifs}
NFS(NetWork File Sysetem, 网络文件系统)它允许网络中的计算机之间通过TCP/IP网络共享资源的分布式存储系统,通常用来存储共享视频、图片等静态数据; NFS Server允许NFS Client将远端NFS Server的共享目录挂载到本地。在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
NFS端口管理
1. 当NFS Server与NFS Client,进行数据传输时,实际上是使用随机端口进行传输2049开始。
2. NFS服务器的端口需要通过RPC(remote procedure call 远程过程调用)协议(服务)进行管理。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口来进行数据的传输。
NFS与FTP的区别
nfs服务:侧重的是文件的共享(在客户端像操作本地文件一样操作服务端文件)
FTP服务:侧重的是文件的传输(上传下载)
NFS的优点
1. 节约使用的磁盘空间 :客户端经常使用的数据可以集中存放在一台机器上,并使用NFS发布,那么网络内部所有计算机可以通过网络访问,不必单独存储。
2. 节约硬件资源 :NFS还可以共享软驱, CDROM和ZIP等的存储设备, 减少整个网络上的可移动设备的数量。
3. 用户主目录设定 :对于特殊用户,如管理员等,为了管理的需要,可能会经常登录到网络中所有的计算机,若每个客户端,均保存这个用户的主目录很繁琐,而且不能保证数据的一致性。实际上,经过NFS服务的设定,然后在客户端指定这个用户的主目录位置 ,并自动挂载,就可以在任何计算机上使用用户主目录的文件。
nfs服务管理软件包
nfs-utils : 包括NFS命令与监控程序,用于管理nfs服务
nfs服务端口
生成随机端口,并向rpcbind服务进行注册,rpcbind服务(调用portmap过程)对随机端口进行端口映射,记录其端口信息,然后通过111端口接收Client的请求。将nfs端口信息发送给Client。
NFS面临的问题**
1. 存储空间不足,需要更大容量的存储。
2. 直接用NFS挂载存储,有一定风险,存在单点故障。
3. 某些场景不能满足要求, 大量的访问磁盘IO是瓶颈。
rpcbind服务
rpcbind服务的功能作用
rpcbind服务能够将RPC程序号码和通用地址相互转换。
rpcbind服务原理
1. 要让某主机能向进程主机的服务发动RPC远程过程调用, 则该主机上的rpcbind必须处于已运行状态。
2. 当客户端要向某个给定的程序号码发动RPC调用时,它首先会确定RPC 申请应该发送到哪个地址上。
3. 当服务端收到RPC申请后,返回申请服务的地址(端口映射)。
rpcbind服务相关信息
软件包: rpcbind
启动命令: systemctl start rpcbind
服务端口: TCP111 和UDP111
NFS挂载原理
RPC和NFS如何通信
总结:客户端NFS和服务端NFS通讯过程
1)首先服务器端启动RPC服务,并开启111端口
2)启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
NFS相关协议及软件安装管理
协议:
RPC(Remote Procedure Call Protocol)——远程过程调用协议
软件:
nfs-utils-* :包括NFS命令与监控程序
rpcbind-* :支持安全NFS RPC服务的连接
注:通常情况下,是作为系统的默认包安装的
CentOS 6.*之前rpcbind叫portmap
NFS系统守护进程
nfs:它是基本的NFS守护进程
主要功能是管理客户端是否能够登录服务器
rpcbind:主要功能是进行端口映射工作。
当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,rpcbind会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
NFS服务器的配置
NFS服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。
NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。
NFS的服务器端
配置文件/etc/exports文件内容格式:
共享目录 客户端IP或网段(权限,映射关系,同步方式) 客户端2(权限,映射关系,同步方式)
共享目录2 ........
共享目录:共享目录是指NFS服务器共享给客户机使用的目录
客户端:客户端是指网络中可以访问这个NFS共享目录的计算机
客户端常用的指定方式:
指定ip地址的主机:192.168.0.200
指定子网中的所有主机:192.168.88.0
指定域名的主机:www.kernel.com
指定域中的所有主机:*.kernel.com
所有主机:*
设置共享目录的访问权限。
访问权限选项:
设置输出目录只读:ro
设置输出目录读写:rw
同步方式:
sync :同步{服务器压力较大,增加了磁盘IO的压力,但数据安全性高}
async :异步{服务器压力较小,在磁盘IO压力较低的情况下进行数据同步,但数据安全性较差}
客户端创建文件时,所借用的服务器端身份【映射关系】
在不写任何映射关系时,客户端来到服务器借用服务器的nfsnobody用户身份进行文件管理
人为控制客户端借用的服务器身份,四种映射关系
root_squash #默认映射关系
no_root_squash
all_squash
all_squash,anonuid=NNN,anongid=NNN
客户端使用root身份时:
root_squash
#会借用服务器端的nfsnobody身份进行文件管理
no_root_squash
#客户端会保留客户端的创建身份,可能在服务器端会显示为某UID的归属
all_squash
#客户端不管任何用户,创建文件时,都借用服务器端的nfsnobody用户进行文件管理
all_squash,anonuid=NNN,anongid=NNN
#要求客户端不管使用什么用户,都必须借用服务器端的指定UID和GID作为文件管理身份
客户端使用非root身份时:
root_squash
#客户端会保留客户端的创建身份,可能在服务器端会显示为某UID的归属
no_root_squash
#客户端会保留客户端的创建身份,可能在服务器端会显示为某UID的归属
all_squash
#客户端不管任何用户,创建文件时,都借用服务器端的nfsnobody用户进行文件管理
all_squash,anonuid=NNN,anongid=NNN
#要求客户端不管使用什么用户,都必须借用服务器端的指定UID和GID作为文件管理身份
NFS服务器的启动与停止
1、启动NFS服务器
为了使NFS服务器能正常工作,需要启动rpcbind和nfs两个服务,并且rpcbind一定要先于nfs启动。
# service rpcbind start
# service nfs start
2、查询NFS服务器状态
# service rpcbind status
# service nfs status
3、停止NFS服务器
要停止NFS运行时,需要先停止nfs服务再停止rpcbind服务,对于系统中有其他服务(如NIS)需要使用时,不需要停止rpcbind服务
# service nfs stop
# service rpcbind stop
4、设置NFS服务器的自动启动状态
设置rpcbind和nfs服务在系统运行级别2345自动启动。
# chkconfig --level 2345 rpcbind on
# chkconfig --level 2345 nfs on
5、查看RPC服务器开启了哪些端口
rpcinfo –p localhost
实验相关实例
将NFS服务器的/home/zhangsan共享给192.168.115.0网段,rw权限
# vim /etc/exports
/home/zhangsan 192.168.115.0(rw)
重启rpcbind 和nfs 服务
# service rpcbind restart
# service nfs restart
# exportfs
服务器端查看nfs共享状态
# showmount -e 本机ip
查看自己共享的服务
客户端查看nfs共享状态
# showmount -e NFS服务器IP
客户端挂载nfs服务器共享目录
命令格式:mount NFS服务器IP:共享目录 本地挂载点目录
# mount 192.168.115.10:/home/zhangsan/ /media/zhangsan/
# mount | grep nfs
mount -o vers=3 共享 本地 #指定挂载使用nfs V3版本(避免同步延迟)
验证客户端和nfs服务器端文件是否一致:
修改服务器端相应权限,不然客户端无法正常访问和使用
卸载和自动挂载
卸载:
卸载客户端的挂载目录
umount 挂载点
停止服务器端的共享
exportfs –au
自动挂载:/etc/fstab
格式:<server>:</remote/export> </local/directory> nfs < options> 0 0
#192.168.115.10:/home/zhangsan /media/zhangsan nfs defaults 0 0
#mount –a
相关命令
exportfs命令
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:
格式:exportfs [-aruv]
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 在export的时候,将详细的信息输出到屏幕上。
具体例子:
# exportfs -au 卸载所有共享目录
# exportfs -ra 重新共享所有目录并输出详细信息
rpcinfo命令
利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些
其中nfs 开启的是2049,portmapper(rpcbind) 开启的是111,其余则是rpc开启的
NFS v3 v4 区别
问题现象:
NFS客户端在使用v4版本挂载NFS服务器共享目录时,所创建的文件属于nobody用户
问题原因:
NFS 在 v4 版本中修改了用户映射关系模式,通过调用NIS服务来完成用户映射,但NIS服务在未配置的情况下无法提供正常映射关系,所以出现了上述错误。
#拓展:NIS(Network Information Service)网络信息服务
#相关配置文件:/etc/idmapd.conf
问题解决方案:
服务器端:
1. 创建并编写配置文件
/etc/modprobe.d/nfs.conf
options nfs nfs4_disable_idmapping=1
#关闭掉RPC服务对rpc.idmapd模块的调用
2. 正常编辑NFS配置文件并重启
/etc/exports
service nfs restart
3. 手动关闭rpcidmapd服务
service rpcidmapd stop
客户端:
正常挂载即可