RedHatLinux下配置NFS服务器
2013-09-10 22:48:10 阿炯

NFS与RPC简介

NFS,全称Network File System,即网络文件系统。最早由Sun公司开发,它的功能是在不同的机器、不同的操作系统之间实现文件的共享,NFS传输数据时使用的端口是一个随机端口。

RPC,远程过程调用。它的功能是指定每个NFS功能对应的端口号,当NFS服务器启动时会随机启用数个端口号,并主动向RPC注册,这样RPC就知道每个端口号对应的功能了,RPC使用111号端口来监听客户机的请求并回应正确的端口号。启动NFS之前要先启动RPC,否则NFS无法向RPC注册,当RPC重新启动后,原来注册的端口数据会丢失,此时它管理的所有程序都必须重新向RPC注册。

rpcbind工具可以将RPC程序号码和通用地址互相转换。要让某主机能向远程主机的服务发起RPC调用,则该主机上的rpcbind必须处于已运行状态。当RPC服务启动后,它会告诉rpcbind它监听在哪个地址上,还会告诉它为服务准备好提供的PRC程序号码。当客户端要向某个给定的程序号码发起RPC调用时,它首先会联系服务端的rpcbind以确定RPC请求应该发送到哪个地址上。

rpcbind工具应该在所有RPC管理的服务(rpc service)启动之前启动。一般来说,标准的rpc服务由端口监视器来启动,因此rpcbind必须在端口监视器被调用之前已经启动完成。当rpcbind工具已经启动后,它会检查特定的name-to-address的转换调用功能是否正确执行;如果失败,则网络配置数据库会被认为过期,由于RPC管理的服务在这种情况下无法正确运行,rpcbind会输出这些信息并终止。

rpcbind工具只能由super-user启动。


在Linux下当通过 mount 指令挂载了一个 NFS 目录时,在文件系统中会创建一个 vfsmount 和 superblock,用于记录 NFS 的挂载信息,然后将 vfsmount 对象加入到 VFS 的 mount 树和 Hash Table 中,这样就算是挂载好了。


然后当访问的时候,首先打开的是文件对象,然后再定位到 vfsmount,再接着就可以访问到 superblock 了,这样就可以通过 NFS 的模块和 Server 进行通信了(图片来自格物致知的博客):


NFS 通信原理


NFS 的进程简介

rpc.nfsd 进程
NFS 服务的主进程,主要管理客户端是否能够接入 NFS 服务器以及数据的传输。该进程固定监听 TCP/UDP 2049 端口。

rpc.mountd 进程
管理和维护 NFS 文件系统,根据所设定的权限决定是否允许客户端挂载指定的共享目录。该进程监听的端口默认是不固定的。

rpc.lockd 进程(可选)
提供文件锁功能,防止多个客户端同时写入一个文件。该进程监听的端口默认是不固定的。

rpc.statd 进程(可选)
负责检查数据的状态及一致性,需要与 rpc.lockd 配合使用。该进程监听的端口默认是不固定的。

portmap
因为 rpc.mountd / rpc.lockd 以及 rpc.statd 的端口是不固定的,所以,nfs client 要想和 server 绑定则必须知道这些端口是什么,因此处理的方式是通过 111 端口查询这些端口信息是什么,然后再发起连接。


可以在此推导出NFS客户端挂载过程

首先服务器端启动 RPC 服务,并开启 111 端口;
启动 NFS 服务,并向 RPC 注册端口信息;
客户端启动 RPC 客户端,向服务端的 portmap(111 端口) 服务请求服务端的 NFS 端口信息;
服务端的 portmap 服务反馈给 Server 的端口信息给客户端;
客户端通过获取的 NFS 端口和服务端的 NFS 连接并进行数据的传输。



NFS工作原理及简单配置

1)客户机发送RPC请求到远程NFS服务器中。

2)NFS服务器利用PORTMAP或者rpcbind服务查询NFS的工作端口(redhat5为portmat,6之后为rpcbind)。

3)客户机联系要装载的分区,同时服务器会验证客户机是否有权加载。

4)客户机更新MTAB文件,表示加载成功。

Redhat 6.2变更了portmap服务为rpcbind,在使用nfs时这点与redhat5不同,下面配置一个nfs系统,用来使局域网内的所有用户均可访问该目录,可将该目录配置成yum源,供内网机器安装软件;首先安装NFS套件,命令如下:

yum install nfs-utils.x86_64(64位系统)
yum install nfs-utils(32位系统)

然后安装portmap服务,portmap在redhat6中改名为rpcbind。
yum install rpcbind(redhat6)
yum install portmap(redhat5)

配置nfs服务端
vim /etc/exports

添加
/home/nfshare 192.168.0.0/24(ro,no_root_squash)
这一行表明本机的/home/nfshare这个目录为nfs共享目录,可访问的ip地址区间为192.168.0.0-192.168.0.254,权限为只读,当访问者为root用户时访问该目录具有root权限

重启nfs服务
/etc/init.d/rpcbind start
/etc/init.d/nfs start

将nfs加入开机启动项
chkconfig nfs on

客户端配置
查看是否能访问nfs服务
showmount -e 192.168.0.10

Export list for 192.168.0.10:
/opt/redhat6 192.168.0.11

表示可以访问,如不可访问查看nfs服务端nfs服务是否启用,防火墙是否允许通过。

挂载nfs目录
mkdir /opt/redhat6
mount 192.168.0.10:/opt/redhat6/ /opt/redhat6/
配置开机自动挂载(实际生产环境中,一般不这么干,可能因为网络等因素出现问题)
vi /etc/fstab
添加
192.168.0.10:/opt/redhat6 /opt/redhat6 nfs nodev,ro,rsize=32768,wsize=32768 0 0


NFS基本配置

查询软件是否安装:

[root@freeoa ~]# rpm -qa | grep nfs
nfs-utils-1.0.9-40.el5
nfs-utils-lib-1.0.8-7.2.z2

[root@freeoa ~]# rpm -qa | grep protmap(注意redhat6的话。换成 rpm -qa|grep rpcbind )
[root@freeoa ~]# rpm -ivh /misc/cd/Server/portmap-4.0-65.2.2.1.i386.rpm

这个软件已经安装了,下面列出一些常见指令及目录的作用介绍。
 
/etc/exports
这个是NFS的主要配置文件,但没有默认值,空的。

/usr/sbin/exportfs  :  用在服务端,用来查看本服上利用nfs对外共享了哪些目录

维护NFS共享资源的命令

/usr/sbin/showmount : 用在客户端,用来查看某个nfs服务器共享出来的目录

exportfs用在server端,而showmount则用在客户端,这个命令可以查看NFS服务器共享出来的目录资源。

/var/lib/nfs/
该目录下有两个重要的日志文件,etab:主要记录NFS共享出来的完整权限设定值,xtab:记录曾连接到此主机的客户机相关数据。(这里xtab不知道为啥为空,反倒有个rmtab文件,记录了曾连到此主机的客户机相关数据)
 
showmount -e nfs_server_ip  : 查看nfs服务器共享的目录,在客户端执行
showmount -a:  查看本机共享出去的目录,在nfs服务端执行

exports内的常用权限参数:
rw //可读写的权限
ro //只读权限
sync //数据同步写入到内存与硬盘中
async //数据只会暂存在内存中
no_root_squash //如果使用root用户登录,就有root用户的权限
root_squash //如果使用root用户登录,就会变成匿名用户的权限
all_squash  //不管以什么用户登录,都会变成匿名用户的权限
anonuid //匿名用户uid设置值, 就是说匿名的时候,使用nfs服务器上的哪个用户,指定的就是要使用的哪个用户的uid
anongid //匿名用户gid设置值


配置示例:
[root@freeoa ~]# vi /etc/exports
/tmp    *(rw)
所有人对/tmp目录都有读写权限。

/tmp    *(ro)   192.168.100.100(rw)
所有人对/tmp目录二都有只读权限,而192.168.100.100对这个目录有读写权限。

/tmp    192.168.100.0/24(ro)    192.168.100.100(rw)
192.168.100.0/24这个网段人用户对这个目录有只读权限,而192.168.100.100对这个目录有读写权限。

/tmp    *(ro,all_aquash,anonuid=100,anongid=100)
所有人对这个目录都会变成服务器中uid为100,gid为100的用户的权限

[root@freeoa ~]# service nfs restart


NFS挂载

手工挂载:
mount -t nfs 192.168.100.20:/home /tmp

-t //指定文件类型

ip地址是服务器的地址(也可以使用主机名代替),:后是共享目录,

/mnt是挂载到本机的目录

也可以这样:
mount.nfs 192.168.100.20:/home /mnt

开机自动挂载:
[root@freeoa ~]# vi /etc/fstab

192.168.100.20:/home    /mnt     nfs     defaults   0 0

服务器名称/ip地址:共享目录   挂载点 文件类型  挂载选项 备份频率 检查选项

[root@freeoa ~]# vi /etc/rc.d/rc.local

mount.nfs 192.168.100.20:/home /mnt

NFS自动挂载和自动缷载

当使用NFS共享文件时,需要首先挂载,挂载后用户又不是一直在线,只要任一方离线,都会造成另一方等待超时,那么有没有一个方法能让用户使用时自动挂载,想不使用时自动缷载?当然是有的,那就是使用autofs这个服务。在客户端配置:
[root@freeoa ~]# vi /etc/auto.master
/nfs    /etc/autonfs.conf //添加这一行
/nfs //挂载的主目录。

/etc/autonfs.conf //挂载文件的配置。

[root@freeoa ~]# mkdir /nfs //添加目录
[root@freeoa ~]# vi /etc/autonfs.conf //编辑并创建自动挂载文件
home    192.168.100.20:/home

home     //本地目录
192.168.100.20:/home //远程挂载的共享目录

中间可以添加一引些挂载选项。

[root@freeoa ~]# service autofs restart

[root@freeoa ~]# ls /nfs/home  //第一次使用时是没有这个目录的,当访问这个目录时就会自动挂载了,当5分钟没有使用就会自动缷载。


NFS常用命令
exportfs //查看已共享的目录(服务器端使用)

exportfs选项:
-a //全部mount或umount /etc/exports中的内容

-u //umount内容

-r //重新mount /etc/exports中的内容

-o //共享选项

-v //在exports的时候,将共享的目录显示到屏幕上

如果我们修改了/etc/exports后,并不需要重启nfs服务,只要用exportfs重新扫描一次/etc/exports,并且重新加载即可

语法: exportfs [-aruv]
 -a:全部挂载(或卸载) /etc/exports档案内的设定
 -r:重新挂载/etc/exports里面的设定,也同步的更新/etc/exports和/var/lib/nfs/xtab里面的内容
 -u:卸载某一目录
 -v:在export的时候,将分享的目录显示到荧屏上.

例子
#exportfs -rv //重新export一次
#exportfs -au //全部卸载,这样已经挂载的客户端会访问不到nfs目录, 不过如果紧接着 exportfs -ar的话。客户端无须重新mount,可以直接访问

客户端查询:
[root@freeoa ~]# showmount -a 192.168.100.20

[root@freeoa ~]# showmount -e 192.168.100.20

NFS常见故障

如果还有人在使用NFS,这时服务器需要关机的话,是不能关机的,系统会等到没有用户使用时再关机,如果关机时间很长,看看是不是还有用户在线。另外如果使用的是服务器名挂载,要确保服务器名是能解析的。如果没有DNS服务器,可以在/etc/hosts中添加。

[root@freeoa ~]# vi /etc/hosts.deny  //拒绝以下两台主机访问。

mountd:192.168.100.198,192.168.100.200

接下来实现自动挂载:

方法有三种:第一种修改/etc/fstab文件,第二种修改/etc/rc.d/rc.local文件,第三种实现自动挂载和自动缷载。这里就以第三种为例:

[root@freeoa /]# vi /etc/auto.master
/nfs    /etc/autonfs.conf //添加这一行

[root@freeoa /]# vi /etc/autonfs.conf //在这之前这个文件是没有的,当编辑好保存之后就有了。
nfs     192.168.100.203:/mydata
cdrom   192.168.100.203:/misc/cd

[root@freeoa /]# service autofs restart

配置完成,就可以开始测试了。


CentOS 7 下关闭rpcbind服务

centos 7安装完成后,会发现有进程监听了0.0.0.0:111端口,这可能会存在安全风险,可以将其禁用掉。实际使用进程为rpcbind,大部分服务是不依赖于rpcbind的,只有NFS需要用到这个服务。

禁止rpcbind服务的命令:

# 停止进程
systemctl stop rpcbind.socket
systemctl stop rpcbind

# 禁止随开机启动
systemctl disable rpcbind.socket
systemctl disable rpcbind