利用NFS挂载网络主机路径

        最近遇到一个业务场景:有N台不能连接外网的主机生产了许多业务日志,这些日志需要被一个日志收集的中间件推送到远程的日志处理主机,这就要求这个中间件所在的主机能够访问外网,但是如何把这些业务日志实时地传输到这个能够访问外网的“跳板机”是一个问题。方案大致上有两种:一种是通过flume等开源的日志传输工具把文件传送到跳板机,但是配置比较的复杂,而且需要2端都配置比较多的信息,另一种就是本文即将要介绍的如何利用NFS挂载某一台网络主机的路径,将其作为本地的一个路径进行日志的读取。
好了背景介绍完了,下面我们要来了解以下的内容:

一、什么是NFS
Network File System (NFS),一种用来允许挂载一个远程主机的磁盘分区并把它当作本地资源来用的一个服务,它允许互联网中快速、无缝地传输共享文件。

二、Linux内核的要求和NFS版本注意事项
Version 3 NFS是http://nfs.sourceforge.net上推荐是一个版本,这里我们就采用这个版本来进行实战。具体原因是V2是1.2内核系列的那段时间发布的,版本比较老(至于为什么不选V4后面会讲)。于此同时,如果你需要以下几点的服务之一,请务必保障你的Linux内核在2.2.18以上。
1、Linux的NFS和其他操作系统的NFS协同工作
2、使用NFS的文件可靠锁( file locking reliably )服务
3、使用NFS Version3

*在linux2.2.14以上的内核可以通过打补丁包(从Linux NFS 主页)的形式来支持以上3点的功能(服务),如果内核介于2.2.14~2.2.17并且拥有内核源码,你就可以知道这些补丁包其实已经添加在里面了,因为NFS Version3可以通过一个配置项来得到支持。尽管如此,如果没有特别的原因建议还是使用较新的内核,因为较新的内核往往对以往历史的内核做了一些bugs上的修复,比如说2.2.19相比起2.2.18就完善了一些额外的锁功能。

*关于版本的选择方面,所有2.4以及以上的内核用用完整的NFS Version 3的所有功能,所有的2.6以及以上的内核拥有不同程度上的对NFS Version4的功能支持。这些将会晚点讨论

*处理单文件大于2GB的文件需要2.4x以及以上的内核 && 2.2.x以及以上本本的glibc

*内核在2.2.18以上的内核支持TCP协议下的NFS客户端

*内核2.2.18系列下,TCP协议下的NFS服务端作为一种实验性的选择,以一种充满bugs的形式存在着,对于内核2.4和2.5系列的补丁包分别是从2.4.17、2.4.5.6开始的

总而言之,从以上我们可以得知一个信息:NFS的版本越高,对Linux的内核要求也就相应地越高方能很好地支持NFS当前版本的所有功能,也因为如此,官网的文档针对内核相匹配的NFS版本进行介绍,如果说你的内核是低于2.2.18(2.6.x是最佳),那么官网的指引文档可能就不适用。截至发文章前,官网指出V4版本的NFS依然在开发、不断迭代当中,因此解释了上面为何不用V4。


三、安装nfs-utils(x86_64CentOS 6.8为例)

这部分的安装是服务器、客户端无关的,都是用同一个包

首先是要下载NFS-utils-2.1.1.tar.bz2(有可能更新版本)

由于当前的主机不能连接外网,这里提供详尽的RPM包名称:

keyutils-1.4-5.el6.x86_64.rpm

libevent-1.4.13-4.el6.x86_64.rpm

libgssglue-0.1-11.el6.x86_64.rpm

libnfsidmap-0.25-15.el7.x86_64.rpm

libtirpc-0.2.1-11.el6.x86_64.rpm

nfs-utils-1.2.3-75.el6.x86_64.rpm

nfs-utils-lib-1.1.5-11.el6.x86_64.rpm

python-argparse-1.2.1-2.1.el6.noarch.rpm

rpcbind-0.2.0-12.el6.x86_64.rpm

在这个很棒的地方http://www.rpmfind.net/linux/RPM/可以找到你想要的依赖包哦~

*先尝试执行 rpm -ivh nfs-utils-1.2.3-75.el6.x86_64.rpm 看看缺少以上什么包或者库然后针对性地进行下载和安装

*其中下面这个对最后的安装有循环依赖关系,需要执行以下命令
rpm -ivh ./nfs-utils-lib-1.1.5-11.el6.x86_64.rpm --nodeps

然后再执行rpm -ivh nfs-utils-1.2.3-75.el6.x86_64.rpm 方安装成功


如果可以yum的话

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

yum install nfs-utils(32位系统)

然后安装portmap服务,portmap在centos6中改名为rpcbind

yum install rpcbind(centos6)

yum install portmap(centos5)


