What is NFS

NFS是Network FileSystem的缩写,即网络文件系统,它可以实现挂载远程电脑上的设备到本地从而像访问本地磁盘一样操作,有点类似于windows 的网上邻居。是SUN公司1984年开发的,v1版本只在SUN公司内部使用过,v2, v3, v4是公开版本,一般红帽5默认是v3版本,红帽6默认目前最新的v4版本。


How it works

我们知道一个程序是不可以直接操作硬件资源的,当一个程序需要读写硬盘数据时,需要把请求提交给内核Kernel, 然后由kernel再相关的结果返回给进程,这个过程我们称为本地过程调用Local Procedure Call. 如果当应用程序的进程要调用的库不在本地而是在远程主机上,这时我们就需要一种可以提供我们远程调用的技术,也就是我们经常会提到的RPC--Remote Procedure Call,那么RPC我们天天说,到底什么是RPC呢,简单的说RPC是为了简化公布式程序开发而开发出的一种编程技术,是一种技术框架,有了RPC开发人员就不用考虑本地如何去调用远程主机的库等资源,是透明的就像调用本地的一样,一切RPC就给办的妥妥的了。而著名的portmap就是RPC在Linux上的一种具体实现,工作在TCP和UDP的111号端口。

回到NFS上来简单说一下,NFS客户端要请求NFS服务器时,首先会先把请求发给本地的RPC stub存根调用,可以理解成RPC客户端然后通过RPC客户端与RPC服务端联系,RPC服务端通过分析知道请求的NFS资源,然后申请相应的空闲端口给NFS进程并通知给RPC客户端,这样NFS客户端就可以通过得到的端口号和服务器通信啦。


安装和配置

1、安装

使用rpm –qa | grep nfs-utils 查看软件包是否已安装

如果未安装 yum install –y nsf-utils 安装即可

简单说几个安装生成比较重要的文件或程序

/etc/rc.d/init.d/nfs
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/rpcgssd
/etc/rc.d/init.d/rpcidmapd
/etc/rc.d/init.d/rpcsvcgssd //以上几个是生成的脚本
/etc/sysconfig/nfs //nfs的配置文件
/sbin/rpc.lockd //管理文件锁,防止同一文件多人同时读写造成文件损坏
/usr/sbin/exportfs //这个命令很重要,修改了exports文件后不需要重启nfs服务就可以刷新服务资源靠的就是他
/usr/sbin/mountstats //可以按挂载点查看客户端各种状态信息,很详细
/usr/sbin/nfsiostat //按挂载点查看客户端IO详细状态信息
/usr/sbin/nfsstat //可以查看服务端或客户端各种NFS状态信息
/usr/sbin/showmount //查看NFS服务器和挂载上的客户端各种信息

2、配置使用

I) /etc/exports 这个文件控制NFS服务器共享出去的资源以及访问权限等

在NFS服务器上编辑此文件加上一行

/nfs(服务器上要共享出去的目录) 192.168.0.0/24(rw,sync) 可以是单一的IP地址,也可以指定网段, rw-可读写,sync-同步写入, ro-只读, rsync-异步写入

mkdir /nfs 创建共享的目录

II) 保存退出启动nfs服务 service nfs start

启动后可以用以下命令查看已经成功共享

[root@ha1 hbase]# showmount -e localhost
Export list for localhost:
/nfs 192.168.188.0/24

III) 客户端挂载设备

mkdir /mnt/nfs 创建挂载点

mount –t nfs 192.168.188.128:/nfs /mnt/nfs

然后就可以切到/mnt/nfs目录下像操作本地磁盘一样了

此时在服务器上可以用showmount –a localhost查看都有哪些客户端挂载上来了

Linux NFS服务器详解_Linux NFS 共享 网络文件系统

3、一些小缺陷和高级应用

nfs一个比较薄弱的环节在于对用户的身份认证,因为他是通过连接上来的用户的UID来识别用户的,所以只要你的UID和服务器上的某个存在的用户UID相同,你就可以拥有和此用户相同的权限,千说万说不如一看,上图:

在服务器上建立uid为8888的用户hadoop,在/nfs目录创建hadoop目录并改属主属组为hadoop

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_02

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_03

在客户端创建一个用户openstack其uid也为8888,切换到已挂载的/mnt/nfs目录下,可以看到hadoop这个目录的属主属组已经变成openstack了,

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_04

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_05

再来测试一下权限:服务端用hadoop创建文件,客户端修改,删除完全无压力,呵呵是不是挺危险的呢。

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_06


Linux NFS服务器详解_Linux NFS 共享 网络文件系统_07

没问题,nfs开发大神当时也意识到了这个缺陷,所以还是一点小小的补救措施的。

在/etc/exports 权限控制可以可以有如下选项控制

root_squash 此项是默认就启用的,有的朋友可能已经发现了,当你在客户机上用root操作的时候,是没有其他任何权限的,因为对于uid=0的root账户已经被映射为其他用户了,当然要映射为哪个用户也是可以自己去定义的。

no_root_squash 顾名思义,这个选项就是不启用root的账号的映射,这样是不是很爽啊,你本地的用户可以作远程机器的root账号来用,可以为所欲为,当然这样是不安全的。这个功能在无盘系统中会比较有用,其他情况就切记一定不要开啦。

all_squash 这个就更见名知义啦,所有nfs客户端连接上来的用户都全部映射为一个用户

anonuid, anongid 这两项接在root_squash或all_squash后面定义要映射到哪个用户

少废话,没图说个jj


look… root只是个摆设,傀儡是也,木有实权。。。

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_08


废话不说,加上no_root_squash

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_09

忘了说这个非常重要的命令exportfs了,常用主要两个参数 –ra 和 –ru r就是reexport重新输出,a就是all所有, u就是unexport,这样不用重启nfs服务就可以使export配置立刻生效,以防影响正在使用中的用户,其他选项man exports吧,学习linux会看man文档也是一个灰赏重要的技能撒。

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_10

Look again… root不再是傀儡鸟。。。

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_11

on more… 把所有客户都squash到hadoop上Linux NFS服务器详解_Linux NFS 共享 网络文件系统_12

为了使效果明显一些,我新建一个用户bob,进hadoop目录哈哈一样畅通无阻,为所欲为,也尝尝做一回土豪的赶脚。。

Linux NFS服务器详解_Linux NFS 共享 网络文件系统_13

好吧NFS配置是个比较简单的活,暂且就说这么多了,简单归简单,系统管理可是个细活,一定要小心谨慎之。其他的更多功能小伙伴们根据需求自己搭配吧,菜鸟在此献丑了,有不对的地方亲一定要给指出来啊,我们共同进步。你可以打我骂我拿砖拍我。。。千万不要不理我,,,土豪。。。