Установщики пакетов делают атомарными (одношаговыми) операции с отдельными пакетами: вместо копирования множества файлов и запуска нескольких сценариев пользователь вводит одну команду «установить/удалить пакет». Однако атомарная с точки зрения пользователя операция — добавление в систему одного нового компонента может состоять из нескольких (и даже многих) операций над пакетами. Мефодий уже столкнулся с подобным случаем, изучая на собственном опыте понятие «цепочка зависимостей». Здесь установщики пакетов никак не могут облегчить работу пользователя.
Чтобы сделать процедуру установки, удаления и обновления компонента системы атомарной, были разработаны менеджеры пакетов. Менеджер пакетов — это программа, которая вычисляет весь комплекс операций над отдельными пакетами, который нужно произвести для установки/удаления нового компонента (пакета), и сама запускает установщик пакетов сколько нужно раз с нужными параметрами. Кроме того, менеджер пакетов хранит информацию не только о пакетах, уже установленных в системе, но и обо всех, которые доступны для установки с какого-либо носителя или по Сети (подробнее об этом в разделе Package..Доставка).
- менеджер пакетов
- Программа, выполняющая установку, удаление или обновление любого пакета или группы пакетов, и автомитически выполняющая все необходимые для этого процедуры (доставку пакетов из удалённых репозиториев, вычисление зависимостей и установку требуемых по ним пакетов, удаление замещаемых пакетов и т. п.).
Наиболее известный и популярный менеджер пакетов называется APT (Advanced Package Tool). Первоначально он был разработан в рамках дистрибутива Debian и работал только с установщиком пакетов dpkg, впоследствии для других дистрибутивов была разработана версия, работающая с rpm
. В дистрибутиве Мефодия также используется APT.
Чтобы установить пакет, прежде всего нужно узнать о его существовании. Пакетов для каждого дистрибутива Linux доступны тысячи и даже десятки тысяч, ориентироваться в них непросто. APT предоставляет возможность поиска нужного среди доступных пакетов, для этого используется утилита apt-cache
. В каждом пакете обязательно содержится краткая аннотация (в одну строку) и небольшое описание содержищихся в пакете ресурсов (не длиннее нескольких абзацев). По команде «apt-cache search подстрока
» APT найдёт и выведет список из имён и аннотаций пакетов, где в имени, аннотации или описании нашлась указанная подстрока.
[root@localhost shogun]# apt-cache search python | wc
146 1158 8994
[root@localhost shogun]# apt-cache search python | grep "programming"
python - An interpreted, interactive object-oriented programming language
Пример 9. Поиск пакетов в APT
Для установки и удаления пакетов предназначена утилита apt-get
, а команда установки выглядит совсем просто: «apt-get install имя_пакета
», причём не нужно указывать никаких сведений о версии и местонахождении пакета: APT сам найдёт и установит самую последнюю из доступных версий.
[root@localhost shogun]# apt-get install python
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
Следующие дополнительные пакеты будут установлены:
libpython libgdbm libgmp python-base python-modules python-modules-bsddb
python-modules-compiler python-modules-curses python-modules-email
python-modules-encodings python-modules-hotshot python-modules-logging
python-modules-xml python-strict
Следующие НОВЫЕ пакеты будут установлены:
libpython libgdbm libgmp python python-base python-modules
python-modules-bsddb python-modules-compiler python-modules-curses
python-modules-email python-modules-encodings python-modules-hotshot
python-modules-logging python-modules-xml python-strict
0 будет обновлено, 15 новых установлено, 0 пакетов будет удалено и 0 не будет обновлено.
Необходимо получить 0B/4466kB архивов.
После распаковки потребуется дополнительно 16,9MB дискового пространства.
Продолжить? [Y/n] y
Получено: 1 cdrom://SomeLinux CD RPM/main libpython 2.3.3-some2 [17,4kB]
Получено: 2 cdrom://SomeLinux CD RPM/main libgdbm 1.8.3-some3 [25,6kB]
Получено: 3 cdrom://SomeLinux CD RPM/main libgmp 4.1.2-some3 [153kB]
. . .
Получено: 14 cdrom://SomeLinux CD RPM/main python-base 2.3.3-some12 [782kB]
Получено: 15 cdrom://SomeLinux CD RPM/main python 2.3.3-some12 [11,5kB]
Получено 4466kB за 0s (19,5MB/s).
Совершаем изменения...
Preparing... ######################################### [100%]
1: libpython ######################################### [ 6%]
2: libgdbm ######################################### [ 13%]
3: libgmp ######################################### [ 20%]
4: python-base ######################################### [ 26%]
. . .
13: python-modules-logging ######################################### [ 86%]
Завершено.
Пример 10. Установка пакета с помощью APT
Процедуру установки APT выполняет в несколько этапов: сначала он ищет запрошенный пакет в списках доступных, найдя, рассчитывает, какие пакеты следует установить, чтобы удовлетворить его зависимости, после чего получает файлы всех нужных пакетов (в данном случае APT нашёл нужные пакеты на диске CD-ROM), и запускает установщик пакетов последовательно для установки всего необходимого. Аналогично, чтобы удалить пакет, достаточно выполнить команду «apt-get remove имя_пакета
».
Кроме APT, есть ещё несколько менеджеров пакетов. Большинство из них специфичны для определённого дистрибутива, как, например, emerge
для Gentoo или yast
для SUSE. Их задачи и возможности примерно совпадают с APT.
Контроль целостности
Поскольку менеджер пакетов умеет строить цепочки зависимостей пакетов друг от друга, с его помощью всегда можно определить, все ли зависимости удовлетворены у пакетов, установленных в системе. Система, в которой нет пакетов с неудовлетворёнными зависимостями, называется целостной. Если целостность нарушена, это означает, что часть установленного в системе программного обеспечения попросту неработоспособна или работает некорректно.
Целостность системы может нарушиться в момент каких-то изменений в её составе: при установке, удалении или обновлении части пакетов или всей системы. Если для всех этих операций использовать менеджер пакетов, то целостность системы не должна нарушиться. Хотя иногда даже менеджеру пакетов бывает сложно найти правильное решение, чтобы удовлетворить все зависимости и устранить конфликты.
При наличии менеджера пакетов механизм зависимостей можно обернуть и на пользу человеку. Так, можно создать пакет, в котором есть только зависимости и нет никаких ресурсов — такой пакет называется виртуальным. Это бывает полезно в том случае, когда нужно упростить пользователю установку полной среды для выполнения какой-либо задачи. Необходимые для этого пакеты могут напрямую не зависеть друг от друга, но чтобы установить их все за один шаг, пользователю будет достаточно установить один — виртуальный — пакет. Таким виртуальным пакетом оказался сам пакет python
в примере, и ещё один — python-strict
:
[root@localhost shogun]# rpm -ql python
(не содержит файлов)
[root@localhost shogun]# rpm -ql python-strict
(не содержит файлов)
Пример 11. Виртуальные пакеты не содержат файлов
Именно поэтому apt «получил» 15 пакетов (включая два виртуальных), а «совершил изменения» только для 13-ти.
Доставка
Важная задача, которую не решает установщик пакетов — доставка файла пакета в систему для последующей установки. Архивы пакетов обычно не хранятся в самой системе: они слишком велики (тысячи пакетов) и должны регулярно обновляться (выход обновлений программ, т. е. новых версий пакетов). Поэтому для установки обычно требуется сначала скопировать необходимые файлы с того носителя, где они хранятся (это либо установочные диски дистрибутива, либо хранилища в сети Интернет). Чтобы APT мог работать с пакетами, они должны содержаться в организованном по специальным правилам хранилище — репозитории. Список доступных APT репозиториев хранится в файле /etc/apt/sources.list
, для каждого репозитория указан способ доступа (например, «cdrom:
», «ftp:
», «file:
» и др.) и адрес.
rpm cdrom:[SomeLinux CD]/ RPM contrib main
rpm [sme] ftp://updates.somelinux.com 2.4/i586 updates
Пример 12. Файл sources.list
После каждого изменения файла /etc/apt/sources.list
нужно обновлять кеш APT, в котором хранятся сведения о доступных пакетах, командой apt-get update
. Для того, чтобы добавить в кеш информацию о пакетах, доступных на CD, следует использовать команду «apt-cdrom add
», а не редактировать sources.list
вручную.
APT позволяет и просто доставить пакет в систему, не устанавливая его. Так, например, всегда происходит с исходными пакетами, которые просто копируются из репозитория в определённый каталог системы по команде «apt-get source имя_пакета
».
Обновление
Программное обеспечение в мире Linux (и не только) постоянно обновляется: исправляются ошибки, расширяются возможности. Разработчики каждого дистрибутива по мере выхода новых версий программ готовят новые версии соответствующих пакетов и делают их доступными в своём репозитории (репозитории, отражающие наиболее современное состояние программного обеспечения, доступны через Интернет). Пользователю имеет смысл не отставать от обновлений программного обеспечения, потому что новые версии программ — это и большая надёжность работы системы, и новые возможности.
Менеджеры пакетов позволяют делать комплексные обновления всей системы. В APT эту процедуру можно выполнить одной командой: «apt-get dist-upgrade
». Эта процедура сначала исследует содержимое всех доступных репозиториев и находит там все пакеты более поздних версий, чем соответствующие пакеты, установленные в системе. После этого вычисляется объём обновления: должна быть удалена связаная область зависящих друг от друга устаревших пакетов и заменена соответствующей областью более новых версий. Сложные ситуации могут возникать в том случае, если изменилось распределение ресурсов по пакетам: пакеты были разделены или объединены — здесь может потребоваться ручное вмешательство пользователя. Тот род обновлений системы, который нужно делать регуляно и обязательно — это обновления, связанные с безопасностью (security updates). Когда в программе обнаруживают и исправляют серьёзные ошибки, угрожающие безопасности всей системы, разработчики дистрибутивов обычно заботятся о том, чтобы соответствующие обновления достигли пользователя. Обычно присутствует отдельный репозиторий с обновлениями, существенными для безопасности.
Цена удобства
Удобство менеджеров пакетов оплачивается тем, что они могут успешно работать только со специальными целостными областями источников (репозиториями пакетов). Хотя для большинства пользователей это ограничение не так существенно: те дистрибутивы, в которых используются менеджеры пакетов, обычно имеют огромные репозитории пакетов, где можно найти любое мыслимое и немыслимое программное обеспечение. Если же нужной программы всё-таки нет в официальном репозитории дистрибутива, обычно находятся «частные» репозитории, доступные по сети Интернет, включающие не вошедшие в официальный репозиторий пакеты.
Если всё-таки нужный вам пакет нигде не найти собранным именно для вашего дистрибутива, можно установить и сторонний пакет, но это может быть выполнено только при помощи установщика пакетов, менеджер пакетов в этой ситуации будет бесполезен. Можно установить программу и самостоятельно скомпилировав её из исходных кодов, однако здесь стоит иметь в виду следующее.
Автор программы совершенно не обязан учитывать в ней все тонкости всех дистрибутивов, поэтому возможны, с одной стороны, прямые конфликты с файлами в системе (которые никто уже не отследит), а с другой стороны — конфликты и противоречия скрытые (например, программа устанавливается в подкаталог каталога /usr/local
, и ожидает, что все остальные программы тоже находятся в этом каталоге). Это значит, что придётся самостоятельно разобраться и с тем, как и с какими параметрами компилировать программу, как устанавливать её в систему, и как избежать при этом конфликтов. А если так, если вы и в самом деле в состоянии правильно собрать и установить в систему нужную вам, а значит и ещё кому-нибудь, программу, которой пока нет в дистрибутиве, то самое правильное — сделать из неё пакет, по крайней мере исходный пакет, а если получится, то и двоичный. Это здорово облегчит жизнь и вам, когда вы будете компилировать и устанавливать эту программу ещё раз (на другом компьютере или обновляя версию самой програмы), и, главное, всему сообществу пользователей вашего дистрибутива!
Наконец, во многие современные дистрибутивы включаются средства, помогающие сборке двоичных пакетов. Такие средства (например, пакет hasher
из ALT Linux) позволяют не только скомпилировать программу в «универсальной среде», содержащей лишь заданный набор пакетов, но и автоматически выстраивают зависимости, проверяют правильность установки, отслеживают конфликты. Короче говоря, собрав пакет с помощью такого средства, вы можете серьёзно претендовать на роль сопровождающего этот пакет в дистрибутиве. Напротив, скомпилировав программу втихомолку, с помощью шаманства и ручной работы, вы проявите себя как лентяй и эгоист, которому нет дела до роста и улучшения собственной операционной системы.