Алексей Федорчук
2004.11.24
Система управления пакетами - один из существенных компонентов любой операционной системы. Оно включает средства установки, учета, обновления и удаления программного обеспечения, не обязательно входящего в базовую поставку собственно ОС. Традиционно такие системы разделяются на две группы - для работы с прекомпилированными пакетами и для сборки бинарных пакетов из исходных текстов. Впрочем, с течением времени граница между ними все более стирается.
В DragonFlyBSD представлены инструменты обеих групп, в значительной мере
унаследованные от FreeBSD: набор средств для манипуляции готовыми
бинарниками и портообразная система dfports. В настоящей
заметке речь пойдет только о первой из них - система портов еще не
приобрела законченных очертаний.
Средства для работы с бинарными пакетами включают в себя следующие
утилиты: pkg_add, pkg_create, pkg_info,
pkg_version, pkg_check, pkg_delete,
pkg_sign. Назначение каждой более или менее понятно из
названия, к тому же большинство их мало отличается от одноименных средств
FreeBSD. И вообще, пользователь последней вряд ли найдет здесь что-либо
принципиально для себя новое - заметка эта, как и предыдущая, рассчитана
на тех, кто ранее дела с BSD-системами не имел.
Прежде чем переходить собственно к инструментарию, посмотрим, что же
представляет собой бинарный пакет DFBSD. Самый простой ответ на этот
вопрос - практически то же самое, что и бинарный пакет FreeBSD. А именно:
простой tar-архив, сжатый утилитой gzip (то есть тарбалл вида
pkg_name-pkg_version.tgz), который можно просмотреть обычной командой
вроде
$ tar tzvf pkg_name-pkg_version.tgz
Процедура эта показывает, что в состав пакета входят, как правило, следующие компоненты:
bin или, для программ
системного назначения, sbin (относительно корня
архива);etc);man/man#);share), в частности - документацию в отличных от man-страниц
форматах, если таковая предусмотрена разработчиком пакета (но не сборщиком
- в BSD-системах обязательными являются только man-pages);lib, include и так далее, если таковые
присутствуют в пакете.
Все перечисленные компоненты определяются составом пакета и возникают при
его компиляции. Однако в пакете DFBSD имеются и специфические файлы,
создаваемые сборщиком пакета (майнтайнером) и содержащие данные (или,
точнее, метаданные о нем). Обязательными из них являются четыре:
+COMMENT, +DESC, +CONTENTS,
+MTREE_DIRS.
Первый файл - это краткое (в одну строку) описание пакета. Например, для
консольного аудиоплейера mpg321 оно выглядит так:
A free command-line mp3 player, compatible with mpg123
Файл +DESC - это более развернутая характеристика пакета в
свободной форме (обычно 1-2 абзаца). Кроме того, здесь же обычно можно
видеть URL сайта его разработчика, имя майнтайнера пакета и его e-mail.
Файл +CONTENTS можно считать главным из всего набора. В нем
указаны (продолжим рассмотрение на примере mpg321):
@name mpg321-0.2.10_4);@comment ORIGIN:audio/mpg321;/usr/local, и лишь для
пакетов XFree86/Xorg - /usr/X11/R6.
Далее следует перечисление пакетов, от которых зависит рассматриваемый
(если таковые имеются). В нашем случае это будут pkgconfig,
libmad, libid3tag, libao и групп, к
которым они принадлежат (devel/ для pkgconfig,
audio для остальных).
И наконец, имена файлов - компонентов пакета, с указанием путей к ним
относительно корневого каталога для установки (/usr/local и
контрольных сумм каждого файла.
Файл +MTREE_DIRS предназначен для описания структуры
каталогов, указания их принадлежности и прав доступа.
А теперь начнем знакомство с инструментами управления пакетами - теми,
которые окажутся наиболее востребованными. Перво-наперво о пакете нужно
получить информацию. Для этого служит команда pkg_info,
использование которой несколько различается в зависимости от того, имеем
ли мы дело с пакетом, уже инсталлированным в систему или только
предполагаемым к установке. В первом случае достаточно дать команду с
именем пакета, номером версии и ревизии в качестве аргумента:
$ pkg_info mpg321-0.2.10_4
ответом на что будет вывод содержимого файлов +COMMENT и
+DESC:
Comment: A free command-line mp3 player, compatible with mpg123 Description: mpg321 is a clone of the popular mpg123 command-line mp3 player ...
и так далее. Имя пакета берется из базы данных установленного софта,
которая расположена в каталоге /var/db/pkg/ (и о которой я
скажу чуть ниже). Для пакета же еще не установленного (и, соответственно,
в базе данных не представленного) в аргументе команды
pkg_info придется указать полное имя тарбалла и, при
необходимости, полный путь к нему:
$ pkg_info /pathname/tiff-3.6.1_1.tgz
с тем же, впрочем, результатом.
Информационным целям служит и команда pkg_version. Впрочем,
она требует наличия индексного файла, который в моей инсталляции DFBSD
отсутствует, и потому опробовать ее в действии мне не удалось.
Получив представление о назначении пакета, можно переходить к его
установке. Делается это с помощью команды pkg_add, в
качестве аргумента которой указывается имя нужного тарбалла, например:
$ pkg_add /pathname/zip-2.3_1.tgz
По этой команде тарбалл разворачивается, и компоненты пакета записываются
в каталоги, предусмотренные в файле +CONTENTS. Кроме того, в
вышеупомянутой базе данных появляется соответствующий подкаталог (в данном
случае /var/db/pkg/zip-2.3_1, в который помещаются описанные
выше файлы с данными о пакете:
$ ls /var/db/pkg/zip-2.3_1 +COMMENT +CONTENTS +DESC +MTREE_DIRS
При таком методе установки пакетов зависимости их проверяются (в
соответствии с описанием в файле +CONTENTS), но автоматически
не удовлетворяются: просто выдается сообщение, что для установки данного пакета
требуется установить еще то-то и то-то. Впрочем, команда
pkg_add допускает сколько угодно аргументов, и все
зависимости можно задать в одной командной строке. В базе данных пакетов,
установленных для удовлетворения зависимостей, появляется дополнительный
файл - +REQUIRED_BY, в котором перечислены пакеты (из числа
установленных), для которых он необходим. Так, для мультимедийных
библиотек давешнего примера содержимое его будет
mpg321-0.2.10_4
Описанный пример относится к установке пакета из произвольного каталога на
локальной машине. Если же имеется подключение к сети и связать с одним из
ftp-серверов, содержащих репозиторий пакетов DFBSD, все теоретически
должно происходить гораздо проще: в качестве рагумента команды
pkg_add достаточно указать имя пакета (с номером версии и
ревизии), и все его зависимости должны бы удовлетворяться автоматически.
Однако пока, за отсутствием выхода в Интернет из моей инсталляции DFBSD
проверить это не удалось.
Команда pkg_add имеет ряд опций, нужных в некоторых особых
случаях. С ними можно ознакомиться в соответствующей man-странице.
Не зная броду, то есть метода удаления пакета, не лезут в воду, сиречь его
инсталляцию. И потому следующим номером нашей программы будет команда
pkg_delete, роль этого брода выполняющая. В качестве
аргумента она принимает имена пакетов, полежащих деинсталляции:
$ pkg_delete zip-2.3_1
Она удаляет все компоненты пакета и соответствующую запись из базы
данных в каталоге /var/db/pkg/. Однако не затрагивает
пользовательских конфигов из каталога $HOME, если они успели
образоваться - ведь в базе пакетов они не фигурируют.
Попытка деинсталляции пакета, от которого зависит что-либо установленное,
вызывает сообщение о невозможности это сделать, и почему - выводя имя
зависимостого пакета. Конечно, деинсталляцию можно выполнить принудительно
(для этого предназначена опция -f, но это занятие нездоровое:
очевидно. что зависимый пакет утратит работоспособность.
Откуда берутся пакеты, подлежащие установке и удалению? В одной из прошлых
заметок я уже говорил, что в настоящий момент существует два их
репозитория - на сайтах GoBSD и LiveBSD. Однако оба они и не полны, и
устарели. И потому никто не мешает пользователю DFBSD соибрать собственный
пакет - специально для этого предназначена утилита pkg_create.
Что для этого нужно? Не так уж и много: исходные тексты нужной версии
нужной программы и те самые четыре файла с данными о пакете.
Где взять исходники - понятно, и останавливаться на этом не будем. А вот
файлы с описаниями пакета придется изготовить самостоятельно. Для файлов
+COMMENT и +DESC это труда не составит,
структура файла +MTREE_DIRS подробно описана в
/usr/src/etc/mtree/README, ну а составление файла
+CONTENTS требует знания зависимостей создаваемого пакета.
Если в одном из помянутых репозиториев имеется одноименный пакет более
старой версии - за образец можно взять файлы описаний из него. Я проделал
эту процедуру для текстового редактора joe (последней
версии 3.1 - в репозитории GoBSD имелась
только версия 3.0) - и после несложного редактирования попытался создать
из него пакет.
Порядок действий: 1) переход к какой-либо временный подкаталог,
2) развертывание в нем тарбалла исходников joe,
3) копирование в корень подредактированных файлов +COMMENT,
+DESC, +MTREE_DIRS и +CONTENTS, 4)
запуск команды pkg_create в следующей форме:
$ pkg_create -c +COMMENT -d +DESC -f +CONTENTS -m +MTREE_DIRS joe-3.1,1
где смысл опций понятен без комментариев, а joe-3.1,1
представляет собой имя собираемого пакета. В результате получился тарбалл
joe-3.1,1.tgz, который был благополучно установлен
командой pkg_add, дав вполне работоспособный бинарник. Именно
в этом варианте пакета и сочинялась данная заметка.
А вообще можно предполагать, что с развитием собственной системы портов бинарные пакеты для DragonFlyBSD станут ее производными, как это испокон веков имело место во FreeBSD.