
早安;
在設定 LDAP 代理伺服器來複製 LDAP 資料後,我不斷收到以下訊息:
52a0b5ca send_ldap_結果:conn=-1 op=0 p=3
52a0b5ca send_ldap_result: err=32 匹配 = "" 文字 = ""
52a0b5ca ==> ldap_back_add("dc=basecorp,dc=net")
52a0b5ca =>ldap_back_getconn:conn 0x7f40ea0 取得 refcnt=1。
/usr/libexec/slapd:符號查找錯誤:/usr/libexec/openldap/back_ldap-2.4.so.2:未定義符號:ldap_add_ext
這是在 Solaris 10 x86 主機和 RedHat 5.5 主機上使用 OpenLDAP 2.4.37 的情況。兩者都是從來源安裝的,包括最新的 BDB 發行版。來源伺服器是我希望從中提取資料並同步到目標伺服器的機器(請參閱下面的配置)。
所以,我嘗試運行代理的兩台機器唯一的共同點就是我(呃!)。是我向後設定代理的問題嗎?也許我不被允許在 LDAP 後端添加條目?希望你們中的一個人可以檢查我下面的配置並回答我的問題以及其他許多問題。
我的代理 slapd.conf:
database ldap
hidden on
suffix "dc=basecorp,dc=net"
rootdn "cn=Manager"
uri ldaps://destserver01.dest.net:636
lastmod on
acl-bind bindmethod=simple
binddn="cn=Manager"
credentials=mypassword
syncrepl rid=500
provider=ldaps://sourceserver01.dest.net:636
binddn="cn=Manager"
bindmethod=simple
credentials=mypassword
searchbase="dc=basecorp,dc=net"
filter="(objectClass=*)"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="5 5 300 5"
overlay syncprov
最後,請容許我把泥巴丟進水裡:
我用奈米:
[root@buildtest01 ~]# nm /usr/libexec/openldap/back_ldap-2.4.so.2 | grep ldap_add
U ldap_add_ext
還有我遺失的符號。什!
答案1
正如 @c4f4t0r 所猜測的,你(還)沒有遇到配置問題——你遇到了建構相關問題。
長話短說:不要使用動態後端,除非您擺弄建置過程,否則它們大多會被破壞。跳到下面的更新以了解可怕的細節...
您的預設系統位置中可能有舊的或非 OpenLDAP LDAP 庫。我不相信該 configure
腳本足夠聰明來測試這種情況,或者建置過程足夠強大來處理它。例如,如果libldap.so
在系統庫位置中找到舊的,則libldap.so
在運行時將優先使用它,而不是正確的和新安裝的。對抗 ldd
應該要back_ldap-2.4.so
表明這一點。
您可以透過將相關目錄新增至環境變數來修復此問題(無需重建),LD_LIBRARY_PATH
以便先搜尋包含最新 OpenLDAP 庫的目錄(確保export
該變數)。
或者,在建置時修復它(最好),透過使用設定的環境變數configure
運行LDFLAGS
RPATH
這會將庫搜尋路徑硬編碼到您建立的二進位檔案中。
您還沒有給出您的configure
選項或安裝路徑等。
export LDFLAGS="-L/usr/local/ssl/lib -Wl,-rpath,/usr/local/ssl/lib"
如果我想使用非系統 OpenSSL,則同樣適用於使用非系統版本的 BerkeleyDB。在 Solaris 上,您可能需要使用“-R”而不是“-rpath”(如果您使用的gcc
是 Sun 連結器而不是 GNU 連結器):
export LDFLAGS="-L/usr/local/ssl/lib -R/usr/local/ssl/lib"
在您的情況下,您可能只需要設定 rpath (-Wl,-rpath
或-R
),而不是-L
(儘管我建議在 OpenSSL 和 BerkeleyDB 的情況下同時使用兩者)。
更新您正在建置:
/configure --prefix=/usr --sysconfdir=/etc --enable-slapd --enable-crypt \
--enable-modules --enable-bdb=mod --enable-hdb=mod --enable-ldap=yes \
--enable-perl=mod --enable-overlays=mod --with-tls --with-gnu-ld
筆記 ” --enable-ldap=yes
”,這會將 LDAP 後端靜態建置到slapd
,它不會建立動態可載入back_ldap.so
(即--enable-ldap=mod
)。一種可能性是您有一個back_ldap.so
正在嘗試加載到伺服器中的雜散文件,以及一個不需要的moduleload back_ldap
.但是,slapd
當存在同名的靜態模組時,將不允許您載入動態模組,因此您的二slapd
進位檔案看起來不像您所描述的那樣。
運行slapd -VVV
以確認靜態後端。
假設back_ldap
是靜態的,您應該能夠解決這個問題,並刪除任何錯誤moduleload
和過時的內容.so
以達到良好的效果。
我有一個強的懷疑這裡潛伏著一些 libtool、依賴性錯誤或連結器問題。我可以用動態 back_ldap 重現這一點。ldap_add_ext
確實是一個未解析的符號,這不一定是問題(由於dlopen()
模組的明確),但該符號不是由 導出的slapd
。它是由 匯出libldap.so
,但這不是 的依賴項back_ldap.so
,並且沒有其他原因導致libldap
載入。 (這也意味著我上面給出的建議無法解決問題,因為它不僅僅是庫路徑問題那麼簡單。)
發生的情況(即您看到的錯誤)是符號ldap_add_ext
在需要時才被解析(“惰性”綁定)。當您嘗試新增 LDAP 物件時,當然最終需要它。然後輪子就脫落了。 (如果你有這種衝動,你可以在開始時通過導出來打破它,LD_BIND_NOW=1
這會關閉惰性綁定,然後開始slapd
,儘管不同的符號可能會觸發它。)
現在最簡單的選擇是使用 static back_ldap
( --enable-ldap=yes
,也許make clean && make depend && make install
可以確定它slapd
是否正確建構)。一個不太簡單的選擇是使用它來解決依賴性問題,並祈禱它不會產生一些奇怪的副作用。LD_PRELOAD=/usr/lib/libldap.so
LD_PRELOAD=/usr/lib/libldap_r.so
好的,這封古老的電子郵件涵蓋了這個問題:http://www.openldap.org/lists/openldap-software/200211/msg00469.html
slapd
預設與靜態鏈接libldap_r.a
,這限制了連結時已知的可用符號。由於動態模組是在運行時透過dlopen()
連結器載入的,因此無法了解其需求(符號/庫)。
人們可能會合理地得出這樣的結論:(某些)後端的動態建構已經被破壞了一段時間了。
因此,要么不使用動態後端(推薦),要么使用以下內容捏造構建(不那麼推薦):
make depend && make
rm servers/slapd/slapd
LTSTATIC="" make -e # alternative to editing the Makefile
make install
此連結slapd
針對libldap_r.so
您剛剛建立的而不是.a
,因此可以在需要時載入所有符號(這也使slapd
磁碟上的大小減少了約 15%)。我還沒有用這個運行可操作的 LDAP 伺服器,YMMV。發行版必須使用一些類似或替代的解決方案...
答案2
這不是配置問題,錯誤很明顯,告訴您,openldap 正在尋找 /usr/libexec/openldap/back_ldap-2.4.so.2 庫中不存在的函數。
在redhat 5上,為什麼不使用rpm格式的標準ldap?