Управление пакетами в GNU/Linux

Васильев Андрей Михайлович

2020

Понятие дистрибутива ОС

В экосистеме Linux существует множество «дистрибутивов», которые позволяют пользователям запускать свои приложения и решать свои инфраструктурные задачи

Если абстрагироваться от деталей, то все дистрибутивы

  • Используют общее ядро Linux
  • Позволяют запускать приложения под данное ядро
  • Предоставляют инструменты для управления установленными приложениями
  • Предоставляют инструменты для настройки поведения ОС

Слово «дистрибутив» является калькой с английского «distribution», которым описывается набор совместимого программного обеспечения. Совместимость может быть реализована как на уровне исходных кодов, так и на уровне бинарных кодов.

Примерами дистрибутивов могут служить:

  • Windows 10 1809
  • macOS 10.15

Дистрибутивы исторически появились для решения задачи поставки данных до конечных пользователей

  • Пользователь дистрибутива получает ПО в бинарном формате
    • Пользователю нет необходимости скачивать исходный код приложения
    • Пользователю не надо разбираться в системе сборке пакетов: со временем увеличивается число языков и систем сборок
  • Всё ПО в дистрибутиве корректно работает друг с другом
  • Можно установить только нужное ПО, а не все программы
  • Собранный дистрибутив является стабильной платформой для поставки ПО
  • Дистрибутивы обычно получают исправления, связанные с проблемами в безопасности

Дистрибутивы позволяют получить быстро доступ к ПО унифицированным способом

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

Дистрибутив Дата выпуска Окончание поддержки
Debian 9 (Stretch) 17 июня 2017 18 июля 2020
Debian 10 (Buster) 6 июля 2019 2022

Пакетные менеджеры

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

Аналогом пакетного менеджера в Linux можно назвать:

  • Магазины приложений (вместе со списком приложений) на Android и iOS
  • Магазины игр Steam, GoG и т.д.
  • Менеджеры пакетов языков программирования PyPI, Rubygems, Maven

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

Пакетный менеджер Дистрибутивы Linux
Debian (.deb) Debian, Ubuntu, Linux Mint, Raspbian, Astra Linux
Red Hat (.rpm) Fedora, CentOS, Red Hat Enterprise Linux, openSUSE

Пакетные файлы, пакеты

Базовой единицей распространения ПО в дистрибутиве является пакетный файл

  • Пакетный файл является архивом из файлов
    • Большая часть из них — это файлы для установки в файловую систему
    • Оставшиеся — это различные скрипты, выполняющиеся на различных этапах установки пакета: до установки, в разные моменты установки, после установки
  • Дополнительно пакет содержит мета-информацию, включающую название пакета, его версию, краткое описание и т.д.

Пакетный файл обычно создаётся с помощью автоматизированной системы сборки пакетов, настройкой которой для каждого отдельного пакета занимается мейнтейнер (от английского maintain — поддерживать)

  • Исходный код для пакета берётся от производителя приложения
  • Мейнтейнер создаёт конфигурацию пакета для сборочной системы, локально собирает пакеты, модифицирует исходный код
  • Загружает конфигурацию в центральное хранилище производителя дистрибутива

Репозитории

Пакеты могут быть созданы также разработчиками ПО

  • Пользователи могут скачать пакет с сайта разработчика и установить его, если он совместим с установленным дистрибутивом
  • При выходе новой версии ПО пользователю необходимо будет опять скачать и поставить приложение

Репозиторий представляет собой хранилище пакетов для дистрибутива

  • Производители дистрибутивов предоставляют для каждого дистрибутива свои репозитории, которые включают тысячи собранных пакетов
  • Производители ПО могут предоставлять свои репозитории с новыми версиями
  • Пакетный менеджер может работать со множеством репозиториев одновременно
  • Пакетный менеджер может обновлять пакеты, если в репозитории появились более свежие версии
  • Официальные репозитории могут содержать подразделы:
    • Ввиду патентных ограничений
    • Ввиду ограничений на лицензию ПО

Зависимости пакетов

Для работы приложения зачастую недостаточно только одного исполняемого файла, нужны также библиотеки, интерпретаторы, возможно другие исполняемые файлы

  • Эти зависимости могут быть у множества других приложений
  • У библиотек могут быть найдены ошибки, связанные с безопасностью
  • Библиотеки в дистрибутивах Linux обычно являются общими между множеством исполняемых файлов
  • Библиотеки поставляются в отдельных пакетах
  • В пакете приложения пакет библиотеки указывается в списке зависимых пакетов
  • При установке пакета будут установлены все его зависимости, и зависимости зависимых пакетов, и …

Инструменты пакетных менеджеров

Пакетные менеджеры обычно включают в себя инструменты

  • Низкого уровня, в задачу которых входит установка и удаление конкретных пакетов на локальный компьютер
  • Высокого уровня, в задачу которых входит работа с репозиторием, решение задачи разрешения зависимостей

