因为一个在做嵌入式开发的朋友在用NFS服务时遇到一些问题,让我给帮忙研究下,所用的系统为fedora13,在nfs挂载时总会出现问题。
第一个问题大概是portmap没有反映,这个问题的解决其实很简单,因为他没有安装好portmap,因为没有网络,没法yum,开始上网找portmap,发现fedora13竟没有portmap的rpm包,猜想是改名了,费了点力气发现portmap现在被整合进了rpcbind包,再解决下依赖性问题安装上rpcbind,启动服务,portmap这个问题就这么解决了。
原以为就这么结束了,结果又冒出一个新的问题,mount.nfs:access denied by server while mounting…这个google一下出来的东西就很多了,结果大多是ubuntu的解释,貌似一般都是网段什么的问题,但对fedora13一点帮助没有,在google半天没找到比较合适的解答后,进行抓包行动,结果看到NFS的版本为V4,在reply中有个allow,下面的值全为0,刚好符合Access deny,于是改搜索是否为版本问题,果然是版本问题,由于原文出处已不得查知,这里留下原文:
在使用fedora13 的nfs服务的时候,它的配置与以前有了一定的区别,这里把fedora13前的配置也列一下,安转nfs程序就不说了,在配置nfs的时候,只要在 /etc/exports文件里写入如:"/root/work/nfs 192.168.1.*(rw,sync,no_root_squash)“ 保存后重启nfs服务就可以通过本地挂载测试了,但在fedora13中这样还不行,fedora13默认使用NFS4, 这时候挂载将会出下面的错误提示:
# mount -t nfs 192.168.1.103:/root/work/nfs /mnt
mount.nfs: access denied by server while mounting 192.168.1.103:/root/work/nfs
需要修改/etc/sysconfig/nfs文件,将
# Turn off v2 and v3 protocol support
#RPCNFSDARGS="-N 2 -N 3"
# Turn off v4 protocol support
RPCNFSDARGS="-N 4" //这句前面的#去掉就可以了。
如此解决了第二个问题,但Access deny的情况比较多,这种解决方案仅适用fedora13及后续版本。
因为这样的问题,顺便研究了下nfs,nfs是用于文件共享的,类似网络映射,但主要用于linux或unix like系统之间进行文件共享。大概分为安装,设置与常用命令,这里也做点简单介绍:
首先来说安装,nfs主要需要两个软件,rpcbind和nfs-utils,因为portmap已换为rpcbind,估计yum安装时也得yum install rpcbind (ubuntu 里貌似还是apt-get install portmap),建议用yum安装这两个软件包,没有网络的情况下可能比较麻烦,我在安装nfs-utils时发现了nfs-utils和nfs-utils-lib互相缺少的情况,只能强制安装了。简单介绍下portmap和nfs的关系,portmap服务是用于分配端口的,自身有固定的端口111,nfs没有固定的端口,就需要portmap给分配端口,因而网络请求关系大概是客户端向111端口请求nfs端口,portmap查询到分配给nfs的端口号交给客户端,客户端再根据获取的端口和nfs服务器进行连接。
接下来就是nfs的设置,首先为了兼容性问题,对于fc13而言还是去出V4使用V3版本,如之前引用文中进行设置,接下来就是进行共享的文件设置,在文件共享中有个比较复杂的权限情况,建议去鸟哥的linux网站(http://linux.vbird.org/)看看,网络篇中的nfs服务器架设,有比较好的解释nfs的权限问题。这里简单介绍下/etc/exports文件的编写:
/tmp 192.168.100.0/24(rw, no_root_squash)
意味将本机的/tmp文件夹的内容共享给192.168.100整个网段内的主机,这些主机均具有读写权限,并且作为root用户进行文件操作,大概分为三段,第一段是服务器共享的目录,第二段是网络客户端的主机名(支持通配符)或主机ip名(段),紧接着的括号内的是此文件夹的共享权限,有ro(read only), rw(read write), sync, async,no_root_squash, root_squash, all_squash,详细设定与权限还请自己阅读查阅。
再简单介绍下nfs的操作:
portmap启动: /etc/init.d/rpcbind start
nfs启动: /etc/init.d/nfs start
查询共享的目录: showmount –e localhost
装载和卸载共享目录:exportfs –arv 装载全部共享目录 exportfs –auv 卸载全部共享目录(此操作用于修改/etc/exports文件后,可以不用重启portmap和nfs使设定生效)
客户端挂载(以/tmp为例):mount –t nfs IP:/tmp /home/nfs(本地目录)
因为nfs的操作牵涉到权限问题,参考下鸟哥的解释会比较好的理解,比较懒的做法就是exports文件中加上no_root_squash权限.
一般操作大概也就这些流程,这里只做简单介绍了,可能存在一些问题,还请指出。