我们使用LDAP作为我们drupal站点的后端用户数据库(drupal从/读取并写入)。 LDAP已经运行好几个星期,但由于某些原因,它只是今天停止运行。 我正在使用以下命令查看syslog:
$ grep -i "error\|panic\|unable\|warning\|fatal\|issue" /var/log/syslog | grep slapd
出现的第一个错误是这些错误:
Sep 20 09:59:38 server slapd[18158]: bdb(dc=example,dc=org): PANIC: fatal region error detected; run recovery Sep 20 09:59:38 server slapd[18158]: conn=1010 op=7 RESULT tag=107 err=80 text=internal error
问题1:有什么方法可以find更多fatal region error ? (也许drupal的ldap模块正在发布openldap不喜欢的命令)。
根据错误消息的build议,我运行了恢复工具:
$ sudo /etc/init.d/slapd stop $ sudo /usr/bin/db4.7_recover -v -h /var/lib/ldap/ Finding last valid log LSN: file: 3916 offset 298418 Recovery starting from [3916][298273] Recovery complete at Tue Sep 20 12:17:42 2011 Maximum transaction ID 80000017 Recovery checkpoint [3916][298418] $ sudo /etc/init.d/slapd start
我在syslog中看到的是这样的:
Sep 20 12:17:47 server slapd[10286]: @(#) $OpenLDAP: slapd 2.4.21 (Jun 2 2011 19:36:19) $#012#011buildd@allspice:/build/buildd/openldap-2.4.21/debian/build/servers/slapd47 Sep 20 12:17:47 server slapd[10286]: PROXIED attributeDescription "DC" inserted. Sep 20 12:17:48 server slapd[10287]: bdb(dc=example,dc=org): /var/lib/ldap/log.0000003916: log file unreadable: Permission denied <----- HERE Sep 20 12:17:48 server slapd[10287]: bdb(dc=example,dc=org): PANIC: Permission denied Sep 20 12:17:48 server slapd[10287]: bdb(dc=example,dc=org): Invalid log file: log.0000003916: DB_RUNRECOVERY: Fatal error, run database recovery Sep 20 12:17:48 server slapd[10287]: bdb(dc=example,dc=org): PANIC: DB_RUNRECOVERY: Fatal error, run database recovery
发生的情况是,其中一个日志文件不能被slapd读取,因为所有者已经从openldap更改为root并且权限被设置为600:
/var/lib/ldap/log.0000003916: log file unreadable: Permission denied $ sudo ls -lh /var/lib/ldap/ -rw------- 1 openldap openldap 10M 2011-09-09 11:09 log.0000003914 -rw------- 1 openldap openldap 10M 2011-09-20 09:54 log.0000003915 -rw------- 1 root root 10M 2011-09-20 12:10 log.0000003916 <----- HERE -rwxr-xr-x 1 openldap openldap 20M 2011-09-20 12:51 mail.bdb -rwxr-xr-x 1 openldap openldap 1.7M 2011-09-20 12:51 objectClass.bdb -rwxr-xr-x 1 openldap openldap 12M 2011-09-20 12:51 sn.bdb -rwxr-xr-x 1 openldap openldap 1.4M 2011-09-20 12:51 uid.bdb
我通过将所有者从根目录更改为openldap来解决此问题:
$ sudo chown openldap:openldap /var/lib/ldap/log.0000003916
然后slapd正常启动:
Sep 20 13:01:40 evergreen slapd[18901]: @(#) $OpenLDAP: slapd 2.4.21 (Jun 2 2011 19:36:19) $#012#011buildd@allspice:/build/buildd/openldap-2.4.21/debian/build/servers/slapd Sep 20 13:01:40 evergreen slapd[18901]: PROXIED attributeDescription "DC" inserted. Sep 20 13:01:41 evergreen slapd[18902]: slapd starting
在运行db4.7_recover之前,我没有检查该日志文件的权限,所以我不知道将所有者设置为root。
问题2:build议运行db4.7_recover作为openldap,以避免日志文件的许可问题(例如:sudo -u openldap /usr/bin/db4.7_recover -v -h / var / lib / ldap)?
问题3:作为一个更通用的问题:有没有一种方法来监视哪个进程上次更改文件的权限? (这样,如果问题不是与运行db4.7_recover作为sudo我可以找出它是什么)。
问题4:您是否有更多的build议来解决这类LDAP问题?
附加信息:
服务器= Ubuntu的10.04
-openldap = https://help.ubuntu.com/community/OpenLDAPServer
在繁忙的服务器上,我发现OpenLDAP在默认的1024个最大文件句柄上有问题。 在/etc/security/limits.conf中为openldap用户增加这个限制,看看是否解决了这个问题。 通常如果这就是slapd会抱怨logging日志的原因。
在某些情况下,slapd也会随着时间stream逝而泄漏内存,结果Linux内核OOM将会终止它。 如果发生这种情况,dmesg应该告诉你一个故事,如何失忆杀手勇敢地杀死slapd。
Q2:只要你在启动slapd之前修复权限就不要紧。
问题3:Linux审计子系统可以帮助你。 阅读man auditd和auditctl; 回答这是超出你的原始Q的范围:)
Q4:将slapd日志级别提高到最大值,读取日志。 谷歌。