Инструменты различных дистрибутивов

Дистрибутив Низкоуровневый инструмент Высокоуровневый инструмент
Debian производные, Astra dpkg apt, apt-get, aptitude
Fedora, RHEL, CentOS rpm yum, dnf, zypper
Alt Linux rmp apt-get, aptitude

Поиск пакета в репозитории

Обновление кеша

В Debian поиск пакетов в репозитории всегда происходит по локальному кешу

  • Для стабильных репозиториев это хорошо, т.к. изменения в репозитории происходит редко
  • Для динамичных репозиториев это плохо, т.к. локальный кеш постоянно устаревает

Для обновления кеша пакетов в Debian-linux необходимо выполнить команду apt-get update или apt update

Поиск пакета

Для поиска пакета по имени или его краткому описанию можно использовать

apt-cache search TEXT
apt search TEXT

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

Поиск пакета на packages.debian.org

Дистрибутив Debian предлагает графический инструментарий для поиска пакетов https:/packages.debian.org

  • Поиск пакетов по категориям
  • Поиск пакетов по имени
  • Поиск пакетов по файлам, входящих в пакеты

Поиск с помощью передачи аргумента

Помимо взаимодействия с графическим интерфейсом можно сформировать запросы в адресной строке:

  • По названию пакета: https://packages.debian.org/PACKAGE. Вместо PACKAGE надо написать название пакета
  • По файлам: https://packages.debian.org/file:PATH. Вместо PATH надо указать путь к файлу, который ищется

Установка пакета

Из репозитория

Для установки пакета из репозитория необходимо выполнить команду apt-get install PACKAGE или apt install PACKAGE. Вместо PACKAGE необходимо указать имя пакета для установки

Внимание если вы давно не обновляли локальный кеш пакетов, то его необходимо обновить с помощью apt update

Из файла

Если вы хотите поставить .deb-пакет не из репозитория, то необходимо

  1. Скачать данный пакет на компьютер
  2. Установить с помощью низкоуровнего инструмента dpkg: dpkg -i PATH, где вместо PATH указать путь к .deb-пакету

Если пакету не хватает зависимостей, то его установка завершится с ошибкой

Удаление пакета

Удаление обычно выполняется высокоуровневыми инструментами

В Debian для удаления пакета надо выполнить apt-get remove PACKAGE или apt remove PACKAGE, где вместо PACKAGE необходимо указать пакет, который нужно удалить

Важно понимать, что необходимо указать точное название пакета

Отображение списка установленных пакетов

  • На низком уровне можно воспользоваться dpkg -l
  • На высоком уровне доступна команда apt list

Обновление пакетов

Обновление пакета из репозитория

Наиболее частая операция при использовании пакетного менеджера — обновление установленных пакетов в связи с выходом исправлений безопасности или новых функциональных версий

Для обновления локальных пакетов необходимо выполнить apt-get upgrade или apt upgrade

Внимание. Не забывайте обновлять локальный кеш пакетов перед выполнением данных операций с помощью apt update

Обновление с помощью файла-пакета

Обновление из файла-пакета не отличается от установки нового пакета. Достаточно вызвать dpkg -i PACKAGE, где вместо PACKAGE надо указать путь к deb-файлу

Использование графических приложений

Помимо командных инструментов для управления списками установленных пакетов могут быть использованы графические и псевдографические инструменты

  • Synaptic, требует графического пользовательского окружения
  • aptitude, псевдографический менедежр, работает в консоли
  • tasksel, позволяет настроить сервер для выполнения “задач”, например сервер баз данных, веб-сервер

Особенности aptitude

  • Интерактинвный список пакетов
  • Поиск по списку
  • Разрешение конфликтов

Процесс выпуска версий GNU/Debian

Выпуски Debian

  • Новая версия пакета обычно попадает в unstable, sid
  • После базовой проверки пакет переносится в testing
  • Примерно за 6 месяцев testing замораживается и начинает принимать только пакеты с исправлением ошибок
  • Когда количество критических проблем в testing значительно снижается, то из него формируется очередной стабильный выпуск. Стабильный выпуск получает своё уникальное имя, которое берётся из мульт-франшизы Toy Story
  • Для стабильного выпуска формируются исправления. При накоплении критической массы формируется обновление для стабильного выпуска
  • Потенциально в систему можно поставить пакеты из разных выпусков, но это официально не поддерживается и может привести к поломке системы

Разделы репозиториев Debian

Debian в целом разделяет пакеты на «свободные» и «несвободные». Для определения категории используются The Debian Free Software Guidelines (DFSG)

В соответствии с этим определением пакеты делятся на 3 категории:

  • полностью свободные пакеты, предоставляющие исходный код без ограничений, main
  • пакеты, содержащие несвободное по какому-либо критерию ПО, non-free
  • свободные пакеты, зависящие от несвободных пакетов contrib

