Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2060214
  • 博文数量: 178
  • 博客积分: 2076
  • 博客等级: 大尉
  • 技术积分: 2800
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-10 10:50
文章分类

全部博文(178)

文章存档

2010年(4)

2009年(13)

2008年(161)

我的朋友

分类: LINUX

2008-06-05 00:16:47

py
安装OpenLDAP的时候make test阶段出现Waiting 5 seconds for slapd to start...

Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...

三年前刚接触openldap的时候第一个遇到的就是这个问题,解决了N次,但很多次解决的办法都不相同。这些年来国外国内问这个问题的人很多,大概的状况如下:
帖子甲解决的办法是“A”
帖子乙解决的办法是“B”
帖子丙解决的办法是“C”
......
的确,方法A,B,C都分别解决了同一个症状。但A,B,C都不是这个问题的唯一可能的原因,但大家都各执一词,这就如同盲人摸象。不如这次就总结一下,看看他们还可能是因为什么。

首先,make test这个步骤是很重要的。
make test建议还是要做的,在编译进openldap的选项很多的情况下跑完所有的测试用例的确是要花费一些时间。半年前,在我认为自己再不会遇到这个烦人的问题的时候,我就“自信的”没有进行make test结果...出了严重的问题。我那次是IA64+bdb+2.3.X的环境,加入了很多编译参数。slapd启动正常,但查询的时候出了问题,问题的定位花了一些时间,耽误了公司正常的计划。

其次,分析一下这第一个test case的作用。如果看看测试代码不难知道答案。当然,仔细看输出的结果也能知道的很清楚了。首先就是要测试BDB的连接状态(如果在./configure的时候把bdb的选项disable掉就不会有这么test case了),方法很简单,启动slapd进程,用ldap_bind函数来看看是不是能bind成功。如果失败的时候结果就很可能如下:
>>>>> Starting test000-rootdse ...
running defines.sh
Starting slapd on TCP/IP port 9011...
Using ldapsearch to retrieve the root DSE...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
Waiting 5 seconds for slapd to start...
./scripts/test000-rootdse: line 66: kill: (30361) - No such process
ldap_bind: Can't contact LDAP server (-1)
>>>>> Test failed
>>>>> ./scripts/test000-rootdse failed (exit 1)
make[2]: *** [bdb-yes] Error 1
看看提示不难得出结论,slapd进程根本没能启动,所以在ldap_bind的时候当然就会Can't contact LDAP server了。
一般来说,一个linux下的软件,configure,make都成功了,很难想像make test的第一个就过不去。我总结出来的原因只有一个:
动态连接库出问题了,或是没有设置正确,导致运行时的库文件没能找到,所以要检查环境变量.LD_LIBRARY_PATH中一定要有系统的以及bdb的环境库文件位置.
解释:上面说的这个原因是我的经验,也是openldap开发人员给出的最主要的原因。我多次遇到这个问题,虽然解决的办法不同,但归根结底都是由于连接库的问题。大家不要把这个问题想像成“只要把LD_LIBRARY_PATH设置好了就一定不会出这个问题了”,导致这个问题很多时候都是系统里已经存在一个bdb版本,之后后装了一个bdb,结果就出这样的问题了。如果LD_LIBRARY_PATH变量中同时有新旧两个版本的库文件,make test的时候就是很容易出这个问题。为什么说是“很容易”呢?呵呵,因为有些时候即使LD_LIBRARY_PATH变量里有两个bdb的库文件,make test照样没出问题。这个就要看具体情况了,要看linux系统的很多的设置,实在不能一概而论,这也是后来我不再回答这个问题的原因。对linux系统熟一些的人,最终一定能work-around过去,但如果对linux系统本身就不是很熟,设置了LD_LIBRARY_PATH也没解决这个问题那别人也很难提供什么有价值的线索。很可能是你对linux系统做的一些别人想不到的设置改变了你的环境信息,而你自己又不知道。这样别人真是爱莫能助。

费了半天话,还是说说解决方案吧。
我觉得保证系统中只有一个BDB版本是一个很好的方法,以前用Gentoo的时候,系统中就是只有一个bdb,编译openldap从没出过问题。另外,建议吧bdb装在默认的地方,即/usr/local/BerkeleyDB.4.X/下,这样以后升级bdb的时候也方便。另外LD_LIBRARY_PATH变量一定要在configure之前就设置好,并且包含bdb的lib目录位置。configure的时候还要记得env CPPFLAGS="-I/usr/local/BerkeleyDB.4.x/include" LDFLAGS="-L/usr/local/BerkeleyDB.4.x/lib"
如果干净的系统,并且只有一个bdb(拆过,没拆干净的不算),那么绝大多数情况是不会出现问题的。为什么是“绝大多数”?因为linux下变数很大,具体问题具体分析才是一个不变的准则。

那么如果系统中默认在/usr/lib中就有bdb了,但你又不想用系统自带的bdb,一定要用自己编译的。那就要正确设置环境变量,把环境弄的复杂了,就需要你有更好的在linux下分析问题解决问题的能力。经验是积累出来的,在中国,很多学linux相关技术的人都是急,错误一贴,马上就要大家出solution,试过二楼和三楼的“妙计”没奏效就开始“自己顶”,顶来顶去,有那工夫分析分析错误提示,找找“蛛丝马迹”,再多试几次,也许问题就解决了。(事实上我的很多linux就是这么解决的)
我没有想指责谁,我曾经也有过这样的时候,但最终发现学linux学ldap,重要的并不是解决某个具体的问题,而是分析问题解决问题的能力,培养的是一个好的习惯。

话又扯远了,估计要挨板砖了...

看看大家有没有这个问题的疑难杂症,贴出来和大家分享一下,我尽量给大家解决。
最后不行就把root账号发给我,我登上去解决,当然,这是下下策。(如果你很着急,又不是生产环境,且相信本人,那我愿意一试)

2006-3-16 09:18 antimatter
版主真是负责啊!佩服!

2006-3-16 11:14 yj11
是啊,版主确实非常负责.支持!!!!

2006-3-17 20:45 myvm
在redhat as3下,搞了一个下午的openldap,还是出现版主提到的错误,正想放弃,但看了版主这段话,小弟
很受鼓舞,决心要好好琢磨琢磨.

2006-3-18 13:25 py
我在RedHat AS3/4 i386/IA64;RedHat8;Fedora3/4;Gentoo;Solaris8/9/10(sparc)都装过openldap,除了gentoo以外均遇到过上面的那个问题,但最后都解决了.
最近一次遇到这个问题是在RedHat8上(公司非要用这个系统),非了很大劲,但所有的努力都是为了躲避老版本的bdb,而让openldap的安装程序能只找到新版本的bdb,这是多么单纯的一个目的:-)

2006-3-18 16:12 myvm
问题已经解决,还是db版本的问题,彻底删除掉系统自带的bdb就可以了

2007-12-14 14:18 ffb
谢谢楼主
阅读(964) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~