*在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服务
*在系统没有正确启动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