Последние две категории пакетов официально не являются частью дистрибутива, но их мейнтенеры могут использовать инфраструктуру Debian

Конфигурация репозиториев в Debian

Для настройки списка доступных репозиториев используются

  • Файл /etc/apt/sources.list
  • Файлы в каталоге /etc/apt/sources.list.d

Каждая строка в этих файлах описывает подключённый репозиторий

deb uri distribution [component1] [component2] [...]
  • В начале находится deb для бинарных репозиториев, deb-src для репозиториев с пакетами исходных кодов (из которых были собраны бинарные пакеты)
  • В поле uri вносится путь к репозиторию, может быть интернет-адресом https://... или путём к файловой системе file://...
  • Затем идёт наименование дистрибутива: stable, testing
  • Список компонентов описывает какие компоненты дистрибутива следует использовать: main, contrib, non-free

Полезные репоизтории экосистемы Debian

Между выпусками Debian проходит от полутора до двух лет, за которые успевает выйти много версий ПО, которые могут быть необходимы пользователю

Мультимедийные компоненты

Проект deb-multimedia нацелен на предоставление самых последних версий мультимедиа-пакетов в Debian. Пользователи получают самые последние версии от производителя, включая самые последние функции и ошибки

Скачайте и установите пакет с ключом:

wget http://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2016.8.1_all.deb
sudo dpkg -i deb-multimedia-keyring_2016.8.1_all.deb

Добавьте файл deb-multimedia.list в /etc/apt/sources.list.d:

deb https://mirror.yandex.ru/debian-multimedia/ buster main non-free

Подключение раздела debian-backports

Похожую задачу решает Debian Backports

В рамках этого проекта создан репозиторий, в который помещаются пакеты из Debian Testing, которые были скомпилированы для достижения бинарной совместимости с текущим стабильным выпуском

Подключение репозитория

Debian backports стали распространяться вместе с официальными выпусками debian, поэтому достаточно добавить -backports-дистрибутив в список репозиториев:

deb http://deb.debian.org/debian buster-backports main

Установка пакетов из debian-backports

В отличие от debian-multimedia пакеты автоматически не обновятся до версий debian-backports, их необходимо явно установить:

apt-get -t buster-backports install PACKAGE

Подключение репозиториев от других производителей

Некоторые крупные производители ПО предлагают собственные репозитории

Некоторые из них предлагают новые имена для пакетов, некоторые предлагают конкретные версии своих пакетов

Переход на новую версию дистрибутива

Пользователи зачастую хотят перейти на новую версию дистрибутива:

  • Чтобы получить новые версии ПО, включающие новые функции и оптимизации
  • Чтобы получить новую версию ядра Linux, чтобы получить поддержку нового оборудования, т.к. драйвера обычно поставляются внутри ядра Linux

Проблемы обновления:

  • Новые версии служб могут могут изменить своё поведение, форматы конфигурационных файлов
  • Приложения, распространяемые не через пакетный менеджер, могут перестать работать, так как станут бинарно несовместимыми
  • В новой версии дистрибутива может не поставляться нужное ПО, потребуется переход на альтернативу
  • Скорее всего потребуется обновление настроек ПО

Выполнение перехода на новую версию

  1. Отредактируйте конфигурацию пакетного менеджера, чтобы она ссылалась на новую версию дистрибутива
  2. Обновите локальный кеш пакетов, apt-get update
  3. Выполните обновление дистрибутива, apt-get dist-upgrade
  • Обычно поддерживается переход только на новую версию дистрибутива, возврат к предыдущей версии обычно недоступен
  • При выполнении операции dist-upgrade часть пакетов может быть удалена, их надо будет поставить заново при необходимости
  • Для перехода можно использовать графические инструменты, чтобы помочь алгоритму разрешения зависимостей выбрать нужные версии пакетов

Особенности распространения ПО

  • Пользователи могут получить доступ к большой коллекции ПО унифицированным образом

  • Мейнтенерами пакетов являются не разработчики ПО, а отдельные люди, что снижает нагрузку на разработчика

  • ПО внутри репозитория совместимо друг с другом, используются общие библиотеки

  • При использовании репозиториев пользователи обычно работают не с самой последней версией ПО, а версий, что была доступна на момент формирования репозитория

  • ПО может не входить в состав репозитория

  • Дистрибутив может поставлять только более свежую версию ПО, например Java 14 вместо Java 11

Установка ПО альтернативными способами

  • Скачивание приложения из архива, которое бинарно совместимо с дистрибутивом
  • Компиляция приложения из исходных кодов
  • Установка пакетов скриптовых языков
  • Использование систем пакетирования приложений и их доставки, которые не зависят от дистрибутива: AppImage, Docker, Flatpack, Snappy