Open Directory 复制可能无法正常工作;slapd.log 中会出现“Size Limit exceeded”(大小超出上限)

Open Directory 复制可能无法正常工作;发生这种情况时,/var/log/slapd.log 中会出现以下条目:

slapd[209]: do_syncrep2: rid=001 LDAP_RES_SEARCH_RESULT (4) Size limit exceeded slapd[209]: do_syncrep2: rid=001 (4) Size limit exceeded

如果 Open Directory 服务器已经长时间停机,或者如果在 LDAP 数据存储中的对象数量超过 11000 个时创建副本,就会出现这种情况。11000 是搜索中可以返回的最大对象数量。

_ldap_replicator 用户可以覆盖这个搜索限制,方法是更改每台 Open Directory 服务器上的 LDAP 服务器配置。这涉及到以目录管理员身份进行认证以及在“终端”中运行部分 LDAP 修改命令。另外还需要知道 LDAP 服务器的搜索基准(也称为命名上下文)。

可以通过以下步骤来完成这项操作。

首先,查找 LDAP 服务器的搜索基准

查找 LDAP 服务器的搜索基准。这通常是服务器的完全限定域名,其中每个标签前面都会加上 dc=,并且句点已更改为逗号。

例如,对于主机名为 server.example.com 的服务器,默认的搜索基准为“dc=server,dc=example,dc=com”。可以通过使用以下“终端”命令查询 LDAP 服务器本身来验证搜索基准:

ldapsearch -x -LLL -b “” -s base namingContexts

找到包含 namingContexts 的行,然后冒号后面就是搜索基准,如下面的输出示例所示。

dn: namingContexts: dc=server,dc=example,dc=com

接着,获取目录管理员的 kerberos 凭证

这个用户的默认名称是 diradmin,但在创建 Open Directory 主服务器时可以已经更改了这个名称。在“终端”中使用 kinit 命令即可完成这项操作。运行以下命令,并根据需要使用正确的目录管理员名称代替 diradmin,然后在系统提示输入密码时输入密码。这个命令没有输出。

kinit diradmin

然后,以交互式模式在“终端”中使用 ldapmodify 进行更改。只需在“终端”中执行以下命令:

ldapmodify

注:这时将会输出一些 SASL 信息并等待输入。成功后,SASL 输出应如下所示:

SASL/GSSAPI authentication started SASL username: diradmin@REALM SASL SSF: 56 SASL data security layer installed.

修改配置

最后,对配置进行修改。这要求在“终端”窗口中输入以下所有文本,作为 ldapmodify 命令的输入。必须使用搜索基准替换下面的 [search base]。括号也需要移除。

dn: olcDatabase={1}bdb,cn=config changetype: modify add: olcLimits olcLimits: dn.exact="uid=_ldap_replicator,cn=users,[search base]" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited dn: olcDatabase={2}bdb,cn=config changetype: modify add: olcLimits olcLimits: dn.exact="uid=_ldap_replicator,cn=users,[search base]" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited

现在,按下 Control-D。

如果一切都成功,将会显示如下信息。

modifying entry "olcDatabase={1}bdb,cn=config" modifying entry "olcDatabase={2}bdb,cn=config"

进一步了解

Shell 备选脚本

以下是可用于自动完成这个过程的 Shell 脚本文本。只需使用 kinit 命令对目录管理员进行认证并运行这个脚本即可。请参阅这篇文章以了解文本编辑器建议。

#! /bin/sh nc=`ldapsearch -x -LLL -b "" -s base namingContexts | awk '/namingContexts/ {print $2}'` ldapmodify <

本文档可能会随着信息增多而更新。

发布日期: