Bsdadmin.ru

Записки администратора FreeBSD

Путь на сайте

Домашняя FreeBSD Расширенное управление программным обеспечением FreeBSD.Часть2

Расширенное управление программным обеспечением FreeBSD.Часть2

Управление совместно используемыми библиотеками
Идея, лежащая в основе совместно используемых библиотек, довольно проста: это фрагмент компилированного кода, предоставляющий сервисы и функции другим фрагментам компилированного кода. Разделяемые библиотеки предоставляют часто вызываемые функции другим программам и спроектированы так, чтобы как можно больше программ могли многократно их использовать.
Совместно используемые библиотеки предоставляют свои функции для поддержки других программ. Такой подход снижает средний размер программ, высвобождая значительный объем системной памяти.
Во время загрузки система FreeBSD создает кэш доступных совместно используемых библиотек. Программы не должны сканировать весь диск при их поиске; они просто запрашивают в кэше необходимые функции. На самом деле способность управлять кэшем библиотек - это одна из черт, отличающих новичка от профессионала.
FreeBSD предоставляет довольно много разумных параметров, задаваемых по умолчанию, но здесь мы рассмотрим инструменты, необходимые для конфигурирования и управления кэшем в различных обстоятельствах. Совместно используемые библиотеки - это средства с норовом, однако с помощью ldconfig , ldd и головы на плечах их можно приручить.

 

ldconfig

Основной инструмент для управления совместно используемыми библиотеками - ldconfig(8).  Здесь мы обсуждим несколько различных команд, относящихся к ldconfig: rtld(l), ldd(l) и саму программу ldconfig.
Прежде всего рассмотрим типы исполняемых файлов: aout и ELF . Как администратор вы не должны хорошо разбираться в aout и ELF, но должны знать, что aout - это устаревший стандарт, a ELF - новый, и что скомпилированные программы одного типа не могут использовать библиотеки другого типа. ELF-программы не могут применять aout-библиотеки. (Во FreeBSD исполняемый файл Netscape имеет формат aout, поэтому для его применения необходимо установить библиотеки совместимости с aout среды XFree86.) Хотя исполняемые aout-файлы постепенно исчезают, системе FreeBSD еще неопределенно долго придется поддерживать оба типа.
При запуске ELF-программы, которой необходимы библиотеки, система вызывает rtld(l), «компоновщик на этапе выполнения» (run-time linker), rtld исследует загруженные программы, определяет, какие библиотеки им необходимы, а затем загружает эти библиотеки. Для aout-nporpaмм есть отдельный компоновщик, называемый ld(aout).

Вместо того чтобы искать библиотеки по всей системе при каждом вызове той или иной программы, rtld берет совместно используемые библиотеки из кэша библиотек. Кэш находится в двух отдельных файлах системы: /var/ run/ld.so.hints (aout) и /var/run/ld-elf.so.hints (ELF). Неверно сконфигурированный кэш - наиболее вероятная причина проблем с библиотеками. Если программа обращается к библиотеке, которая только что установлена и отсутствует в кэше, произойдет ошибка. В этом случае необходимо заново создать кэш. Сделать Это довольно легко. Просто запустите ldconfig без аргументов; ldconfig повторно просмотрит каталоги, указанные в ldconfig -r, и заново создаст кэш.

Добавление библиотек

Если искомой библиотеки нет ни в одном из просканированных каталогов, ее надо найти. Вообще говоря, если отсечь первые символы в имени библиотеки и применить >locate или >find> >/ >->name> >libname> ->print>, этот файл будет найден . В худшем случае придется пробираться сквозь длинный список строк результата, в одной из которых отыщется нужная библиотека.
После установки той или иной программы в системе может появиться новый каталог с библиотеками. С помощью ключа -m можно достаточно просто «влить» библиотеки нового каталога в существующий кэш . Некоторые «порты» даже применяют этот ключ для конфигурирования библиотек во время начальной загрузки, что исключает утомительную путаницу с /etc/rc.conf. Для «вливания» моей библиотеки в существующий кэш я набираю такую команду:
# ldconfig -m /usr/local/pilot/lib

LD_LIBRARY_PATH
Ключ -т замечательно работает с точки зрения системного администратора, однако он не подходит для скромного пользователя без привилегий root. Кроме того, если у обычного пользователя есть свой набор библиотек, системный администратор может не разрешить к ним всеобщий доступ. А поскольку владельцем каталога совместно используемых библиотек должен быть root, то обычные пользователи не смогут получить доступ к этому каталогу. Вероятно, системный администратор постарается не оставить ни малейшего шанса для связывания системных программ с личными библиотеками пользователя. Именно здесь на помощь придет переменная окружения LD_LIBRARY_PATH. Вместо того чтобы создавать кэш, переменная LD_LIBRARY_PATH предписывает системе искать новые библиотеки в каталогах, список которых она задает.В LD_LIBRARY_PATH можно указать любое количество каталогов, разделив их двоеточиями. Например, я могу поместить каталоги /home/mwlucas/lib и /compat/linux/usr/lib/local в LD_LIBRARY_PATH, чтобы выполнить установку программного обеспечения. Для этого я наберу такую команду:
S setenv LD_LIBRARY_PATH /home/mwlucas/lib:/compat/linux/usr/lib/local
Например, обычно я устанавливаю StarOffice вручную, а не применяю порт. При этом процедура установки извлекает различные библиотеки в /tmp/sv001.tmp и рассчитывает найти их при запуске графического инсталлятора. Чтобы эти библиотеки действительно были найдены, я начинаю установку пакета с того, что задаю в LO_LIBRARY_PATH каталог jimp/sv001.tmp:
№ setenv LD_IIBRARY_PATH /tmp/sv001.tmp # ./setup
Когда будет запущен графический инсталлятор StarOffice, он найдет в этом каталоге извлеченные библиотеки. Таким образом, не надо реконфигуриро вать всю систему FreeBSD только для того, чтобы применять ту или иную программу.

Наконец, возникает вопрос: какие библиотеки нужны программе?

Эту информацию можно получить с помощью ldd(l). Например, узнать, что требуется программе Emacs, можно посредством такой команды: ldd /usr/local/bin/emacs
/usr/local/bin/emacs:
libXaw.so.6 => /usr/X11R6/lib/libXaw.so.6 (0x28159000)
libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x2818e000)
libXt.so.6 => /usr/X11R6/lib/libXt.so.6 <0x2819f000)
libSM. so.6 => /usr/X11R6/lib/libSM.so.6 (0x281e2000)
liblCE.so.6 => /usr/Xl1R6/lib/libICE.so.6 (0x281ea000)
libXext.so.6 => /usr/X11R6/lib/2ibXext.so.6 (0x281fe000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x28209000)
libutil.so.3 => /usr/lib/libutil.so.3 (0x282a2000)
libm.so.2 => /usr/lib/libm.so.2 (0x282ab000)
libc.so.4 => /usr/lib/libc.so.4 (0x282c6000)
libXThrStub.so.6 => /usr/X11R6/lib/libXThrStub.S0.6 (0x28361000)

Этот вывод содержит имена совместно используемых библиотек, которые нужны Emacs, и указывает расположение файлов, содержащих эти библиотеки. Этот список можно сравнить с выводом команды ldconfig -r, дабы убедиться, что у программы есть все необходимое. Либо поискать необходимые библиотеки.

Домашняя FreeBSD Расширенное управление программным обеспечением FreeBSD.Часть2