
좋은 아침이에요;
LDAP 데이터를 복제하기 위해 LDAP 프록시 서버를 설정한 후 다음 메시지가 계속 나타납니다.
52a0b5ca send_ldap_result: conn=-1 op=0 p=3
52a0b5ca send_ldap_result: err=32 match="" text=""
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 배포판을 포함한 소스에서 설치됩니다. sourceserver는 데이터를 가져오고 destserver와 동기화하려는 시스템입니다(아래 구성 참조).
따라서 제가 프록시를 실행해 본 두 컴퓨터의 유일한 공통점은 바로 저입니다(으!). 프록시를 거꾸로 설정한 것이 문제입니까? 아마도 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
마지막으로 물에 진흙을 던져 보겠습니다.
나는 nm을 사용했다:
[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에서는 "-rpath" 대신 "-R"을 사용해야 할 수도 있습니다( gcc
GNU 링커가 아닌 Sun 링커와 함께 사용하는 경우).
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
지연 바인딩을 끄는 내보내기를 통해 중단할 수 있습니다. 그런 다음 start 를 시작하십시오 slapd
. 그러나 확률은 다른 기호로 인해 중단될 수 있습니다.)
현재 가장 간단한 옵션은 정적 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
대한 링크 이므로 필요할 때 모든 기호를 로드할 수 있습니다( 디스크 용량도 약 15% 더 작아집니다). 저는 YMMV를 사용하여 LDAP 서버를 운영하지 않았습니다. 배포판에서 사용하는 유사하거나 대체 솔루션이 있어야 합니다.libldap_r.so
.a
slapd
답변2
이것은 구성 문제가 아니며 오류는 분명하며 openldap이 /usr/libexec/openldap/back_ldap-2.4.so.2 라이브러리에서 존재하지 않는 함수를 찾고 있음을 알려줍니다.
Redhat 5에서 표준 LDAP를 rpm 형식으로 사용하지 않는 이유는 무엇입니까?