Управление пакетами в ОС Linuх
В далекие времена установка программного обеспечения под операционные системы семейства Линукс могла серьезно напугать начинающих пользователей этих ОС. Загрузка исходников, борьба с зависимостями, которая зачастую превращалась в нетривиальный квест, ручная правка конфигов и другие “прелести” установка приложений того времени сейчас покажутся глубоким анахронизмом.
Сейчас любой уважающий себя дистрибутив Линукс имеет в своем составе возможность установки программного обеспечения с помощью менеджеров пакетов.
Системы управления пакетами (которые также иногда «менеджер пакетов» или «пакетный менеджер») — это набор программного обеспечения, позволяющего управлять процессом установки, удаления, настройки и обновления различных компонентов ПО.
В этой статье мы рассмотрим основные менеджеры пакетов, которые используются в различных дистрибутивах Линукс.
Какие пакеты бывают
Различные дистрибутивы ОС 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)”), то операторы сравнения версий следующие:
=: greater than or equal to; >>: greater than.
При этом, стоит отметить, что не все пакеты содержат программы, некоторые содержат шрифты, изображения, темы и т.д.
Зависимости и конфликты
Сейчас сложно представить приложение, не использующее в том или ином виде сторонние библиотеки и другие зависимости. То есть любая, сколько-нибудь сложная программа зависит от пакетов, поставляющих библиотеки. При этом возможна ситуация, когда пакет конфликтует с уже установленным в системе. Наиболее распространенные причины этого заключаются в том, что оба пакета включают файл с одинаковым именем и путем, или предоставляют одну и ту же службу на одном и том же сетевом порту, или препятствуют работе друг друга.
Здесь возможны различные варианты реагирования, в общем случае пакетный менеджер откажется устанавливать пакет, если он вызывает конфликт с уже установленным пакетом. Однако возможна ситуация, когда в новом пакете явно указано, что он “заменит” установленный пакет, и в этом случае менеджер предпочтет заменить старый пакет новым. А вот менеджер apt всегда следует вашим инструкциям: если вы решите установить новый пакет, он автоматически предложит удалить пакет, который создает проблему.
Также, в случае конфликта возможен следующий вариант реагирования: пакетный менеджер просигнализирует о том, что установка пакета “сломает” другой пакет (или определенные его версии) и далее уже пользователь должен решать, что делать в подобной ситуации. При этом различные менеджеры по-разному отреагируют на такую ситуацию. Так, dpkg откажется устанавливать пакет, который нарушает работу уже установленного пакета. А вот apt попытается решить проблему, обновив пакет, который был бы нарушен, до более новой версии (предполагается, что она исправлена и, таким образом, снова совместима).
Такого рода ситуация может возникнуть в случае обновлений без обратной совместимости: это тот случай, когда новая сигнализирует о том, что установка пакета “сломает” другой пакет (или определенные его версии).
Некоторые форматы пакетов можно конвертировать. Так, например пакеты .deb можно конвертировать в другие форматы с помощью утилиты alien. В качестве примера преобразуем deb пакет в rpm.
Для этого сначала установим утилиту alien:
sudo apt-get install alien
Далее выполним конвертацию пакета Teamviewer из deb в rpm. Общий формат работы с alien будет следующий:
Для нашего примера с teamviewer:
sudo alien —to-rpm teamviewer_amd64.deb
Основные операции с пакетами
Установка пакетов во всех менеджерах производится схожим образом. Необходимо сначала скачать пакет (.deb, .rpm . ), далее установить пакет вручную, используя команду данного дистрибутива (dpkg, rpm и т.д.). Например, для dpkg это будет dpkg –i firefox-19.0.deb, а для apt apt-get install firefox.
При этом, все зависимости разрешаются и устанавливаются автоматически.
Обновление списков пакетов и самих пакетов для apt выполняется следующим образом:
Обновление репозитория. Загружает только список пакетов, а не сами пакеты.
Загрузка более новых версий локально установленных пакетов.
И для удаления пакетов в apt используется следующая команда:
apt-get remove [ —purge ] package
Если «—purge» указан, удаляет и конфигурационные файлы.
Где искать пакеты
Для поиска пакетов под различные дистрибутивы можно конечно воспользоваться поисковиками, но лучше использовать проверенные ресурсы, чтобы не столкнуться с сомнительным содержимым. Так, пакеты для Ubuntu можно поискать на следующем ресурсе:
А для RPM можно посмотреть здесь:
Заключение
В этой статье мы рассмотрели основные моменты, связанные с работой с различными пакетами и пакетными менеджерами. А про стандартные потоки ввода/вывода мои коллеги из OTUS расскажут на бесплатном уроке специализации Administrator Linux.
Альманах пакетных менеджеров Linux
Иногда может возникнуть вопрос: чьих этот файл, откуда вообще взялась эта библиотека? Удобный менеджер пакетов решает очень многие проблемы ОС. Можно с уверенностью сказать, что если вы подружитесь с МП, то подружитесь и с дистрибутивом как таковым. Причем важно освоить именно набор основных команд, и знать где найти дополнительную информацию.
Далее следует джентльменский набор необходимых для повседневной рутины команд основных Linux дистрибутивов: установить, обновить и удалить пакет, накатить обновления, проверить зависимости, установить принадлежность файла пакету и пр.
Debian и родственные
Популярность и образ дружественного к пользователю Linux дистрибутива сыграли с Ubuntu злую шутку. Некоторым новичкам кажется, что можно на нем делать все, что угодно без помощи командной строки. Это заблуждение и лучше от него поскорее избавиться.
То, что в примерах aptitude не значит, что он правильнее, чем apt-get . Для меня это всего лишь дело привычки.
$ aptitude install package #установить пакет; $ aptitude safe-upgrade package #обновить пакет; $ aptitude update #проверить и установить обновления; $ aptitude remove package #удалить пакет; $ aptitude purge package #удалить пакета с концами, все данные и настройки; $ apt-get dist-upgrade #обновить ОС, killer-feature и оно работает! $ aptitude search package #искать пакет. $ apt-cache depends package #зависимости пакета; $ apt-cache rdepends package #обратные зависимости от пакета.
Некоторые функции доступны с дополнительным МП dpkg .
$ dpkg -l #список установленных программ; $ dpkg -L package #список файлов пакета
Есть еще такое чудо — wajig. Несмотря на странное звучание, вполне годный МП с человеко-читабельным выводом информации на экран.
Настройка репозиториев производится правкой файла /etc/apt/sources.list
$ wajig install package $ wajig distupgrade #обновить ОС; $ wajig install --fileinput filename #установить пакеты списком; $ wajig listinstalled
В целом ПМ Debian один из лучших, с которыми мне доводилось иметь дело.
Redhat и другие RPM дистрибутивы
RPM нельзя назвать образцовым пакетным менеджером, скорее это был кактус, который мыши употребляли в пищу со слезами на глазах. Затем появились более или менее вменяемые МП: yum , dnf , zypper и другие. Только что на сервере RHEL 7.4 yum за раз обновил более 700 пакетов и ничего при этом не сломал, неплохой результат я считаю.
$ yum install package $ yum update package $ yum update $ yum remove package $ yum deplist package #зависимости пакета; $ dnf repoquery --deplist #то же самое, для Fedora $ yum whatprovides package #установить принадлежность файла какому-либо пакету; $ yum list all #список всех установленных программ
Команды rpm на те случаи, когда использовать yum не с руки.
$ rpm -i package #установить пакет; $ rpm -e packate #удалить пакет; $ rpm -qa #список установленных пакетов; $ rpm -qi package #вывод информации об установленном пакете; $ rpm -q --whatrequires package #обратные зависимости от пакета.
Чтобы настроить репозитории Yum , откройте файл /etc/yum.repos.d/*.repo , или используйте команду yum-config-manager .
Zypper
На SuSE Linux используется Zypper / YaST для управления пакетами, движок ZYpp крутится поверх RPM.
$ zypper in mc #установить пакет, если его нет, а противном случае - обновить его; $ zypper up nginx openssh #обновить программу; $ zypper se gnome-desktop #найти программу; $ zypper remove package; $ zypper se --provides --match-exact hg #установить принадлежность файла какому-либо пакету; $ zypper se --requires package #обратные зависимости от пакета.
Можно использовать операторы и регулярные выражения.
Управление репозиториями производится командой zypper mr .
$ zypper lr #список реп, укаханы номера репозиториев; $ zypper mr -d 5 #выключить 5-у репу; $ zypper mr -e 5 #включить 5-у репу.
Pacman
Этот МП используется в Арче и Manjaro.
$ pacman -S package #установить пакет; $ pacman -R package #удалить пакет; $ pacman -Su package #обновить пакет; $ pacman -Q1 package #список файлов пакета; $ pacman -Qo filename #установить принадлежность файла какому-либо пакету; $ whoneeds package #обратные зависимости от пакета; $ pacman -Qdt #список пакетов-сирот, без обратных зависимостей.
Движок поиска в базе данных поддерживает регулярные выражения.
$ pacman -Ss package #простой полнотекстовый поиск; $ pacman -Ss '^vim-' #поиск с регулярными выражениями; $ pacman -Qs package #поиск среди установленных пакетов;
Настройка репозиториев и зеркал производится из файла /etc/pacman.conf
Gentoo emerge
Конечно же это скорее умозрительный сценарий, чем реальный, так как сложно предположить, что красноглазый пользователь Gentoo Linux не знает необходимых опций emerge . Тем не менее, без этого альманах был бы неполным.
$ emerge package #установить пакет; $ emerge -av package # интерактивный режим установки пакета; $ emerge -pv package # показать сценарий установки пакета; $ emerge -u package # обновить пакет; $ emerge -C package # удалить пакет; $ emerge -auDv world # обновить все программы с учетом зависимостей; $ emerge -auDNv word # обновить все программы с учетом зависимостей и новых USE опций.
С дополнительными утилитами можно получить больше информации о файлах, ненужных пакетах и т. д.
$ revdep-rebuild #проверить и восстановить неудовлетворенные зависимости; $ eix package #искать пакет; $ equery belongs package #установить принадлежность файла какому-либо пакету; $ equery depends package #обратные зависимости от пакета; $ equery uses package #USE флаги пакета; $ qlop -l #история операций emerge;
Репозитории, зеркала и все самое важное для emerge / portage содержится в /etc/make.conf .