Управление пакетами в ОС Linuх

c630909115b217784f9ebe73d63044d9.png

В далекие времена установка программного обеспечения под операционные системы семейства Линукс могла серьезно напугать начинающих пользователей этих ОС. Загрузка исходников, борьба с зависимостями, которая зачастую превращалась в нетривиальный квест, ручная правка конфигов и другие «прелести» установка приложений того времени сейчас покажутся глубоким анахронизмом. 

Сейчас любой уважающий себя дистрибутив Линукс имеет в своем составе возможность установки программного обеспечения с помощью менеджеров пакетов.

Системы управления пакетами (которые также иногда «менеджер пакетов» или «пакетный менеджер») — это набор программного обеспечения, позволяющего управлять процессом установки, удаления, настройки и обновления различных компонентов ПО.

В этой статье мы рассмотрим основные менеджеры пакетов, которые используются в различных дистрибутивах Линукс. 

Какие пакеты бывают

Различные дистрибутивы ОС Linux имеют свои форматы пакетов. Вот основные форматы:

  • .deb — Debian и производные (Ubuntu, Mint и т.д.)

  • .rpm — Red Hat и производные (CentOS, Fedora и т.д.), OpenSUSE

  • .apk — Android

  • .ebuild — Gentoo

Каждый формат имеет свои преимущества и недостатки. Так rpm совместим с различными дистрибутивами Linux и обеспечивает более быструю установку и обновление пакетов, но при этом установка и обновление зависимостей может занимать значительное время при установке большого количества пакетов и имеет более сложную систему идентификации версий пакетов, что может привести к проблемам при обновлении или установке.

А deb имеет более простую систему идентификации версий пакетов, что упрощает работу с ними, благодаря чему управление зависимостями происходит быстрее и более эффективно. Но при этом поддерживает ограниченное число дистрибутивов Linux, что может создать проблемы при переходе на другую операционную систему и может потребовать дополнительной настройки для работы с некоторыми пакетами (например, в случае несовместимости с определенной версией ядра).

Из чего состоит пакет

Прежде, чем начать рассмотрение принципов работы с пакетами, поговорим о том, что содержат в себе пакеты. Пакет, как правило, содержит само приложение, в откомпилированном  виде, то есть, по сути в виде бинарного файла.

Также в пакете указывается метаинформация, то есть информация о другой информации, используемая инструментами управления пакетами.

Метаинформация представляет собой составленное по определённым правилам описание, которое содержит имя пакета, номер версии и сборки, сведения о разработчике и его мастер-сайте, список файлов, их положение в файловой иерархии, список зависимостей. Также, здесь могу присутствовать установочные и настроечные сценарии, необходимые для развертывания приложения.

Помимо установочных сценариев, пакет также содержит набор действий, выполняемых после установки (например, пост-инсталляционную конфигурацию). Также пакет содержит сценарий, выполняемый в случае удаления пакета.

Посмотрим пример структуры пакетов для Debian. Зависимости определены в поле Dependents в заголовке пакета. Это список условий, которые должны быть выполнены для корректной работы пакета. Данная информация используется такими инструментами, как apt, для установки необходимых библиотек, утилит, драйверов и т.д. в соответствующих версиях, удовлетворяющих зависимостям устанавливаемого пакета. Для каждой зависимости можно ограничить диапазон версий, удовлетворяющих этому условию. Другими словами, если нам нужен пакет libc6 в версии, равной или превышающей »2.15» («libc6 (>= 2.15)»), то операторы сравнения версий следующие:

<=: less than or equal to;

=: equal to (note that "2.6.1” is not equal to "2.6.1-1”);

>=: greater than or equal to;

>>: greater than.

При этом, стоит отметить, что не все пакеты содержат программы, некоторые содержат шрифты, изображения, темы и т.д.

Зависимости и конфликты

Сейчас сложно представить приложение, не использующее в том или ином виде сторонние библиотеки и другие зависимости. То есть любая, сколько-нибудь сложная программа зависит от пакетов, поставляющих библиотеки. При этом возможна ситуация, когда пакет конфликтует с уже установленным в системе. Наиболее распространенные причины этого заключаются в том, что оба пакета включают файл с одинаковым именем и путем, или предоставляют одну и ту же службу на одном и том же сетевом порту, или препятствуют работе друг друга.

Здесь возможны различные варианты реагирования, в общем случае пакетный менеджер откажется устанавливать пакет, если он вызывает конфликт с уже установленным пакетом. Однако возможна ситуация, когда в новом пакете явно указано, что он «заменит» установленный пакет, и в этом случае менеджер предпочтет заменить старый пакет новым. А вот менеджер apt всегда следует вашим инструкциям: если вы решите установить новый пакет, он автоматически предложит удалить пакет, который создает проблему.

Также, в случае конфликта возможен следующий вариант реагирования: пакетный менеджер просигнализирует о том, что установка пакета «сломает» другой пакет (или определенные его версии) и далее уже пользователь должен решать, что делать в подобной ситуации. При этом различные менеджеры по-разному отреагируют на такую ситуацию. Так, dpkg откажется устанавливать пакет, который нарушает работу уже установленного пакета. А вот apt попытается решить проблему, обновив пакет, который был бы нарушен, до более новой версии (предполагается, что она исправлена и, таким образом, снова совместима).

Такого рода ситуация может возникнуть в случае обновлений без обратной совместимости: это тот случай, когда новая сигнализирует о том, что установка пакета «сломает» другой пакет (или определенные его версии).

Некоторые форматы пакетов можно конвертировать. Так, например пакеты .deb можно конвертировать в другие форматы с помощью утилиты alien. В качестве примера преобразуем deb пакет в rpm.

Для этого сначала установим утилиту alien:

sudo apt-get install alien

Далее выполним конвертацию пакета Teamviewer из deb в rpm. Общий формат работы с alien будет следующий:

sudo alien .deb

Для нашего примера с teamviewer:

sudo alien --to-rpm teamviewer_amd64.deb

371d6ebc13986963372d4ccb83bbb1ce.png

Основные операции с пакетами

Установка пакетов во всех менеджерах производится схожим образом. Необходимо сначала скачать пакет (.deb, .rpm …), далее установить пакет вручную, используя команду данного дистрибутива (dpkg, rpm и т.д.). Например, для dpkg это будет dpkg –i firefox-19.0.deb, а для apt apt-get install firefox.

При этом, все зависимости разрешаются и устанавливаются автоматически.

Обновление списков пакетов и самих пакетов для apt выполняется следующим образом:

apt-get update

Обновление репозитория. Загружает только список пакетов, а не сами пакеты.

apt-get upgrade

Загрузка более новых версий локально установленных пакетов.

И для удаления пакетов в apt используется следующая команда:

apt-get remove [ --purge ] package

Если »--purge» указан, удаляет и конфигурационные файлы.

Где искать пакеты

Для поиска пакетов под различные дистрибутивы можно конечно воспользоваться поисковиками, но лучше использовать проверенные ресурсы, чтобы не столкнуться с сомнительным содержимым. Так, пакеты для Ubuntu можно поискать на следующем ресурсе:

https://packages.ubuntu.com/

А для RPM можно посмотреть здесь:

http://www.rpmseek.com/

Заключение

В этой статье мы рассмотрели основные моменты, связанные с работой с различными пакетами и пакетными менеджерами. А про стандартные потоки ввода/вывода мои коллеги из OTUS расскажут на бесплатном уроке специализации Administrator Linux.

© Habrahabr.ru