Управление пакетами в GNU/Linux #
Васильев Андрей Михайлович, 2022
Версии презентации
Минимальное приложение #
Рассмотрим нативное приложение под операционную систему, 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
- Существенно увеличивается вероятность проблем с безопасностью, т.к. разработчики не выпускают новые версии приложений с обновлениями библиотек
В рамках Linux также можно воспользоваться данным способом распространения приложений
Процесс сборки большого приложения #
Рассмотрим процесс компиляции приложения на C++
- Необходимо получить компилятор языка
- Необходимо скомпилировать библиотеки, от которых зависит приложение
- Скорее всего потребуется скомпилировать библиотеки, от которых зависят библиотеки
- В конце необходимо скомпилировать своё приложение
Для дистрибуции приложения потребуются исполняемый файл приложения, а также динамически загружаемые библиотеки, ресурсы приложения собрать вместе и предоставить пользователю для использования
При работе с приложениями, реализованных на скриптовых языках программирования, потребуется пользователю предоставить помимо приложения ещё и интерпретатор
Понятие дистрибутива ОС #
В экосистеме Linux существует множество «дистрибутивов», которые позволяют пользователям запускать свои приложения и решать свои инфраструктурные задачи
Если абстрагироваться от деталей, то все дистрибутивы
- Используют общее ядро Linux
- Позволяют запускать приложения под данное ядро
- Предоставляют инструменты для управления установленными приложениями
- Предоставляют инструменты для настройки поведения ОС
Слово «дистрибутив» является калькой с английского «distribution», которым описывается набор совместимого программного обеспечения. Совместимость должна быть реализована на уровне бинарных кодов
Примерами дистрибутивов могут служить:
- Windows 10 1809
- macOS 13.0
Назначение дистрибутива #
Дистрибутивы исторически появились для решения задачи поставки данных до конечных пользователей
- Пользователь дистрибутива получает ПО в бинарном формате
- Пользователю нет необходимости скачивать исходный код приложения
- Пользователю не надо разбираться в системе сборки приложение, тем более со временем увеличивается число языков и систем сборок
- Всё ПО в дистрибутиве корректно работает друг с другом
- Можно установить только нужное ПО, а не все программы
- Собранный дистрибутив является стабильной платформой для поставки ПО от третьих производителей
- Дистрибутивы обычно получают исправления, связанные с проблемами в безопасности
Дистрибутивы позволяют получить быстро доступ к ПО унифицированным способом
Скорость выпуска дистрибутивов #
Производители обычно выпускают новые дистрибутивы на регулярной основе, один раз в несколько месяцев или лет
Дистрибутив | Дата выпуска | Окончание поддержки |
---|---|---|
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 и т.д.
- Менеджеры пакетов языков программирования 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 — поддерживать)
- Исходный код для пакета берётся от производителя приложения
- Мейнтейнер создаёт конфигурацию для сборочной системы дистрибутива, фиксирует параметры сборки и при необходимости вносит изменения в исходный код проекта
- Загружает модифицированный исходный код и конфигурацию в центральное хранилище производителя дистрибутива для включения в хранилище пакетов, в репозиторий
Пакеты могут быть созданы также разработчиками ПО
- Пользователи могут скачать пакет с сайта разработчика и установить его, если он совместим с установленным дистрибутивом
- При выходе новой версии ПО пользователю необходимо будет опять скачать и поставить приложение
Репозитории #
Репозиторий представляет собой хранилище пакетов дистрибутива
- Производители дистрибутивов предоставляют для каждого дистрибутива свои репозитории, которые включают тысячи собранных пакетов
- Производители ПО могут предоставлять свои репозитории
- Пакетный менеджер может работать со множеством репозиториев одновременно
- Пакетный менеджер может обновлять пакеты на локальном компьютере, когда в репозитории появились более свежие версии
- Официальные репозитории могут содержать подразделы:
- Ввиду патентных ограничений
- Ввиду ограничений на лицензию ПО
- Ввиду различий в бинарных архитектурах
Зависимости пакетов #
Для работы приложения зачастую недостаточно только одного исполняемого файла, нужны также библиотеки, интерпретаторы, возможно другие исполняемые файлы
- Все пакеты, необходимые для работы приложения, указываются в списках зависимостей
- У зависимых пакетов могут быть свои собственные зависимости
- Библиотеки в дистрибутивах 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 #
- Новая версия пакета обычно попадает в 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
Вопросы редактирования #
Внесение изменений в конфигурацию репозиториев #
Порядок внесения изменений следующий:
- Отредактировать список репозиториев
- Обновить локальный кеш пакетов
До обновления кеша пакетов APT не сможет выполнить установку из новых репозиториев и попытается связаться со старыми репозиториями
Установка пакетов из других репозиториев #
Перед подключением новых репозиториев убедитесь, что они все содержат совместимые между собой пакеты. Обычно это репозитории, предназначенные для одного выпуска дистрибутива
Точно не стоит подключать одновременно
Зеркала репозиториев #
Для ускорения процесса установки пакетов рекомендуется использовать зеркало, скорость скачивания с котрого, будет наибольшей
Создание собственного зеркала #
- Уменьшение объёма данных для скачивания из сети интернет, 1 раз для всех компьютеров организации
- Возможность инкрементального обновления: сначала обновления для тестовой среды, затем обновление для всего парка компьютеров
- Возможность доступа к репозиторию в окружениях с ограниченным доступом к сети интернет
Объём зеркала для одного выпуска: порядка 50-100 гигабайт
Переход на новую версию дистрибутива #
Пользователи зачастую хотят перейти на новую версию дистрибутива:
- Чтобы получить новые версии ПО, включающие новые функции и оптимизации
- Чтобы получить новую версию ядра Linux, чтобы получить поддержку нового оборудования, т.к. драйвера обычно поставляются внутри ядра Linux
- Переход необходим, т.к. старая версия перестала поддерживаться производителем, т.е. из соображений безопасности
Проблемы обновления:
- Новые версии служб могут могут изменить своё поведение и формат конфигурационных файлов
- Приложения, распространяемые не через пакетный менеджер, могут перестать работать, так как станут бинарно несовместимыми
- В новой версии дистрибутива может не поставляться нужное ПО, потребуется переход на альтернативу
- Скорее всего потребуется обновление настроек ПО
Выполнение перехода на новую версию #
- Отредактируйте конфигурацию пакетного менеджера, чтобы она ссылалась на новую версию дистрибутива
- Обновите локальный кеш пакетов,
apt-get update
- Выполните обновление дистрибутива,
apt-get dist-upgrade
- При выполнении операции
dist-upgrade
часть пакетов может быть удалена, их надо будет поставить заново при необходимости - Для перехода можно использовать графические инструменты, чтобы помочь алгоритму разрешения зависимостей выбрать нужные версии пакетов
Переход на предыдущую версию #
Обычно не поддерживается. Поэтому перед сложным обновлением необходимо выполнить резервную копию развёрнутого дистрибутива ОС, чтобы можно было вернуться к данной версии
Управление версиями ядра #
Пакеты с ядрами ОС распространяются через систему репозиториев, однако установка данных пакетов запрещена через основные инструменты
Для управления установленными ядрами и модулями используется приложение update-kernel
- Обновление ядра до последней версии:
update-kernel
- Изменение типа ядра
update-kernel -t un-def
- Удаление старых ядер
remove-old-kernels
Сначала необходимо обновить кеш пакетов, а после пытаться обновлять ядро
Разновидности ядер #
ALT Linux предоставляет разные варианты ядер:
std-def
— как правило текущее ядро с длительной поддержкой LTSun-def
— последнее стабильное ядро, предоставляемого kernel.org
Особенности использования репозиториев #
Очевидные плюсы включают
- Пользователи могут получить доступ к большой коллекции ПО унифицированным образом
- Мейнтенерами пакетов являются не разработчики ПО, а отдельные люди, что снижает нагрузку на разработчика
- ПО внутри репозитория совместимо друг с другом, используются общие библиотеки
Ограничения данной модели
- При использовании репозиториев пользователи обычно работают не с самой последней версией ПО, а версий, что была доступна на момент формирования репозитория
- ПО может не входить в состав репозитория от производителя
- Дистрибутив может поставлять только более свежую версию ПО, например Java 17 вместо Java 11
Установка ПО альтернативными способами #
- Скачивание приложения из архива, которое бинарно совместимо с дистрибутивом
- Компиляция приложения из исходных кодов
- Установка пакетов скриптовых языков
- Использование систем пакетирования приложений и их доставки, которые не зависят от дистрибутива: AppImage, Docker, Flatpack, Snappy, Steam