NFS服务启动时无法绑定ipv6地址

    在测试NFS的时候,突然发生了从未有过的错误,故障信息如下,为此特地描述一下排错的过程,供同行参考:


info:
[root@node10 ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd: rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
                                                           [  OK  ]
Stopping RPC idmapd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
Starting NFS daemon: rpc.nfsd: unable to create inet6 TCP socket: errno 97 (Address family not supported by protocol) 
                                                       [  OK  ]
analysis:
    从上面的信息可以看出,nfs在启动的时候报错了。大致的意思是无法设置ipv6的套接字接口,其中这一句话很重要:
Address family not supported by protocol 。地址族不被nfs协议所支持。
    到这里,就很奇怪了,nfs是支持ipv6协议的,而且系统就更不要说了,肯定支持ipv6协议。但是,在linux系统中一切功能都是模块组合而成,只不过可以将模块编译进内核或者编译成外挂式模块动态加载。因此,想到这里就提出一个问题,是不是ipv6的模块没有加载,接着就进行下面的检查:

[root@node10 ~]# ifconfig eth0 | grep inet
          inet addr:172.16.1.20  Bcast:172.16.1.255  Mask:255.255.255.0
[root@node10 ~]#
    从上面的信息反馈可见,没有出现inet6的地址信息,可以初步断定ipv6的模块并没有编译进内核,那就应该是动态加载,而此处没有信息,那就说明可能没有动态加载成功。


[root@node10 ~]# cd /proc/sys/
[root@node10 sys]# ls
abi  crypto  debug  dev  fs  kernel  net  sunrpc  vm
[root@node10 sys]# cd net
[root@node10 net]# ls
core  ipv4  netfilter  unix
[root@node10 net]#
    从上面的的信息可见,在/proc/sys/net/目录中没有出现ipv6的信息,再一次说明ipv6的模块加载确实出现了问题,因为如果成功加载,则在内核的信息中是可以看到有一个ipv6的目录存在


[root@node10 net]# lsmod | grep ipv6
ipv6                  322541  0
    从上面的信息可见,ipv6模块似乎在开机的时候默认是加载的,但是从前面的检查可知并没有生效,这是什么原因呢? 紧接着进行下面的检查:
[root@node10 net]#
[root@node10 net]# cd /etc/modprobe.d/
[root@node10 modprobe.d]# ls
anaconda.conf  blacklist.conf  dist-alsa.conf  dist.conf  dist-oss.conf  ipv6.conf  openfwwf.conf
[root@node10 modprobe.d]# cat ipv6.conf
# Anaconda disabling ipv6
options ipv6 disable=1
   从上面的ipv6.conf中的信息可见ipv6的功能被disable了,到此问题算是找到了。也就是说在启动的时候虽然加载了ipv6的模块,但是给的参数是disable=1,表示关闭ipv6的功能,所以导致了ipv6的功能并没有生效。


问题找到后,就要进行处理了:
[root@node10 modprobe.d]#
[root@node10 modprobe.d]# sed -i 's/1/0/' ipv6.conf
[root@node10 modprobe.d]# cat ipv6.conf
# Anaconda disabling ipv6
options ipv6 disable=0
[root@node10 modprobe.d]#
[root@node10 modprobe.d]# lsmod | grep ipv6
ipv6                  322541  0
[root@node10 modprobe.d]# modprobe -r ipv6
[root@node10 modprobe.d]# lsmod | grep ipv6
[root@node10 modprobe.d]# modprobe ipv6
[root@node10 modprobe.d]# lsmod | grep ipv6
ipv6                  322541  134
[root@node10 modprobe.d]#
    从上面的步骤可知,将disable的改为了0,表示启用。然后卸载模块重新加载一次(也可以重启系统),加载成功后,再次验证此前的判断:


[root@node10 modprobe.d]# ifconfig eth0 | grep inet
          inet addr:172.16.1.20  Bcast:172.16.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fee9:3560/64 Scope:Link
[root@node10 modprobe.d]#
[root@node10 modprobe.d]# cd /proc/sys/net/
[root@node10 net]# ls
core  ipv4  ipv6  netfilter  unix
[root@node10 net]#
    从上面的信息可见,此前没有出现的预判信息,这里已经出现了,因此表示ipv6功能已经成功启用。接下来再次重启nfs服务:


[root@node10 net]# service nfs restart
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS mountd:                                  [  OK  ]
Shutting down NFS quotas:                                  [  OK  ]
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Stopping RPC idmapd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
[root@node10 net]# 


   ok,到此,不再有nfs的报错信息,问题解决。