NFS
1 什么是NFS
- NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。
- NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。
- NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。
- 目前nfs服务,较为流行的两个nfs的组件为:nfsd,nfs-ganesha。前者linux为系统自带的内核态的文件系统,后者是开源的用户空间的文件
系统。因为nfs-ganesha运行在用户态,nfsd运行在内核态,所以nfs-ganesha具有内存分配灵活,可移植性更好,更方便扩展等优势。缺点是nfs-ganesha目前的稳定性还不如nfsd
3 NFS的工作原理
NFS本身的服务并没有提供数据传递的协议,而是通过使用RPC(远程过程调用 Remote Procedure Call)来实现。当NFS启动后,会随机的使用一些端口,NFS就会向RPC去注册这些端口。RPC就会记录下这些端口,RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前,首先要确保rpc服务启动。
11111.jpg 222.jpg- 首先服务器端启动RPC服务,并开启111端口
- 启动NFS服务,NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp,还会启动其它进程(如mountd,statd,rquotad等)以完成文件共享,这些进程的端口是不固定的;是每次NFS服务启动时向RPC服务注册的,RPC服务会随机分配未使用的端口
- 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
- 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
- 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
- `RPC,Remote Procedure Call Protocol :,远程过程调用协议,是实现本地调用远程主机实现系统调用的协议。
- portmapper :负责分配RPC服务器的端口,并在客户端请求时,负责响应目的RPC服务器端口返回给客户端,工作在tcp与udp的111端口上。
-
mountd
:是nfs服务的认证服务的守护进程,客户端在收到返回的真正端口时,就会去连接mountd,认证取得令牌。 -
nfsd
:nfs的守护进程,负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户 - idmapd :是NFS的一个程序,用来负责远程客户端创建文件后的权限问题。
3 NFS存储服务作用
- 实现数据的共享存储
- 编写数据操作管理
- 节省购买服务器磁盘开销
- 控制统一存储,比如集群,这样当我们的访问集群提供的服务,我们拿到的数据怎么都是一致的!
4 NFS服务部署流程
4.1 服务器端部署
4.1.1 安装rpc 和 rpc
rpm -qa|grep -E "nfs|rpc"
yum install -y nfs-utils rpcbind
4.1.2 编写nfs服务配置文件
- /etc/exports 主配置文件
- /usr/sbin/exportfs 维护NFS共享资源的指令,一般用于NFS服务器端
- /var/lib/nfs/xtab NFS的日志文件,主要记录曾经连入NFS服务器端的客户端信息
exports文件格式
共享目录 [客户端1(选项1,选项2…)] [客户端2(选项1,选项2…)]…
- 共享目录:即提供了NFS客户端使用的目录
- 客户端:可以访问共享目录的计算机,可以通过IP地址和主机名进行指定,也可以使用子网掩码指定网段
- 选项:指定该共享目录的访问权限
选项 | 解释 |
---|---|
ro | 该主机对该共享目录有只读权限 |
rw | 该主机对该共享目录有读写权限,要注意是针对nfs之外还有目录自己权限 |
root_squash | 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户 |
no_root_squash | 客户机用root访问该共享文件夹时,不压制root用户身份 |
all_squash | 客户机上的任何用户访问该共享目录时都映射成匿名用户 |
no_all_squaash | 客户机上的普通用户不进行身份进行转换 |
anonuid | 将客户机上的用户映射成指定的本地用户ID的用户 |
anongid | 将客户机上的用户映射成属于指定的本地用户组ID |
sync | 资料同步写入到内存与硬盘中 |
async | 资料会先暂存于内存中,而非直接写入硬盘 |
insecure | 允许从这台机器过来的非授权访问 |
exports 多种配置形式
1.常用配置
#默认客户端 如果是root身份 默认使用root_squash 将root用户映射成了匿名用户
#默认客户端 如果是其他用户身份 默认使用了no_all_squash 没有将普通用户映射
/data 172.17.1.101/24(rw,sync)
#ro 对nfs共享目录有读写权限
/data 172.17.1.101/24(ro,sync)
#修改默认的匿名用户(不常用)
/data 172.17.1.101/24(ro,sync,anonuid=xxx,anongid=xxx)
2.all_squash
#客户机上的任何用户访问该共享目录时都映射成匿名用户(包括root)
/data 172.17.1.101/24(rw,sync,all_squash)
3,no_all_squash
#客户机上的普通用户不进行身份进行转换(对root没作用 root默认已经进行了转换)
/data 172.17.1.101/24(rw,sync,no_all_squash)
#普通用户不进行身份转换 操作nfs共享目录是以nfs共享目录的其他用户操作的
#将nfs共享目录添加w权限 普通用户就可以操作nfs共享目录了
chown o+w /data
#还有一种情况就是NFS服务器中创建一个与客户机访问用户id和名字一样的用户
#一般应用于网站(www用户)
/data 172.17.1.101/24(rw,sync,no_all_squash)
4.root_squash
#h客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户(默认)
/data 172.17.1.101/24(rw,sync,root_squash)
5.no_root_squash
#客户机用root访问该共享文件夹时,不转换root用户身份
#相当于是直接使用了root身份操作共享目录 存在很大的安全隐患,一般不使用
/data 172.17.1.101/24(rw,sync,no_root_squash)
4.1.3 创建共享目录
mkdir /data
chmod nfsnobody:nfsnobody /data
4.2 客户端部署
#安装nfs软件为 客户端提供一个nfs的文件系统
yum install -y nfs-utils
#远程挂载共享目录
mount -t nfs 172.16.1.105:/data /mnt
4.3 exportfs 命令
exportfs主要用于管理当前NFS服务器的文件系统
exportfs 语法
SYNOPSIS
/usr/sbin/exportfs [-avi] [-o options,..] [client:/path ..]
/usr/sbin/exportfs -r [-v]
/usr/sbin/exportfs [-av] -u [client:/path ..]
/usr/sbin/exportfs [-v]
/usr/sbin/exportfs -f
/usr/sbin/exportfs -s
选项 | 说明 |
---|---|
-a | 共享nfs配置文件中所有的共享目录 |
-i | 忽略/etc/exports配置文件,只使用exportfs指令的默认值和命令行指定的参数 |
-r | 重新共享所有的nfs文件系统 |
-u | 取消一个或者多个NFS共享文件系统的共享 |
-v | 显示详细执行信息 |
exportsfs 命令的常用用法
#取消一个个NFS共享文件系统的共享
exportfs -u 172.17.1.101:/media/test
#修改了exports文件 不需要重启NFS服务 让配置文件生效
exportfs -rv
网友评论