四、服务器端的配置

       在这里我们就以达到一个目的为标准:由背景引发的需要将机器B的某路径挂载到机器A,为什么要特别说这一点呢,因为要挂载的话只需要配置一个文件,但是严格来说是要配置3个文件的,他们分别是/etc/exports,/etc/hosts.allow,和/etc/hosts.deny。顾名思义,你应该知道后面2个都是为了安全。因为我机器所处的环境导致了我不太需要在这方面做特别的配置,这将在以后讨论。


编辑/etc/exports

目录 机器1的域名或者ip(选项1,选项2...)

目录 机器2的域名或者ip(选项1,选项2...)

重点是在选项部分

ro 目录以一种只读的形式共享目录,客户端将只读不可写,默认值

rw 客户端可以对目录读写

no_root_squash 默认情况下任何来自客户端的root用户的文件请求都被当作是当前Server的nobody用户在进行操作,准确来说这些请求操作被映射到一个Server上的“nobody”的UID,注意哦不是客户端哦。如果选择了这个选项,客户端的root用户将会有和服务器端的相同root的权限,尽管有时候在Server上操作文件的时候是要有root权限的,但是如果没有特别的理由不要这样干,因为这样可能会引发一些严重的误操作问题,linux...你懂的。

no_subtree_check 如果一个卷(Volume)的部分被共享(官网专用词汇是export,这也是配置文件的名字),一个日常的任务叫‘subtree checking’会验证来这个volume上请求的特定部分的文件是否被客户端请求,当整个volume被export的时候,关闭这个选项可以提高传输速度。

sync和async 默认情况下,除了最新的1.11版本之外,命令exportfs会以async的方式执行,来告诉客户端一个文件的写入已经完成--写入了稳定的存储如硬盘--当NFS完成了对文件系统的写操作,这种方式在系统重启的时候可能会引起数据的丢失,但是sync的选项可以避免这一点。

比如我这里是  /opt/log 192.168.1.52(rw) 的意思是我将把当前这台机192.168.1.50的/opt/log目录作为要共享到网络上供别人挂载的点

*也可以指定子网掩码,比如/opt/log 192.168.1.52/24(rw)或者/opt/log 192.168.1.52/255.255.255.0(rw)都是可以的

*也可以模糊匹配,比如*.foo.com或者192.168. 也可以 注意2.2内核有这方面的匹配缺陷,在2.2.19被修复

要验证是否生效,需要启动NFS服务,以下作为和客户端相同的步骤来讲:


五、NFS的启动

5.1、NFS依赖于RPC服务,所以首先要启动RPC服务(NFS官方文档是启动Portmapper,现在已经在刚提到的rpcbind的包里)

/etc/init.d/rpcbind start   大部分发行版本会开机自启动这一服务,但是最好运行NFS之前使用psaux | grep rpcbind命令对rpc服务进行检测

验证RPC服务

利用NFS挂载网络主机路径_第1张图片

*在系统没有正确启动RPC的一系列服务(通常发生在这些脚本没有在你当前发行版本都启动了的时候,注意以下的服务都至少在以上的截图中出现一次,也就是一行才算是正常),然后又需要诊断RPC服务的时候,要保证按照以下顺序启动上面的服务(其实这部分可以跳过,貌似现在整合进rpcbind之后以下的步骤都不用理会了,但是诊断RPC的时候还是有用的,建议搭建的时候跳过这一步阅读,如果没什么意外的话)

rpc.portmap
rpc.mountd, rpc.nfsd
rpc.statd, rpc.lockd (if necessary), and
rpc.rquotad
在这些地方可以找到


注:

1、portmap其实就是rpcbind包含了的东东

2、rpc.nfsd包含了rpc.lock(在上面的截图中对应service是nlockmgr)和rpc.statd

(NFS大部分的工作都是rpc.nfsd做的,rpc.lockd andrpc.statd处理locking服务,rpc.mountd,处理初始化mount请求,rpc.rquotad处理用户对export出去文件的文件分配,从2.2.18内核开始lockd服务在nfsd启动的时候就被调用了所以我们不用自己启动,但是statd需要被另外进行单独的启动,大多数的发行版本针对这些守护进程都有自己的脚本)


5.2启动NFS服务

/etc/init.d/nfs start

当然你也可以加入开机自启动

chkconfig nfs on之类的

可以通过service nfs status查看服务的状态是否正确


六、客户端

客户端的安装和服务器端是一样的,然后直接挂载

mount -t nfs 192.168.1.50:/opt/log/ /opt/log52/这样就能把远程50的机器挂载到52本地的/opt/log50下


showmount -e 192.168.1.50

显示如下:

Export list for 192.168.1.50:

/opt/log ......


其他相关的参考文章:

http://blog.csdn.net/demo_deng/article/details/9568927

http://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html


你可能感兴趣的:(开发/项目工具)