Centos6

CentOS 6 上的 NFS 客戶端問題:rpcbind 未偵聽埠 111

  • January 20, 2015

我正在嘗試在新的 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(或本地主機)返回錯誤:

# 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 伺服器上檢查(埠映射在埠 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:

因此,如果我使用iptables將埠 111 重定向到rpcbind客戶端上正在使用的埠,那麼我可以開始rpcinfo -p localhost在客戶端上工作。但是,這對安裝問題沒有任何作用。我嘗試強制 NFS 使用 v2,例如:

# 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 客戶端上的掛載正試圖在執行“舊”埠映射的 CentOS 5 伺服器上使用“新”rpcbind,所以它失敗了。我認為應該可以以某種方式混合這樣的 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 伺服器。

除非出現更好的答案,否則我會在幾天內回答我自己的問題。

根本問題原來是portmap/的埠不匹配rpcbind。在 CentOS 6rpcbind上,我正在偵聽埠 3421,而不是像portmap在 CentOS 5 中那樣預期的 111。這導致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 5 伺服器成功地在 CentOS 6 客戶端上掛載 NFS 共享。

為了nfs在 CentOS 6 伺服器上完全工作,我還必須取消註釋所有與埠相關的行/etc/sysconfig/nfs以使用固定埠地址。在這樣做之前,我遇到了lockd服務沒有響應的間歇性問題。

引用自:https://serverfault.com/questions/659858