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

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

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

Версии презентации


Минимальное приложение #

Рассмотрим нативное приложение под операционную систему, main.c:

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}

Скомпилируем данное приложение:

gcc -o app -O3 main.c

Удостоверимся, что приложение работает

$ ./app
Hello, world!

Зависимости приложения #

Рассмотрим информацию об исполняемом файле:

$ file app
app: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
    dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
    BuildID[sha1]=2b4b5f9bc2b755dc4b60cfd008a627ea0b997990,
    for GNU/Linux 3.2.0, with debug_info, not stripped
$ ldd app
        linux-vdso.so.1 (0x00007ffc3455d000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f68c0200000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f68c0500000)

Приложению для работы необходимы:

  • Процессор с архитектурой x86-64
  • Ядро ОС GNU/Linux, GNU/Linux 3.2.0
  • Реализация стандартной библиотеки языка Си, libc.so.6

Зависимости крупных приложений #

Типичное приложение имеет гораздо больше зависимостей:

  • Большое количество библиотек, которые нужны ему для работы
  • Возможно есть зависимость от интерпретатора или среды исполнения, если приложение написано не на компилируемом языке программирования
  • Статические ресурсы для показа пользователю: иконки, изображения, макеты страниц, документация и т.д.
  • Системные или специализированные службы, например базы данных

Базовый подход к распространению ПО #

В рамках основных пользовательских платформ (Windows, Android и т.д.) системные библиотеки предоставляются поставщиком платформы, а разработчики должны предоставить все свои зависимости вместе с приложением

  • Увеличивается объём данных для передачи и объём используемого пространства на жёстком диске, т.к. каждому Java-приложению надо поставить свою копию JVM (под Windows, macOS)
  • Существенно увеличивается вероятность проблем с безопасностью, т.к. разработчики не выпускают новые версии приложений с обновлениями библиотек

В рамках Linux также можно воспользоваться данным способом распространения приложений


Процесс сборки большого приложения #

Рассмотрим процесс компиляции приложения на Си и C++

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

Для дистрибуции приложения потребуются собрать вместе:

  • исполняемый файл приложения;
  • динамически загружаемые библиотеки;
  • ресурсы приложения.

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

А затем предоставить пользователю в виде архива или установочного пакета


Подход с разделением библиотек #

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

В отличие от собственной дистрибуции:

  • Разработчику не надо решать вопросы доставки библиотек
  • Конкретная библиотека установлена на устройство ровно один раз
  • Разработчики системы могут обновлять библиотеки, решая общие проблемы в безопасности

Однако есть и сложности: система не обязательно предоставляет не ту версию библиотеки: слишком новую или слишком старую


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

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

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

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

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

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

  • Windows 10 1809
  • macOS 13.0
  • Android 12

Назначение дистрибутива #

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

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

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


Скорость выпуска дистрибутивов #

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

Дистрибутив Дата выпуска Окончание поддержки
Debian 9 (Stretch) 17 июня 2017 30 июня 2022
Debian 10 (Buster) 6 июля 2019 30 июня 2024
Debian 11 (Bullseye) 14 августа 2021 июль 2024
Alt Linux 8 15 августа 2016 16 декабря 2019
Alt Linux 9 16 августа 2019 31 декабря 2023
Alt Linux 10 30 декабря 2021 31 декабря 2024
RHEL 7 9 июня 2014 6 августа 2019
RHEL 8 7 мая 2019 31 мая 2024
RHEL 9 18 мая 2022 31 мая 2027

Выпуски ALT Linux, Выпуски RHEL, Выпуски Debian


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

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

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

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

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

Пакетный менеджер Дистрибутивы Linux
Debian (.deb) Debian, Ubuntu, Linux Mint, Raspbian, Astra Linux
Red Hat (.rpm) Red Hat Enterprise Linux, SLES, ALT Linux, ROSA, РЭД ОС

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

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

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

Создание пакетов #

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

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

Некоторые дистрибутивы предоставляют возможности сообществу пользователей участвовать в формировании пакетов дистрибутива, становиться мейнтейнерами их репозиториев: Debian, openSuse, ALT Linux, ROSA Linux, Fedora и т.д.


Создание пакетов разработчиками ПО #

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

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

Репозитории #

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

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

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

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

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

Эта схема позволяет гранулярно обновлять части системы, усиливая её безопасность

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

Общие ресурсы между приложениями снижают объём необходимой памяти на жёстком диске и в оперативной памяти


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

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

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

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

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

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

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

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

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

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

Поиск пакета #

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

apt-cache search TEXT

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


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

ALT Linux предлагает графический инструментарий для поиска пакетов https://packages.altlinux.org

  • Поиск пакетов по категориям
  • Поиск пакетов по имени
  • Фильтрация поиска по выпускам дистрибутива

Поиск пакета по содержимому #

Выяснение пакета для установленного файла #

Иногда может возникнуть задача нахождения пакета, к которому принадлежит файл, находящийся на файловой системе. Для этих целей необходимо воспользоваться инструментарием низкого уровня: dpkg или rpm в зависимости от дистрибутива

Для ALT Linux: rmp -qf /PATH/TO/FILE, где вместо аргумента нужно указать путь к искомому файлу


Выяснение пакета для неустановленного файла #

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

В ALT Linux для решения этой задачи можно использовать apf или epm

# apt-get install apf
$ apf update
$ apf search FILE_TO_FIND

С использованием epm:

# apt-get install eepm
$ epm -sf FILE_TO_FIND

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

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

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

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

Из RPM-файла #

Если вы хотите поставить совместимый с дистрибутивом RPM-пакет, который был скачан на компьютер

  • Установить с помощью низкоуровнего инструмента: rmp -i PATH-TO-FILE.rpm
  • С помощью высокоуровнего инструмента: apt-get install PATH-TO-FILE.rmp

В последнем случае будет установлен как пакет, так и его зависимости


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

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

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

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

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

  • На низком уровне можно воспользоваться rpm -qa
  • На высоком уровне доступна команда apt-cache pkgnames

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

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

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

Для обновления локальных пакетов необходимо выполнить apt-get update, чтобы обновить локальный кеш пакетов относительно изменений в удалённом репозитории

Затем необходимо выполнить команду apt-get dist-upgrade и проверить, что нужные пакеты обновляться

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

Обновление из файла-пакета не отличается от установки нового пакета. Важно помнить, что номер устанавливаемого пакета должен быть больше уже установленного пакета.


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

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

  • Synaptic, требует графического пользовательского окружения
  • aptitude, псевдографический менедежр, работает в консоли
  • ALT Linux Control Center, acc, графический менеджер настроек дистрибутивов ALT Linux

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

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

Процесс выпуска версий ALT Linux #

Репозитории ALT Linux, Политика разработки дистрибутивов

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

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

Выпуски Debian

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

Структура репозиториев ALT Linux #

Репозиторий представляет собой каталог, в котором находится набор пакетов, расположенных определённым образом

  • Репозитории обычно доступны по сети
  • Репозитории могут быть расположены на файловой ситеме

При доступе по сети имитируется доступ к файловой системе. Рассмотрим структуру зеркала mirror.yandex.ru

  • Сначала идёт название ветки, p9, p10 и так далее
  • Далее идёт обязательное branch
  • Затем идёт указание архитектуры, aarch64, x86_64 и т.д. noarch используется для пакетов, содержащих платформонезависимые пакеты

Внутри данного каталога находятся каталоги

  • С мета-информацией о пакетах, base
  • Каталоги с пакетами различных разделов RPMS.*, где после точки находится название раздела

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

В текущей стабильной платформе ALT Linux предоставляются следующие разделы пакетов:

  • classic — базовый набор приложений, которые можно найти в типичном Linux-дистрибутиве
  • debuginfo — набор пакетов с отладочными символами для приложений
  • gostcrypto — набор приложений с реализацией шифрования согласно ГОСТ алгоритмам
  • checkinstall — инструмент для сборки пакетов без использования специфических средств дистрибутива, не поддерживается официально

Помимо пакетов с бинарными файлами также предоставляются пакеты с исходными кодами, из которых были собраны пакеты.


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

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

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

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

rpm [p10] uri repository [component1] [component2] [...]
  • В начале находится rpm для бинарных репозиториев
  • Далее идёт пояснение о версии выпускац не обязательный параметр
  • uri содержит путь к каталогу репозитория, интернет-адрес https://... или путь к файловой системе file://...
  • Вместо repository идёт путь к конкретному выпуску p10/branch/x86_64
  • В конце указывается список разделов classic

Вопросы редактирования #

Внесение изменений в конфигурацию репозиториев #

Порядок внесения изменений следующий:

  1. Отредактировать список репозиториев
  2. Обновить локальный кеш пакетов

До обновления кеша пакетов APT не сможет выполнить установку из новых репозиториев и попытается связаться со старыми репозиториями

Установка пакетов из других репозиториев #

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

Точно не стоит подключать одновременно


Зеркала репозиториев #

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

Создание собственного зеркала #

  • Уменьшение объёма данных для скачивания из сети интернет, 1 раз для всех компьютеров организации
  • Возможность инкрементального обновления: сначала обновления для тестовой среды, затем обновление для всего парка компьютеров
  • Возможность доступа к репозиторию в окружениях с ограниченным доступом к сети интернет

Объём зеркала для одного выпуска: порядка 50-100 гигабайт


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

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

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

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

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

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

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

Переход на предыдущую версию #

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


Управление версиями ядра #

Пакеты с ядрами ОС распространяются через систему репозиториев, однако установка данных пакетов запрещена через основные инструменты

Для управления установленными ядрами и модулями используется приложение update-kernel

  • Обновление ядра до последней версии: update-kernel
  • Изменение типа ядра update-kernel -t un-def
  • Удаление старых ядер remove-old-kernels

Сначала необходимо обновить кеш пакетов, а после пытаться обновлять ядро

Разновидности ядер #

ALT Linux предоставляет разные варианты ядер:

  • std-def — как правило текущее ядро с длительной поддержкой LTS
  • un-def — последнее стабильное ядро, предоставляемого kernel.org

Особенности использования репозиториев #

Очевидные плюсы включают

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

Ограничения данной модели

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

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

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

© A. M. Васильев, 2022, CC BY-SA 4.0, andrey@crafted.su