CentOS 6 上的 NFS 客户端问题:rpcbind 未监听端口 111

CentOS 6 上的 NFS 客户端问题:rpcbind 未监听端口 111

我正在尝试在新的 CentOS 6.6 服务器上为现有 NFS 服务器设置 NFS 客户端,但遇到了一些无法解决的问题。启动时rpcbindnfs我收到:

# /etc/init.d/rpcbind start
# /etc/init.d/nfs start
    Starting NFS services:                                     [  OK  ]
    Starting NFS quotas: Cannot register service: 
         RPC: Unable to receive; errno = Connection refused
         rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
                                                               [FAILED]
    Starting NFS mountd:                                       [  OK  ]
    Starting NFS daemon:                                       [  OK  ]

rpcinfo -p工作正常

# rpcinfo -p
program vers proto   port  service
100000    4   tcp    111  portmapper
    .. snip
100021    4   tcp  47627  nlockmgr

rpcinfo -p 127.0.0.1(或 localhost)返回错误:

# rpcinfo -p 127.0.0.1
rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused

使用 (netstat -an) 检查端口,似乎 portmap/rpcbind 没有监听端口 111。没有任何东西监听端口 111,而 rpcbind 监听端口 3421(编辑:不像我最初想的那样随机)。

我检查过或尝试过的事情包括:

  • 禁用 selinux(未启用)
  • 清算/etc/hosts.deny
  • 清除iptables(开始时没有规则)
  • 检查日志(未发现任何相关内容)
  • 重新启动服务器(无效)
  • 在 CentOS 5 服务器上检查(portmap 正在监听端口 111)
  • 检查了 Google:有很多类似的错误消息,但没有具体说明 rpcbind 没有监听端口 111(并且没有任何解决方案有效)。
  • “telnet”到端口 111(超时,确认没有任何内容在监听该端口)
  • 检查 127.0.0.1/localhost 设置(它们工作正常)

此时,我实际上没有任何选项或需要检查的东西,需要一些想法。此时我几乎会尝试任何方法,因为没有 NFS,服务器就没什么用。

更新 1:

rpcinfo -s localhost在客户端上运行可以,但rpcinfo -s server不起作用。我想知道客户端是 CentOS 6 而服务器是 CentOS 5 是否存在问题。

更新 2:

showmount新客户端和 NFS 服务器上的输出相同:

# showmount -e 10.2.212.10
Export list for 10.2.212.10:
/shared/uesp/maps           67.205.112.104
/shared/uesp/skins          67.205.112.104
/shared/phpsessions         10.2.212.30,[...snip...],10.2.212.11
/shared/uesp/filecache      10.2.212.30,[...snip...],10.2.212.11
/shared/uesp/wikiimages     10.2.212.30,[...snip...],10.2.212.11
/shared/eqwiki/filecache    10.2.212.30,[...snip...],10.2.212.11
/shared/eqwiki/wikiimages   10.2.212.30,[...snip...],10.2.212.11
/shared/davewiki/filecache  10.2.212.30,[...snip...],10.2.212.11
/shared/davewiki/wikiimages 10.2.212.30,[...snip...],10.2.212.11

我截取了长长的 IP 列表,但 10.2.212.30 是新客户端。尝试在新客户端上安装 NFS 共享会导致以下结果:

# mount -v 10.2.212.10:/shared/phpsessions /mnt/phpsessions
mount: no type was given - I'll assume nfs because of the colon
mount.nfs: timeout set for Thu Jan 15 18:53:43 2015
mount.nfs: trying text-based options 'vers=4,addr=10.2.212.10,clientaddr=10.2.212.30'
mount.nfs: mount(2): Operation not permitted
mount.nfs: trying text-based options 'addr=10.2.212.10'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: portmap query retrying: RPC: Unable to receive
mount.nfs: prog 100003, trying vers=3, prot=17
mount.nfs: portmap query failed: RPC: Unable to receive - Connection refused
mount.nfs: trying text-based options 'vers=4,addr=10.2.212.10,clientaddr=10.2.212.30'
mount.nfs: mount(2): Operation not permitted
mount.nfs: trying text-based options 'addr=10.2.212.10'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: portmap query retrying: RPC: Unable to receive
mount.nfs: prog 100003, trying vers=3, prot=17
mount.nfs: portmap query failed: RPC: Unable to receive - Connection refused
...

最后几行重复,直到超时。

更新 3:

因此,如果我将端口 111 重定向到客户端正在使用的iptables端口,那么我就可以开始在客户端上工作了。但是,这对挂载问题没有任何作用。我尝试强制 NFS 使用 v2,例如:rpcbindrpcinfo -p localhost

# mount -v -t nfs -o nfsvers=3 10.2.212.10:/shared/phpsessions /mnt/phpsessions

但结果却与上述错误信息相同。事实上,当我在客户端运行时,我得到了:

# rpcinfo -s server
rpcinfo: can't contact rpcbind: : RPC: Unable to receive; errno = Connection refused

这是来自 mount 的相同错误消息。我猜想 CentOS 6 客户端上的 mount 正在尝试使用 CentOS 5 服务器上的“新”rpcbind,而 CentOS 5 服务器正在运行“旧”端口映射,因此失败了。我认为应该可以以某种方式混合 CentOS 版本。

更新 4:

我在客户端上创建了一个测试 NFS 共享,并能够成功将其挂载到服务器上。这似乎符合与 portmap/rpcbind 不匹配有关的理论。客户端可以充当 NFS 服务器,因为 rpcbind (rpc v3/4) 向后兼容 portmap (rpc v2),但 portmap 不向前兼容 rpcbind。

更新 5(可能的解决方案)

仔细查看客户端后,我发现它rpcbind似乎始终位于端口 3421 上(我最初以为它是随机的)。在服务器上,我曾经iptables将端口 3421 转发到端口 111。之后,我能够在客户端上成功安装来自服务器的 NFS 共享。这可能是一个有效的解决方案,因为在将所有服务器升级到 CentOS 6 之前,我几周内只会混合使用 CentOS 5/6 服务器。

除非出现更好的答案,否则我会在几天后回答我自己的问题。

答案1

根本问题是portmap/的端口不匹配rpcbind。在 CentOS 6 上,我rpcbind正在监听端口 3421,而不是像 CentOS 5 中那样监听预期的 111。这导致了两台机器启动和挂载共享的portmap问题。nfs

解决方案是将itpablesCentOS 6 上的端口 111 重定向到端口 3421:

iptables -t nat -I PREROUTING -p tcp --dport 111 -j REDIRECT --to-ports 3421
iptables -t nat -I PREROUTING -p udp --dport 111 -j REDIRECT --to-ports 3421
iptables -t nat -I OUTPUT -p tcp -o lo --dport 111 -j REDIRECT --to-ports 3421
iptables -t nat -I OUTPUT -p udb -o lo --dport 111 -j REDIRECT --to-ports 3421

在 CentOS 5 服务器上做了同样的事情,只是反过来,将端口 3421 重定向到 111。之后,我能够在 CentOS 6 客户端上成功挂载来自 CentOS 5 服务器的 NFS 共享。

为了nfs在 CentOS 6 服务器上完全正常工作,我还必须取消注释所有与端口相关的行以/etc/sysconfig/nfs使用固定端口地址。在此之前,我遇到了lockd服务不响应的间歇性问题。

相关内容