Система управления пакетами – это то, что больше всего выделяет Slackware, прародителя Zenwalk, в ряду всех других дистрибутивов. Часто говорят, что в Slackware нет системы управления пакетами вообще. Это утверждение позорно и преступно: такая система там есть. Другое дело, что она резко отличается от всех остальных тем, что разрешением зависимостей каждого устанавливаемого пакета пользователь должен заниматься самостоятельно, в индивидуальном порядке. Само по себе это не хорошо, и не плохо – это, как говорил Остап Бендер, медицинский факт. И именно этим фактом руководствуются многие пользователи, выбирающие Slackware в качестве основной системы. Тем же, кому ручное разрешение зависимостей не нравится, вольно прикрутить к этому дистрибутиву чуть ли ни любую стороннюю систему пакетного менеджмента, благо формат пакетов его этому ничуть не препятствует.
Ибо формат пакетов Slackware прост, как правда: это просто скомпилированные из авторского пакета исходных текстов (возможно, с наложением собственных патчей) бинарники со всеми сопутствующими компонентами, типа man-страниц и прочей документации, сопровождаемые (не обязательно) сценариями установки и удаления. Все это затарено посредсвом tar и запаковано с помощью gzip – традиционно пакеты Slackware имеют суффикс tgz. Никакой метаинформации (в частности, сведений о зависимостях) внутри самого пакета не имеется.
Именно из-за стерильности в отношении зависимостей к пакетам Slackware так просто прикрутить любую систему управления пакетами – собственный swart, адаптированный для нее механизм apt – slapt, packman из Archlinux. Не говоря уже о портах FreeBSD и pkgsrc от NetBSD – но это немного другая история.
Возникает резонный вопрос – а откуда системы управления пакетами берут информацию о зависимостях, если внутри самого пакета на нее нет и намека. Ответ прост – из внешних файлов, к пакету прилагаемых, и из описаний репозиториев. Как? Это и будет рассмотрено на примере netpkg, фирменной системы пакетного менеджмента дистрибутива Zenwalk.
Каждый пакет Zenwalk включает в себя четыре компонента:
собственно тарбалл пакета – pkg_name-#.##.i486.tgz
текстовый файл с описанием пакета – pkg_name-#.##.i486.txt
файл вида pkg_name-#.##.i486.dep – вопреки тому, что можно было бы подумать, судя по суффиксу, он, как правило, пуст
и, наконец, собственно файл с метаинформацией – pkg_name-#.##.i486.meta.
Именно в последнем и перечисляются пакеты, необходимые для установки данного, то есть связанные с ним жесткими зависимостями (PACKAGE REQUIRED), пакеты, способствующие его функциональности – то есть связанные зависимостями мягкими (PACKAGE SUGGESTS), и пакеты конфликтующие (PACKAGE CONFLICTS).
Эти четыре файла для каждого пакета помещаются в сетевые репозитории. Структура каждого репозитория включает следующие подкаталоги:
- a/ - приложения базовой системы
- ap/ - дополнительные приложения текстового режима
- d/ - средства разработки
- l/ - основные системные библиотеки
- n/ - сетевые средства
- x/ - пакеты, составляющие оконную систему X
- xap/ - приложения графического режима
Кроме того, имеется еще подкаталог extra – в него включены те приложения, которые не входят в базовый комплект дистрибутива, такие, как KDE, OpenOffice.org, дополнительные библиотеки, шрифты, средства локализации, и так далее. Организован он аналогично корню репозитория, включая одноименные каталоги (a/, ap/ и так далее) и несколько дополнительных, таких, как kde/, games/ и так далее.
В каждом из подкаталогов репозитория имеется файл PACKAGES – это перечень содержащихся в нем пакетов.
Корень репозитория содержит, кроме подкаталогов, четыре файла:
- CHECKSUMS.md5
- PACKAGES.TXT
- CHECKSUMS.md5.gz
- PACKAGES.TXT.gz
Первый – это список контрольных сумм всех пакетов, входящих в репозиторий. Второй – совокупность всех файлов *.meta из каждого пакета репозитория. Ну а два последних, как легко догадаться, просто их компрессированные аналоги.
Список доступных репозиториев содержится в файле /etc/netpkg.conf, к рассмотрению которого мы обратимся чуть позже. А пока – посмотрим, как же на практике осуществляется управление пакетами из сетевых репозиториев.
В Zenwalk этой цели служит специальная утилита, которая называется netpkg. Разумеется, можно воспользоваться и традиционным Slackware'вским pkgtool – но тогда и зависимости придется разруливать руками, полагаясь на то, что нет Боха, кроме Патрега, а pkgtool – Пророк его.
А с netpkg обращаться очень просто. Для установки единичного пакета достаточно набрать в командной строке
$ netpkg имя_пакета
без указания пути, версии, суффикса и тому подобной атрибутики. После нажатия на Enter последует сообщение о том, что для удовлетворения зависимостей данного пакета требуется то-то и то-то. Если с этим согласиться, необходимые для разрешения зависимостей пакеты будут установлены автоматически. Если отказаться – установка прервется.
Можно видеть, что обращение с netpkg – точно такое же, как с Debian'овским apt-get или pacman из Archlinux, только еще проще – утилита нашего дистрибутива имеет всего шесть опций:
- upgrade – тотальное обновление системы, действует аналогично apt-get dist-upgrade в Debian'е и его клонах, или pacman -Syu в Archlinux;
- download – скачивание файлов из репозитория и помещение их в локальный кэш с сортировкой по категориям, принятым в Zenwalk (о них было сказано ранее);
- list – вывод полного списка пакетов, имеющихся в репозитории, с указанием их статуса: I – установленный, U – подлежащий обновлению, D - «откатываемый» на более старую версию, N – не установленный (то есть новый);
- dotnew – замена текущего конфигурационного файла /etc/netpkg.conf новой версией;
- mirror – выбор одного из доступных репозиториев (какой репозиторий использовать по умолчанию – запрашивается при первом запуске netpkg).
Сами по себе доступные репозитории, как уже говорилось, перечислены в файле /etc/netpkg.conf – настало время рассмотреть его структуру подробнее. Он состоит из нескольких секций. В первой
# Current : tested package remositories
перечислены главные репозитории дистрибутива Zenwalk в следующем виде:
Internet_mirror = http://zen-repo.meticul.eu/i486/current
и так далее (минимально необходимый список создается при инсталляции автоматически).
Вторая секция -
# Extra : addon packages
перечисляет репозитории с дополнительными (то есть выходящими за пределы базовой установки) пакетами (такими, как KDE) и имеет тот же формат:
Internet_mirror = http://linuxpackages.telecoms.bg/Zenwalk
Дистрибутив Zenwalk допускает использование не только собственных репозиториев пакетов, но и хранилищ материнской системы (Slackware), а также и любых других произвольных коллекций пакетов подходящего формата. Список таких стронних репозиториев содержится в секции
# Misc package remositories
где можно видеть, например, строки типа
Internet_mirror = http://slackware.mirrors.tds.net/pub/slackware/slackware-current/slackware
описывающую путь к официальному репозиторию Slackware,
Internet_mirror = http://users.zenwalk.org/packages
где наличествуют собранные пользователями пакеты, и так далее.
Правда, при этом следует помнить, что зависимости, скорее всего, придется разрешать вручную, да и конфликты версий не исключены.
Следующая секция описывает параметры прокси-сервера – его адрес, имя пользователя, пароль. При необходимости заполняется вручную – по умолчанию значения всех строк пусты.
Далее идет группа строк, определяющих местоположение базы данных установленных пакетов, по умолчанию -
Package_logs = /var/log/packages
что изменять категорически не рекомендуется, указывающая, сохранять ли скачанные при установке пакеты в локальном репозитории -
Keep_packages = yes
(очевидно, что если такой необходимости нет, значение следует заменить на no), и местоположение локального репозитория -
Local_repository = /var/packages
В последнюю секцию можно объединить группу строк разного назначения. Например, блэк-лист – перечень пакетов, которые не будут обновляться ни автоматически, через netpkg upgrade, ни при явном их указании – netpkg имя_пакета: их необходимо скачать и установить вручную. В этот перечень входит, в частности, все, что относится к ядру – сам образ его, исходники и заголовки.
В следующей строке
Protected_files =
можно видеть перечень конфигурационных файлов, которые не будут изменяться при автоматическом обновлении пакетов или системы в целом. По умолчанию он включает такие конфиги, как /etc/lilo.conf, /etc/fstab, /etc/passwd, /etc/shadow, /etc/group, и так далее.
И, наконец, строка, определяющая, следует ли выводить информацию о зависимостях при установке пакета:
Handle_dependencies = yes
Вполне очевидно, что, если заменить значение ее на no, то все связанные зависимостями пакеты будут устанавливаться автоматически.
Из сказанного ясно, что использование утилиты netpkg и ее настройка предельно просты. Что, естественно, компенсируется и ограниченностью ее возможностей в сравнении с аналогами – такими, как pacman и тем более apt-get. В частности, в ней мы не увидим изощренных способов поиска пакетов – единственным доступным методом сортировки оных является фильтрация по статусу. Для чего служат опции оного – I, U, N, D, - перечисленные ранее. То есть для вывода всех установленных пакетов служит команда
netpkg list -I
и так далее. Более же точный поиск возможен только с помощью командного конвейера вида
netpkg list | grep [набор символов]
В некоторой мере эта ограниченность возможностей преодолевается посредством графического фронт-энда к netkpg, носящего то же имя и вызываемого из Zenpanel (рис. 1). Эта программа имеет удобные средства поиска пакетов по имени, фильтрации по статусу, переключения репозиторие и обработки их списка (добавления, удаления, редактирования – рис. 2).
Использование ее предельно просто. Единственное, что следует иметь ввиду при этом – то, что зависимости пакетов она устанавливает автоматически, без запроса и вывода каких-либо сообщений. Поэтому я, например, для инсталляции пакетов все-таки предпочитаю текстовый вариант netpkg (хотя всё, что фигурирует в зависимостях пакетов Zenwalk, так или иначе подлежит инсталляции, но знание того, что именно устанавливается, мне лишним не кажется). А вот во всех остальных случаях – удалении пакетов и, тем более, их поиске, я полагаюсь на графический фронт-энд.
Наконец, главный недостаток как самой утилиты netpkg, так и ее фронт-энда – невозможность установки пакетов с локального носителя: как и следует из ее названия, она приспособлена только для работы по Сети.
Вот, пожалуй, и все, что следует знать начинающему пользователю Zenwalk об управлении пакетами в этом дистрибутиве. В одной из ближайших заметок я надеюсь рассказать о том, как создавать пакеты самостоятельно. По сравнению с материнской системой, сиречь Slackware, специфики тут не много, но тем не менее, она есть.