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


知识储备


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

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

3.NFS本质是通过RPC调用实现的

4.对于Linux而言,文件系统是在内核空间实现的,即文件系统比如ext3、ext4等是在Kernel启动时,以内核模块的身份加载运行的,当然了具体文件系统选择可以在编译和裁剪内核时修改。


什么是RPC?


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


RPC工作流程:

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

  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(选项)  ...

客户端:

只允许某个IP10.134.140.64
只允许某个网段10.134.140.64/24,10.134.140.64/255.255.255.0
只允许某个FQDNwww.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=numNFS 故障恢复的情况中使用。如希望实现 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服务的情况下重新导入导出共享目录]