Пакеты

Структура каталогов дистрибутива Linux

Filesystem Hierarchy Standard

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

  1. либо сложить все файлы в отдельный каталог, и научить работать оттуда,
    • хорошо для изолированных одиночных приложений, плохо для дистрибутива;

  2. либо разложить по стандартным каталогам FHS,
    • хорошо для формирования ОС, но требует инфраструктурных решений.

Ещё каталоги:

Пакет

  1. Архив с файлами, который распаковывается в / — корень ФС

    • Стандартная процедура (де)регистрации — список файлов
    • Отследить файловые конфликты
    • Задать особый тип файлов (например, конфигурационные, или не обязательно существующие)

  2. Действия при установке / удалении
    • Стандартные: обновить кеш библиотек при установке библиотеки (ldconfig), базу man-страниц, перезапустить системную службу, настройка которой меняется, и т. п.

    • Целевые: создать системного пользователя или группу, инициализировать управляющую таблицу СУБД, создать уникальную пару ключей и т. п.
  3. Зависимости на другие пакеты (рекурсивные)
    • Зачем?
      • Предотвратить разноверсицу
      • Доставить исправление ошибки в библиотеке сразу во всё ПО
      • Сэкономить место на диске / время при сборке
    • Зависимости не только на пакеты, но и на файлы или на абстракции
  4. Конфликты и альтернативы

⇒ Специальное ПО — установщик пакетов.

ALT: RPM — Redhat Package Manager + собственные доработки.

Репозиторий

Если пакетов больше одного (например, есть отдельно собранные библиотеки), они зависят друг от друга — орграф зависимостей (увы, не всегда есть, есть циклы).

⇒ Нужно индексируемое хранилище (репозиторий)

⇒ Специальное ПО — пакетный диспетчер.

ALT: APT — Advanced Packaging Tool + собственные доработки (точнее, APT-RPM, ибо стандартный APT работает с другим форматом пакетов, DPKG).

<!> Путаница с именами (aka «так пошла эволюция»)

Работа с репозиториями

Сборка пакета

Задачи:

⇒ Не требуется прав суперпользователя

Сборкой занимается утилита rpmbuild.

Пример с pcre2demo

Соберём pcre2demo:

Результат:

=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

Установка — от суперпользователя:

Д/З

  1. Установить
  2. Модифицировать Makefile из решения 01_TerminalProject таким образом, чтобы в нём была возможность установки программы в произвольное место

    • Для этого использовать make-переменную DESTDIR, в которой задаётся базовый каталог для установки (buildroot), а сама установка происходит в его подкаталоги

  3. Собрать tar-архив с исходниками (как минимум, там будут Makefle и текст программы)

  4. В репозитории с Д/З сделать (вложенный) подкаталог 03_Packaging и поместить в него

    • tar-архив с исходниками подновлённого решения 01_TerminalProject

    • spec-файл, в котором проект собирается и устанавливается
  5. Создать каталоги ~/RPM/SOURCES и ~/RPM/SPECS, скопировать туда соответствующие файлы, и убедиться, что пакет собирается, устанавливается и работает

LecturesCMC/LinuxApplicationDevelopment2026/03_Packaging (последним исправлял пользователь FrBrGeorge 2026-09-29 04:10:50)