Bug 18616 - В chroot-окружение не копируются все нужные библиотеки
Summary: В chroot-окружение не копируются все нужные библиотеки
Status: ASSIGNED
Alias: None
Product: Sisyphus
Classification: Development
Component: openldap (show other bugs)
Version: unstable
Hardware: all Linux
: P2 blocker
Assignee: Anton V. Boyarshinov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-01-23 13:14 MSK by serpiph
Modified: 2015-08-02 16:42 MSK (History)
12 users (show)

See Also:


Attachments
Предлагаю внести следующие изменения в скрипт формирующий chroot (783 bytes, patch)
2015-08-02 16:42 MSK, Dmitriy Shadrinov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description serpiph 2009-01-23 13:14:06 MSK
При запуске slapd в окружение программы (посредством файла /etc/chroot.d/ldap.lib) не копируется библиотека libmysqlclient.so.15, которая требуется для работы библиотеки libsql.so из пакета sasl2. Ошибка скрытая, так как если в окружении уже лежит хоть какая-то версия библиотеки libmysqlclient.so.15, то slapd запускается без особых проблем, зато хорошо проявляется после установки системы с нуля или при обновлении с достаточно старой версии openldap и sasl2, что может сделать невозможным вход в систему, работу служб, демонов, если они пользуются услугами slapd.
Comment 1 Eugene Ostapets 2009-01-23 14:29:35 MSK
Поправлю... Хотя с системой чрутизации не все так так хорошо, должна быть внешняя ручка для sasl2, где в зависимости от пользовательских настроек будет формироваться список рабочих методов, а на основании этого уже будет выполнять копирование библиотек в чрут.
Comment 2 Dmitry Lebkov 2009-01-23 14:57:57 MSK
Интересно, а где-нить существуют реализаций генерации chroot'а "на лету"?
Или генераторы скрипта для генерации chroot'а, в зависимости от имеющегося окружения... :)
Comment 3 Eugene Ostapets 2009-01-23 15:24:45 MSK
Для простого чрута можно и самому написать и в скрипты FreeBSD посмотреть, а вот с sasl и другими подобными неявными зависимостями - проблема, ибо список требуемого для каждой конкретной инсталяции будет заметно отличаться, а если тянуть в чрут всё - лучше вообще от чрута отказаться, как поступили мантейнеры postgreSQL
Comment 4 Mikhail Gusarov 2009-01-23 15:34:57 MSK
(В ответ на комментарий №2)
> Интересно, а где-нить существуют реализаций генерации chroot'а "на лету"?

hasher :)
Comment 5 Eugene Ostapets 2009-01-23 15:37:06 MSK
(В ответ на комментарий №4)
> (В ответ на комментарий №2)
> > Интересно, а где-нить существуют реализаций генерации chroot'а "на лету"?
> 
> hasher :)

Но в случае этой баги - он не помощник :)
Comment 6 Dmitry Lebkov 2009-01-23 16:56:33 MSK
(В ответ на комментарий №3)
> а если тянуть в чрут всё - лучше вообще от чрута отказаться, как поступили
> мантейнеры postgreSQL

Похоже, к этому всё и идёт. Да и на грабли вида "две разные версии libdb в chroot'е" я уже один раз наступал :(
Comment 7 serpiph 2009-01-27 17:02:03 MSK
Хм, есть предложение, правда, довольно громоздкое:
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/<имя библиотеки>.
Comment 8 serpiph 2009-02-11 14:48:09 MSK
Теперь обнаружил, что ещё и libpq.so.5 не оказывается в окружении slapd. Опять же по причине libsql.so из libsasl2. С теми же симптомами.
Comment 9 Dmitry Lebkov 2009-04-24 18:27:03 MSD
На основе патчей от 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 или в виде отдельной функции.
Comment 10 barabashka 2009-11-16 18:12:19 MSK
(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 и подключенным модулям. Это шаблон, улучшать есть чего. )
Comment 11 barabashka 2009-11-17 11:28:06 MSK
(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
Comment 12 Dmitriy Shadrinov 2015-08-02 16:42:19 MSK
Created attachment 6330 [details]
Предлагаю внести следующие изменения в скрипт формирующий chroot
Comment 13 Dmitriy Shadrinov 2015-08-02 16:42:52 MSK
Довольно старая тема, но...
На данный момент chroot-скрипты пытаются копировать библиотеки из каталога sasl2, в то время как на данный момент необходимые библиотеки лежат в sasl2-3,
А так же переменная chrooted_slib определяется в function...
Предлагаю внести изменения (патч прилагаю)