linux nfs rpcbind portmap 基本配置及错误处理方法


CentOS Linux安装NFS服务器
 
NFS是Network File System,基于RPC(Remote Procedure Call Protocol远程过程调用协议)实现。NFS是TCP/IP协议集所提供的一种子协议,该协议可以实现LINUX/UNIX主机之间的文件共享,磁盘空间共享。它只用于Linux和Unix内核的操作系统进行共享。使用NFS网络文件系统,可以将服务器的硬盘挂载到本地,就像操作本地计算机的硬盘一样。
 
这里用的系统是CentOS6.4,假设NFS Server IP为192.168.1.2,NFS Clinet IP为192.168.0.100。
 
1.服务端安装NFS:
 


yum install nfs-utils protmap 


nfs-utils包提供了NFS服务器程序和相应的管理工具。
 protmap是一个管理RPC连接的程序,portmap服务对NFS是必须的,因为它是NFS的动态端口分配守护进程,如果portmap不启动,NFS就是启动不了的。
 
2.配置NFS服务端,编辑/etc/exports文件:
 


vim /etc/exports 


设置共享文件目录,如加入:
 


/home/nfsdir *(rw)
 /home/share 192.168.0.100(rw,no_root_squash) *(ro) 


/home/nfsdir *(rw)
 表示共享/home/nfsdir目录,所有用户都有读写权限。
 /home/share 192.168.0.100(rw,no_root_squash) *(ro)
 表示共享/home/share目录,192.168.0.100有读写权限并且root用户有完全管理访问权限,其他机器仅有只读权限。
 
配置文件的格式为:
 [共享的目录] [主机名或IP(参数,参数)]
 其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是sync,ro,root_squash,no_delay。
 当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
 当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
 [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
 下面是一些NFS共享的常用参数: 




ro  只读访问
rw  读写访问
sync  同步写入资料到内存与硬盘中
async  资料会先暂存于内存中,而非直接写入硬盘
secure  NFS通过1024以下的安全TCP/IP端口发送
insecure  NFS通过1024以上的端口发送
wdelay  如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay  如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide  在NFS共享目录中不共享其子目录
no_hide  共享NFS目录的子目录
subtree_check  如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check  和上面相对,不检查父目录权限
all_squash  共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash  保留共享文件的UID和GID(默认)
root_squash  root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash  root用户具有根目录的完全管理访问权限
anonuid=xxx  指定NFS服务器/etc/passwd文件中匿名用户的UID
 anongid=xxx  指定NFS服务器/etc/passwd文件中匿名用户的GID 


当exports文件修改后,使用以下命令,不需要重启NFS服务,就可以重新挂载/etc/exports里面的设定:
 


exportfs -arv 


3.先启动portmap服务:
 


service portmap restart 


4.再启动NFS服务:
 


service nfs restart 


如果之前没有先启动portmap服务,那么当启动NFS服务时会停在
 


Starting NFS daemon: 


很长时间。
 
5.设置nfs、portmap开机自启动:
 


chkconfig --level 345 nfs on
 chkconfig --level 345 portmap on 


6.客户端也需要安装nfs-utils、portmap软件包,并启动portmap服务:
 


yum install nfs-utils portmap
 service portmap restart
 chkconfig --level 345 on 


7.NFS服务端启动成功后,客户端可以利用showmount命令测试是否能连上服务端:
 命令格式:showmount -e [hostname|IP],showmount命令需要安装了nfs-utils软件包才有。
 


showmount -e 192.168.1.2 


显示如下:
 


/home/nfsdir *
 /home/share (everyone) 


8.客户端建立挂载的文件夹:
 


cd /mnt
 mkdir nfs1
 mkdir nfs2 


9.客户端使用mount命令挂载NFS共享文件:
 


mount -t nfs 192.168.1.2:/home/nfsdir /mnt/nfs1
 mount -t nfs 192.168.1.2:/home/share /mnt/nfs2 


命令格式:mount - t nfs nfs服务器地址:目录共享 本地挂载目录点
 
10.客户端可使用df命令,mount命令查看挂载情况:
 


mount
 192.168.1.2:/home/share on /mnt/nfs2 type nfs (rw,addr=192.168.1.2)
 192.168.1.2:/home/nfsdir on /mnt/nfs1 type nfs (rw,addr=192.168.1.2) 


11.客户端卸载NFS文件命令:
 


umount /mnt/nfs1
 umount /mnt/nfs2 


12.客户端可以设置系统启动时自动挂载NFS文件:
 需要将NFS的共享目录挂载信息写入/etc/fstab/文件,以实现对NFS共享目录的自动挂载。
 编辑/etc/fstab文件:
 


vim /etc/fstab 


在最后加入如
 


192.168.1.2:/home/nfsdir /mnt/nfsdir nfs defaults 0 0 


13.查看当前主机RPC状态:
 


rpcinfo -p localhost 



一个很纠结的错误
使用 mount -t nfs 127.0.0.1:/home/lzgonline/rootfs /mnt 和 mount -t nfs 192.168.1.9:/home/lzgonline/rootfs /mnt 本机挂载nfs则没有问题,然而使用 mount -t nfs 192.168.3.12:/home/lzgonline/rootfs /mnt 时却出现了问题,导致开发板无法通过nfs挂载启动,其中192.128.3.12 和 192.128.1.9(即nfs服务器)之间建立了映射(DMZ)关系。
mount.nfs: access denied by server while mounting 192.168.3.12:/home/lzgonline/rootfs
百度、谷歌了很久,大部分都说是权限设置有问题,其实文件夹权限都设为777了,权限上都没问题,hosts.deny和hosts.allow都保留默认设置,防火墙也关了,该设置的都设置了,但还是被拒绝,很是郁闷,就在一筹莫展的时候,通过查看一些linux技术论坛后逐渐找到了问题所在。
首先使用命令查看出错日志文件
[root@lzgonline init.d]# cat /var/log/messages | grep mount
Jun 29 00:49:04 lzgonline mountd[1644]: refused mount request from 192.168.3.12 for /home/lzgonline/rootfs (/home/lzgonline/rootfs): illegal port 1689
Jun 29 00:51:02 lzgonline mountd[1644]: refused mount request from 192.168.3.12 for /home/lzgonline/rootfs (/home/lzgonline/rootfs): illegal port 1710
Jun 29 01:02:17 lzgonline mountd[1644]: refused mount request from 192.168.3.12 for /home/lzgonline/rootfs (/home/lzgonline/rootfs): illegal port 1916
Jun 29 01:09:51 lzgonline mountd[1644]: refused mount request from 192.168.3.12 for /home/lzgonline/rootfs (/home/lzgonline/rootfs): illegal port 2157
Jun 29 01:17:02 lzgonline mountd[1644]: refused mount request from 192.168.3.12 for /home/lzgonline/rootfs (/home/lzgonline/rootfs): illegal port 2318
 
从出错日志可以看出,mount.nfs: access denied by server while mounting 192.168.3.12:/home/lzgonline/rootfs 被拒绝的原因是因为使用了非法端口,功夫总没白费,终于在一个linux技术论坛上找到了答案:
I googled and found that since the port is over 1024 I needed to add the "insecure" option to the relevant line in /etc/exports on the server. Once I did that (and ran exportfs -r), the mount -a on the client worked.


//如果端口号大于1024,则需要将 insecure 选项加入到配置文件(/etc/exports)相关选项中mount客户端才能正常工作:


查看 exports 手册中关于 secure 选项说明也发现确实如此


[root@lzgonline init.d]# man exports


secure,This  option requires that requests originate on an Internet port less than IPPORT_RESERVED (1024). This option is on by default. To turn it off, specify insecure.


//secure 选项要求mount客户端请求源端口小于1024(然而在使用 NAT 网络地址转换时端口一般总是大于1024的),默认情况下是开启这个选项的,如果要禁止这个选项,则使用 insecure 标识


修改配置文件/etc/exports,加入 insecure 选项


/home/lzgonline/rootfs  *(insecure,rw,async,no_root_squash)


保存退出


然后重启nfs服务:service nfs restart


然后问题就解决了


笔者用的Linuxf发行版本为Centos6.4,以下方法理论上讲对于Fedora, Red Hat均有效:
 
搭建好NFS服务后,如果用以下的命令进行挂载:
 
# mount -t nfs 172.16.12.140:/home/liangwode/test  /mnt
 
 出现如下错误提示:
 
mount.nfs: access denied by server while mounting 172.16.12.140:/home/liangwode/test
 那我们可以用以下的方法进行解决:
 
修改/etc/sysconfig/nfs文件,将 
 
# Turn off v2 and v3 protocol support 
#  RPCNFSDARGS="-N 2 -N 3" 
# Turn off v4 protocol support 
#RPCNFSDARGS="-N 4"    /*把这句话的#号去掉*/
 NFS分为三个版本,即NFS-2 NFS-3 NFS-4,该配置文件默认关闭了这三个的NFS版本,我们只需要打开NFS-4即可。




 在一些系统中,NFS服务是关闭状态的,为了启动这项功能,我们需要手动进行设置。那么对于NFS Server和NFS Client的设置我们在文章中来为大家详细介绍一下。希望能够让大家掌握这部分知识。


服务端(Solaris 9):


一.NFS Server设置:


启动NFS Server服务:


# /etc/rc3.d/S15nfs.server start 
Share目录:


编辑文件/etc/dfs/dfstab:


share -F nfs -o rw=10.0.0.13,root=10.0.0.13 /home 
然后运行shareall将目录share出去,或者不编辑该文件,直接在命令行输入效果一样.


查看是否成功share"


# dfshares  
 
RESOURCE                                  SERVER ACCESS    TRANSPORT  
 
solaris:/home                         solaris  -         - 
二.NIS设置:


复制配置文件:


# cp /etc/nsswitch.nis /etc/nsswitch.conf 
设置域名:


# domainname congli  
 
# echo congli > /etc/defaultdomain 
初始化及启动服务:


# ypinit -m  
 
# /usr/lib/netsvc/yp/ypstart 
客户端(Solaris 9)


一.NFS Client设置:


启动NFS Client服务:


# /etc/rc2.d/S73nfs.client start 
编辑/etc/vfstab:


10.0.0.12:/home - /home nfs - yes soft,bg 
把NFS文件系统挂上:


# mountall -r 
二.NIS设置:


复制配置文件:


# cp /etc/nsswitch.nis /etc/nsswitch.conf 
设置域名:


# domainname congli  
 
# echo congli > /etc/defaultdomain 
把NIS服务端的IP加到/etc/hosts:


10.0.0.12       solaris


初始化及启动服务:


# ypinit -m    (填上NIS服务端的hostname,Ctrl+D结束)  
 
# /usr/lib/netsvc/yp/ypstart 

你可能感兴趣的:(问题备份,linuxnfs,portmap,rpcbind,access,denied,by,ser)