在linux上面做NFS、NIS或者是httpd等都需要安裝portmap,但是安裝完portmap之後不能啓動服務。
啓動報錯信息如下:
#service portmap status
portmap dead but subsys locked,翻譯爲portmap進程死掉,系統鎖定。
#service portmap stop
#service portmap start
一切的方法全部用到了,包括百度到的刪除/var/lock/subsys/下的portmap都無效,還是同樣的錯誤信息。無賴之下看日誌文件
/var/log/messages
搜索了一下關於portmap的,顯示如下信息:
Jul 16 16:49:34 portmap[3964]: cannot bind udp: Addressalready in use
Jul 16 16:50:04 portmap[4100]: cannot bind udp: Addressalready in use
Jul 16 16:50:13 portmap[4154]: cannot bind udp: Addressalready in use
字面意思是地址被佔用,初步估計是端口被佔用了,所以不能啓動!
#rpcinfo –p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100007 2 udp 953 ypbind
100007 1 udp 953 ypbind
100007 2 tcp 956 ypbind
100007 1 tcp 956 ypbind
看到portmap的啓動端口是111,那麼我們再查看一下到底是哪支程序佔用了111端口,導致端口衝突使得portmap不能啓動。
# lsof -i:111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODENAME
rpcbind 4568 rpc 20u IPv4 25958 0t0 UDP *:sunrpc
rpcbind 4568 rpc 22u IPv4 25963 0t0 TCP *:sunrpc (LISTEN)
rpcbind 4568 rpc 23u IPv6 25965 0t0 UDP *:sunrpc
rpcbind 4568 rpc 25u IPv6 25968 0t0 TCP *:sunrpc (LISTEN)
看到了吧是rpcbind這個罪魁禍首,趕快行動吧!直接kill嗎?NO,仁慈點吧(kill之後估計會有更大的麻煩,爲了這個折騰了N久,重裝過N次的系統,真想直接kill了)。
#service rpcbind stop 直接停止服務
#service portmap start
#service portmap status
portmap (pid 20863) is running... 服務真的啓動了耶
#service rpcbind start 再次啓動rpcbind服務
#service rpcbind status
rpcbind (pid 20956) is running... 兩支服務都啓動了,並且互不相干了。
其實rpcbind和portmap是同樣的功能。在centos5及以下版本的時候是portmap到centos6的時候用rpcbind取代了portmap。難怪不的啓動portmap的時候報錯端口被佔用,並且就是rpcbind佔用的。如果你是centos6系統的話沒必要裝portmap了。
Portmap主要是做端口映射服務器,將RPC程序號轉換爲DARPA的協議端口號。在使用RPC調用時它必須運行。
portmap進程的主要功能是把RPC程序號轉化爲Internet的端口號。
當一個RPC服務器啓動時,會選擇一個空閒的端口號並在上面監聽(每次啓動後的端口號各不相同),同時它作爲一個可用的服務會在portmap進程註冊。一個RPC服務器對應惟一一個RPC程序號,RPC服務器告訴portmap進程它在哪個端口號上監聽連接請求和爲哪個RPC程序號提供服務。經過這個過程,portmap進程就知道了每一個已註冊的RPC服務器所用的Internet端口號,而且還知道哪個程序號在這個端口上是可用的。portmap進程維護着一張RPC程序號到Internet端口號之間的映射表,它的字段包括程序號、版本號、所用協議、端口號和服務名,portmap進程通過這張映射表來提供程序號-端口號之間的轉化功能。
如果portmap進程停止了運行或異常終止,那麼該系統上的所有RPC服務器必須重新啓動。首先停止NFS服務器上的所有NFS服務進程,然後啓動portmap進程,再啓動服務器上的NFS進程。
但portmap只在第一次建立連接的時候起作用,幫助網絡應用程序找到正確的通訊端口,但是一旦這個雙方正確連接,端口和應用就綁定,portmap也就不起作用了。但對其他任何第一次需要找到端口建立通訊的應用仍然有用。
簡單的說,portmap就是應用和端口的婚姻介紹人,雙方成事了以後,媒婆就沒用了。