NFS基本原理及实现

本文旨在复习NFS基本原理及其实现
html


知识储备centos


1.NFS是将网络上某台主机的共享目录映射到本地,直接对其进行操做,NFS也是NAS的一种解决方案安全

2.该共享目录必须是已建立文件系统的,而无需格式化、建立文件系统等,这便是SAN和NAS的区别bash

3.NFS本质是经过RPC调用实现的服务器

4.对于Linux而言,文件系统是在内核空间实现的,即文件系统好比ext三、ext4等是在Kernel启动时,之内核模块的身份加载运行的,固然了具体文件系统选择能够在编译和裁剪内核时修改。网络


什么是RPC?并发


RPC:Remote Procedure Call Protocol,程序可使用这个协议请求网络中另外一台计算机上某程序的服务而不需知道网络细节,甚至能够请求对方的系统调用。基于C/S模型的!异步


RPC工做流程:async

  Client端仅须要发起RPC Call,同时传递必要参数;ide

  Server端的守护进程一方面监听客户端的RPC Call,另外一方面引领这些RPC Call来调用本地的程序或者系统服务来执行,这些程序在执行时仍是用客户端传递来的参数。

wKioL1YxgrmBN4q_ABOGOKAqo84764.bmp

参考文章

    http://blog.csdn.net/mindfloating/article/details/39474123

    http://wiki.dzsc.com/info/8466.html


NFS实现原理


对于客户端而言,直接使用mount挂载远程的NFS,而后像操做本地目录同样操做便可;

对于服务器,实现NFS有几个关键组件:

NFS quotas

  用于实现磁盘配额的高级功能,当客户端挂载NFS后能够限制使用磁盘空间大小;    

NFS mountd

  NFS借助于RPC,仅支持基于IP的认证,由于这是一种远程过程的调用,而不是请求/响应服务,没有认证能力。那么如何实现认证呢?是经过辅助进程mountd来实现的,mountd负责发放令牌!多个mountd进程能够监听在不一样的端口号上,前提这些端口号都事先在RPC统一调度管理器rpcbind中注册过,从而实现多个用户并发访问;

  1.客户端想要挂载NFS时,去问Server端的rpcbind;

  2.rpcbind查询本身的注册表,选择一个已经注册的mountd进程和端口号;

  3.mountd完成对客户端的身份认证,发放令牌给客户端;

  4.客户端接着访问nfsd TCP/UDP 2049进行挂载后的正常操做

  因此,mountd进进程实际上是辅助进程,是为了加强nfsd完成用户身份认证的能力的!

NFS idmapd

  用户挂载了远端的NFS,那么建立的文件的属主属组是谁呢?若是客户端A用用户名test建立了文件,而NFS Server上又没有test用户,那该咋办?

 idmapd很好地解决了这个问题,是客户端和服务器端帐号映射关系的解决工具。


NFS配置文件


NFS Server配置文件/etc/exports,只须要遵循格式,附加参数便可!这个文件可能不存在,建立便可。格式为:

文件系统      客户端1(选项)    客户端2(选项)  ...

客户端:

只容许某个IP 10.134.140.64
只容许某个网段 10.134.140.64/24,10.134.140.64/255.255.255.0
只容许某个FQDN www.centos.org 前提能解析
只容许某个Domain *.centos.org 前提能解析


经常使用选项:

secure
缺省选项,使用1024如下的TCP端口实现 NFS 的链接。指定 insecure 可禁用;
async 异步,即全部数据变更不直接写到磁盘,先放内存,达到提交点再写入,可改善性能;
no_wdelay 关闭写延时;
nohide 若是将一个目录挂载到另一个目录上,原来目录一般就被隐藏。要禁用这种行为,需启用 hide 选项。
no_subtree_check 关闭子树检查,子树检查会执行一些不想忽略的安全性检查。缺省选项是启用子树检查。
no_auth_nlm 不对加锁请求进行认证。若是关心安全性,避免使用该选项。缺省选项是 auth_nlm 或 secure_locks。
mp 显式地声明这个选项,NFS 要求挂载所导出的目录
fsid=num NFS 故障恢复的状况中使用。如但愿实现 NFS 的故障恢复,请参考 NFS 文档。

用户映射选项:

root_squash 不容许 root 用户访问挂载上来的 NFS 卷
no_root_squash 容许 root 用户访问挂载上来的 NFS 卷
all_squash 限制全部的 UID 和 GID,只使用匿名用户。缺省设置是 no_all_squash。
anonuid、anongid 将匿名 UID 和 GID 修改为特定用户和组账号。

用户映射选项本质是经过idmapd这个辅助进程来实现的,还记得吗?


NFS实验


实验要求:

 1.NFS服务器共享目录/mageedu给10.134.140.63/24访问;

 2.以读写方式应用,要求异步;

 3.客户端上存在,而服务器端不存在的用户,所有映射为服务器端的nfsuser用户;

实验步骤1.编辑NFS配置文件

useradd nfsuser
mkdir /mageedu && touch hello.txt
vi /etc/exports
/mageedu 10.134.140.63/24(rw,async,root_squash,anonuid=501,anongid=501)

实验步骤2.客户端查看并挂载NFS

showmount -e 10.134.140.63
mount -t nfs 10.134.140.63:/mageedu /mnt

wKioL1Yxq2WQINyoAAT5yJfbFE8763.bmp


实验步骤3.验证root权限

wKioL1Yxq4Cw8LeYAAPiOBToZRc394.bmp

这是由于启用了root_squash后,root会被映射为NFS Server上的匿名用户来进行操做,而又附加了参数anonuid、anongid即指定了匿名用户的身份是UID=501 GID=501的nfsuser这个用户。

而该用户在/mageedu上是没有权限写入的,能够查看到!

wKiom1Yxrk7AwUAyAAD0dCeMnzU611.jpg


那么不妨在NFS Server上的/mageedu目录下建立一个让nfsuser用户可读可写的目录,再来测试!

mkdir /mageedu/read_write
setfacl -m u:nfsuser:rwx /mageedu/read_write

wKioL1Yxr1Kg6sDWAAVV2O4JXJc653.bmp

此时再去服务器上看权限呢?

wKioL1Yxr9mC6Tk2AACt7lTpDP0969.jpg

至此,已经搭建完毕!


补充说明


  1. 实现开机自动挂载能够编辑/etc/fstab,挂载选项建议加上 _netdev 这样标识该挂载目录为网络设备,若是找不到暂时不挂载,而不会阻塞下去;

  2. 挂载选项能够按照需求调节rsize和wsize,接收缓冲区、发送缓冲区大小,可改善性能;

  3. 客户端经常使用命令showmount、mount

  4. 服务器端经常使用命令rpcinfo、exports、exportfs[能够在不重启NFS服务的状况下从新导入导出共享目录]

相关文章
相关标签/搜索