При запуске slapd в окружение программы (посредством файла /etc/chroot.d/ldap.lib) не копируется библиотека libmysqlclient.so.15, которая требуется для работы библиотеки libsql.so из пакета sasl2. Ошибка скрытая, так как если в окружении уже лежит хоть какая-то версия библиотеки libmysqlclient.so.15, то slapd запускается без особых проблем, зато хорошо проявляется после установки системы с нуля или при обновлении с достаточно старой версии openldap и sasl2, что может сделать невозможным вход в систему, работу служб, демонов, если они пользуются услугами slapd.
Поправлю... Хотя с системой чрутизации не все так так хорошо, должна быть внешняя ручка для sasl2, где в зависимости от пользовательских настроек будет формироваться список рабочих методов, а на основании этого уже будет выполнять копирование библиотек в чрут.
Интересно, а где-нить существуют реализаций генерации chroot'а "на лету"? Или генераторы скрипта для генерации chroot'а, в зависимости от имеющегося окружения... :)
Для простого чрута можно и самому написать и в скрипты FreeBSD посмотреть, а вот с sasl и другими подобными неявными зависимостями - проблема, ибо список требуемого для каждой конкретной инсталяции будет заметно отличаться, а если тянуть в чрут всё - лучше вообще от чрута отказаться, как поступили мантейнеры postgreSQL
(В ответ на комментарий №2) > Интересно, а где-нить существуют реализаций генерации chroot'а "на лету"? hasher :)
(В ответ на комментарий №4) > (В ответ на комментарий №2) > > Интересно, а где-нить существуют реализаций генерации chroot'а "на лету"? > > hasher :) Но в случае этой баги - он не помощник :)
(В ответ на комментарий №3) > а если тянуть в чрут всё - лучше вообще от чрута отказаться, как поступили > мантейнеры postgreSQL Похоже, к этому всё и идёт. Да и на грабли вида "две разные версии libdb в chroot'е" я уже один раз наступал :(
Хм, есть предложение, правда, довольно громоздкое: 1) в каждый пакет с библиотеками выкладывать исполняемый файл /etc/chroot.d/libs/<имя библиотеки>, который проверяет, вызывается ли он повторно или нет. Если в первый раз, то копирует свои библиотеки в нужный каталог chroot и вызывает скрипты из /etc/chroot.d/libs для своих прямых зависимостей, после выполнения выставляет глобальный флаг, что выполнялся (чтобы избежать зацикливания). 2) для формирования chroot-окружения достаточно вызвать команды для копирования библиотек по прямым зависимостям, те скрипты вызовут выполнение дальше. Получится что-то вроде #include в gcc. Прямо хоть пиши такие скрипты в виде header'ов, превращай их скрипты через gcc -E и выполняй (ну или что-то в этом роде). Тогда все зависимости соберутся. Пример: в создании chroot-серевера slapd (/etc/chroot.d/ldap.lib) вызвать: Copy_Libs ldap <chroot-каталог> По этой команде запустится скрипт /etc/chroot.d/libs/ldap, в котором скопируются собственно библиотеки ldap в нужное место chroot-каталога и будет команда Copy_libs sasl2 <chroot-каталог> Эта команда вызовет /etc/chroot.d/libs/sasl2, которая скопирует файлы sasl2 и выполнит команду Copy_Libs mysqlclient <chroot-каталог> Тогда если изменятся требования sasl2 или то-то ещё далее, то не потребуется пересборка и поиск зависимостей для slapd, так как sasl2 сам знает, что ему нужно. А если изменится структура, то пересборка slapd всё равно потребуется. Большой минус в том, что мантейнеры библиотек, используемых в формировании chroot, должны будут отслеживать файлы /etc/chroot.d/libs/<имя библиотеки>.
Теперь обнаружил, что ещё и libpq.so.5 не оказывается в окружении slapd. Опять же по причине libsql.so из libsasl2. С теми же симптомами.
На основе патчей от Raorn'а (см. #19716) родились вот такие "костыли" для копирования библиотек внутрь openldap-chroot'а: ------- # copy libs, required by SLAPD slapd_lib_list=`ldd /usr/sbin/slapd | grep -vE 'ld-linux|^/' | awk '{print $3}' | sort -u ` for libfile in $slapd_lib_list ; do libdir="${libfile%/*}" CopyLibs $force -l$libfile -d ".$libdir" dep2_libs=`ldd $libfile | grep -vE 'ld-linux|^/' | awk '{print $3}'` dep2_total="$dep2_total $dep2_libs" done dep2_list=`echo $dep2_total | sed 's| |\n|g' | sort -u` #second level of dependencies for f in $dep2_list ; do CopyLibs $force -l$libfile -d ".$libdir" done ------- То же самое проделывается для всех модулей OpenLDAP (backend и overlays) и библиотек и модулей SALS2. В первом приближении, всё работает так, как задумывалось: chroot формируется на основе существующего окружения в хост-системе, а не на основе статического списка библиотек (см. существующий /etc/chroot.d/openldap.lib). Использование CopyLibs без ключа -l не устраивает, т.к. копирется не всё и не в нужные каталоги. Возможно кто-то, лучше владеющий shell-програмированием, сможет реализовать идею в виде дополнения к CopyLibs из /etc/chroot.d/functions или в виде отдельной функции.
(In reply to comment #9) > На основе патчей от Raorn'а (см. #19716) родились вот такие "костыли" для > копирования библиотек внутрь openldap-chroot'а: > > ------- > # copy libs, required by SLAPD > slapd_lib_list=`ldd /usr/sbin/slapd | grep -vE 'ld-linux|^/' | awk '{print $3}' > | sort -u ` > for libfile in $slapd_lib_list ; do > libdir="${libfile%/*}" > CopyLibs $force -l$libfile -d ".$libdir" > > dep2_libs=`ldd $libfile | grep -vE 'ld-linux|^/' | awk '{print $3}'` > dep2_total="$dep2_total $dep2_libs" > done > > dep2_list=`echo $dep2_total | sed 's| |\n|g' | sort -u` > #second level of dependencies > for f in $dep2_list ; do > CopyLibs $force -l$libfile -d ".$libdir" > done > ------- > > То же самое проделывается для всех модулей OpenLDAP (backend и overlays) и > библиотек и модулей SALS2. В первом приближении, всё работает так, как > задумывалось: chroot формируется на основе существующего окружения в > хост-системе, а не на основе статического списка библиотек (см. существующий > /etc/chroot.d/openldap.lib). > > Использование CopyLibs без ключа -l не устраивает, т.к. копирется не всё и не в > нужные каталоги. Возможно кто-то, лучше владеющий shell-програмированием, > сможет реализовать идею в виде дополнения к CopyLibs из /etc/chroot.d/functions > или в виде отдельной функции. #!/bin/bash -efu _list= slapd='/usr/sbin/slapd' slapd_conf='/etc/openldap/slapd.conf' create_list() { ldd "$@" 2>/dev/null |sed -r -ne 's/^.+=>[[:blank:]]([^[:blank:]]+)[[:blank:]].+/\1/gp'|tr ' ' '\n'|sort -u } create_modules_list() { modulepath=`sed -r -ne 's|^modulepath[[:blank:]]+(.+)$|\1|p' $slapd_conf` moduleload=`sed -r -ne "s|^moduleload[[:blank:]]+(.+).la$|$modulepath/\1.so|pg" $slapd_conf` echo "$moduleload" } _list=$(create_list $slapd) while : do flag=0 for i in $(create_list "$_list") $(create_modules_list) do echo "$_list" | tr ' ' '\n' | grep -q "^$i$" || { flag=1 ; _list="$_list $i" ; } done [ $flag -eq 0 ] && { echo "$_list" | tr ' ' '\n' ; exit 0 ; } done Возвращает список всех библиотек, необходимы slapd и подключенным модулям. Это шаблон, улучшать есть чего. )
(In reply to comment #10) > (In reply to comment #9) > > На основе патчей от Raorn'а (см. #19716) родились вот такие "костыли" для > > копирования библиотек внутрь openldap-chroot'а: > > _list= slapd='/usr/sbin/slapd' slapd_conf='/etc/openldap/slapd.conf' _tr() { tr ' ' '\n' } create_list() { ldd $@ 2>/dev/null |sed -r -ne 's/^.+=>[[:blank:]]([^[:blank:]]+)[[:blank:]].+/\1/gp'|_tr|sort -u } create_modules_list() { modulepath=`sed -r -ne 's|^modulepath[[:blank:]]+(.+)$|\1|p' $slapd_conf` moduleload=`sed -r -ne "s|^moduleload[[:blank:]]+(.+).la$|$modulepath/\1.so|pg" $slapd_conf` echo $moduleload | _tr } _list=$(create_list $slapd) while : do flag=0 for i in $(create_list "$_list" ; create_modules_list) do echo "$_list" | _tr | grep -q "^$i$" || { flag=1 ; _list="$_list $i" ; } done [ $flag -eq 0 ] && { echo "$_list" | _tr ; exit 0 ; } done
Created attachment 6330 [details] Предлагаю внести следующие изменения в скрипт формирующий chroot
Довольно старая тема, но... На данный момент chroot-скрипты пытаются копировать библиотеки из каталога sasl2, в то время как на данный момент необходимые библиотеки лежат в sasl2-3, А так же переменная chrooted_slib определяется в function... Предлагаю внести изменения (патч прилагаю)