![CentOS 6 上的 NFS 客户端问题:rpcbind 未监听端口 111](https://linux22.com/image/649733/CentOS%206%20%E4%B8%8A%E7%9A%84%20NFS%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%97%AE%E9%A2%98%EF%BC%9Arpcbind%20%E6%9C%AA%E7%9B%91%E5%90%AC%E7%AB%AF%E5%8F%A3%20111.png)
我正在尝试在新的 CentOS 6.6 服务器上为现有 NFS 服务器设置 NFS 客户端,但遇到了一些无法解决的问题。启动时rpcbind
,nfs
我收到:
# /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,例如:rpcbind
rpcinfo -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
解决方案是将itpables
CentOS 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
服务不响应的间歇性问题。