在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 �Cp 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就是应用和端口的婚姻介绍人,双方成事了以后,媒婆就没用了。