Пакеты
Структура каталогов дистрибутива Linux
/usr/bin/ — исполняемые файлы
/usr/sbin/, /usr/libexec/ — исполняемые файлы, которые не нужно запускать ☺
/usr/lib64/ — библиотеки (иногда бывает /usr/lib/)
/etc/ — конфигурационные файлы
/usr/lib/что-то-там/… — конфигурационные файлы, которые не надо менять
/usr/share — архитектурно независимые файлы
/usr/share/doc, /usr/share/man, /usr/share/info — документация
/usr/share/locale/ — локали
/usr/share/icons/, /usr/share/applications/ — привязка к графической среде
/opt, /srv — каталоги для складывания туда всего, что ни попадя
- …
Для того, чтобы поместить в дистрибутив готовый программный продукт, надо
- либо сложить все файлы в отдельный каталог, и научить работать оттуда,
хорошо для изолированных одиночных приложений, плохо для дистрибутива;
- либо разложить по стандартным каталогам FHS,
- хорошо для формирования ОС, но требует инфраструктурных решений.
Ещё каталоги:
/usr/local/… — то же, что /usr, но пакеты из дистрибутива туда не ставятся
$HOME/.local/… — то же, что /usr, но для каждого пользователя свой
Пакет
Архив с файлами, который распаковывается в / — корень ФС
- Стандартная процедура (де)регистрации — список файлов
- Отследить файловые конфликты
Задать особый тип файлов (например, конфигурационные, или не обязательно существующие)
- Действия при установке / удалении
Стандартные: обновить кеш библиотек при установке библиотеки (ldconfig), базу man-страниц, перезапустить системную службу, настройка которой меняется, и т. п.
- Целевые: создать системного пользователя или группу, инициализировать управляющую таблицу СУБД, создать уникальную пару ключей и т. п.
- Зависимости на другие пакеты (рекурсивные)
- Зачем?
- Предотвратить разноверсицу
- Доставить исправление ошибки в библиотеке сразу во всё ПО
- Сэкономить место на диске / время при сборке
- Зависимости не только на пакеты, но и на файлы или на абстракции
- Зачем?
- Конфликты и альтернативы
⇒ Специальное ПО — установщик пакетов.
ALT: RPM — Redhat Package Manager + собственные доработки.
- Установка и удаление пакета
- Попытка установить пакет с зависимостями или удалить пакет с зависимостями на него
rpmquery (-ql, -qi и т. д.)
Репозиторий
Если пакетов больше одного (например, есть отдельно собранные библиотеки), они зависят друг от друга — орграф зависимостей (увы, не всегда есть, есть циклы).
⇒ Нужно индексируемое хранилище (репозиторий)
Готовые индексы
- Пересчёт зависимостей при обновлении пакетов
- Репозиториев может быть несколько
⇒ Специальное ПО — пакетный диспетчер.
- Работает с репозиториями
- Замыкает граф зависимостей (заодно выбирая версии поновее)
- Скачивает пакеты
- Даёт команды установщику
ALT: APT — Advanced Packaging Tool + собственные доработки (точнее, APT-RPM, ибо стандартный APT работает с другим форматом пакетов, DPKG).
Путаница с именами (aka «так пошла эволюция»)
Работа с репозиториями
- (Права суперпользователя)
- Подключение репозиториев
- Обновление индексов
- Поиск по репозиториям
- Установка / удаление графа пакетов по вершине
- Обновление системы
Сборка пакета
Задачи:
- Проверить, достаточно ли сборочного окружения
- Распаковать / скопировать в каталог сборки исходные тексты
- Запустить процедуру сборки
Запустить процедуру установки во временный каталог
- Сформировать пакет на базе проделанной установки
⇒ Не требуется прав суперпользователя
Сборкой занимается утилита rpmbuild.
Файл спецификации (aka spec-файл)
- Исходники (желательно в архиве)
Пример с pcre2demo
Соберём pcre2demo:
- Файлы:
=george@linuxprac:~> tree RPM RPM ├── SOURCES │ └── pcre2-demo-0.0.1.tar.gz └── SPECS └── pcre2-demo.spec 3 directories, 2 files =george@linuxprac:~> tar tvf RPM/SOURCES/pcre2-demo-0.0.1.tar.gz -rw-r--r-- george/george 16914 2026-09-28 23:23 pcre2-demo.c -rw-r--r-- george/george 107 2026-09-28 23:33 README - Spec:
=george@linuxprac:~> cat RPM/SPECS/pcre2-demo.spec Name: pcre2-demo Version: 0.0.1 Release: alt1 Group: Other License: MIT URL: https://uneex.org/LecturesCMC/LinuxApplicationDevelopment2026/03_Packaging Source: %name-%version.tar.gz Summary: PCRE demo re-package BuildRequires: libpcre2-devel %description PCRE demo re-package winth minimal spec. Used for LecturesCMC/LinuxApplicationDevelopment2026/03_Packaging. %prep %setup -c %build cc *.c -g -lpcre2-8 -o %name %install install -D %name %buildroot%_bindir/%name install -m644 -D README %buildroot%_datadir/%{name}_README %files %_bindir/* %_datadir/*TODO — снабдить всё комментариями
Сборка: rpmbuid -ba
TODO — снабдить вывод комментариями
Результат:
=george@linuxprac:~> tree RPM
RPM
├── BUILD
│ └── pcre2-demo-0.0.1
│ ├── pcre2-demo
│ ├── pcre2-demo.c
│ └── README
├── RPMS
│ └── x86_64
│ ├── pcre2-demo-0.0.1-alt1.x86_64.rpm
│ └── pcre2-demo-debuginfo-0.0.1-alt1.x86_64.rpm
├── SOURCES
│ └── pcre2-demo-0.0.1.tar.gz
├── SPECS
│ └── pcre2-demo.spec
└── SRPMS
└── pcre2-demo-0.0.1-alt1.src.rpmЧто такое -debuginfo пакет?
Что такое .src.rpm?
Установка — от суперпользователя:
apt-get install ~george/RPM/RPMS/pcre2-demo-0.0.1-alt1.x86_64.rpm
Д/З
- Установить
- не абы какой Linux, а
или одну из основных регулярных сборок
Доставить пакеты, необходимые для сборки Д/З про ncurses
- не абы какой Linux, а
Модифицировать Makefile из решения 01_TerminalProject таким образом, чтобы в нём была возможность установки программы в произвольное место
Для этого использовать make-переменную DESTDIR, в которой задаётся базовый каталог для установки (buildroot), а сама установка происходит в его подкаталоги
Собрать tar-архив с исходниками (как минимум, там будут Makefle и текст программы)
В репозитории с Д/З сделать (вложенный) подкаталог 03_Packaging и поместить в него
tar-архив с исходниками подновлённого решения 01_TerminalProject
- spec-файл, в котором проект собирается и устанавливается
Создать каталоги ~/RPM/SOURCES и ~/RPM/SPECS, скопировать туда соответствующие файлы, и убедиться, что пакет собирается, устанавливается и работает
