Open Directory の複製が機能せず、slapd.log に「サイズ制限を超えている」と表示される

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 のマスターを作成したときに名前が変更されている可能性があります。ディレクトリ管理者向けの Kerberos の認証情報を入手するには、ターミナルで「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"

関連情報

   

シェルスクリプトによる代替の方法

以下は、このプロセスを自動化できるシェルスクリプトのテキストです。上記の説明にそって、ディレクトリ管理者に「kinit」を実行してから、このスクリプトを実行します。推奨されるテキストエディタについては、こちらの記事を参照してください。

#!/bin/sh
nc=`ldapsearch -x -LLL -b "" -s base namingContexts | awk '/namingContexts/ {print $2}'`
ldapmodify  <<EOF
dn: olcDatabase={1}bdb,cn=config
changetype: modify
add: olcLimits
olcLimits: dn.exact="uid=_ldap_replicator,cn=users,$nc" 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,$nc" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited

EOF
#end of script
公開日: