RPM (Red Hat Package Manager) используется для управления установкой и обновлением программного обеспечения на системах на базе RPM, таких как RHEL, CentOS и Fedora. Понимание структуры RPM и правильная подготовка пакета позволяют автоматизировать развёртывание приложений и снизить риск ошибок при установке.
Для создания RPM необходимо подготовить исходные файлы, определить зависимости и написать SPEC-файл, который задаёт структуру пакета, инструкции по сборке и установке. SPEC-файл содержит разделы prep, build, install и files, где конкретно указываются действия на каждом этапе.
Перед сборкой пакета важно настроить директории rpmbuild и убедиться в наличии всех требуемых библиотек и инструментов. Неправильная структура каталогов или пропущенные зависимости часто становятся причиной ошибок сборки и некорректной работы пакета.
После сборки RPM необходимо провести тестирование: проверить установку, удаление и корректность всех файлов в системе. Для этого применяются команды rpm -ivh и rpm -e, а также проверка цифровых подписей пакета, если это требуется для продакшн-среды.
Следуя этому руководству, можно создать работоспособный RPM-пакет с минимальным количеством ошибок и с учётом особенностей конкретного приложения и целевой операционной системы.
Подготовка исходных файлов для RPM
Перед сборкой RPM необходимо собрать все исходные файлы приложения в единую директорию. Обычно создают архив с расширением .tar.gz или .tar.bz2, включающий исходный код, конфигурационные файлы и скрипты установки. Имя архива должно соответствовать шаблону имя-программы-версия.tar.gz, например myapp-1.2.3.tar.gz, чтобы rpmbuild корректно его распознал.
Все патчи и дополнительные файлы следует разместить в подкаталоге SOURCES в структуре rpmbuild. Для каждого патча необходимо указать применяемую версию и порядок применения. Рекомендуется проверять контрольные суммы файлов с помощью md5sum или sha256sum, чтобы исключить повреждение архива перед сборкой.
Если приложение использует сторонние библиотеки, их исходники и файлы зависимостей тоже должны быть подготовлены. Все файлы должны иметь правильные права доступа: скрипты – 755, конфигурационные файлы – 644. Это гарантирует корректную установку и работу пакета на целевой системе.
Для проектов с автоматической сборкой полезно создать README или INSTALL файл, где подробно описываются шаги компиляции и установки. Эти файлы можно включить в RPM для удобства администраторов и упрощения отладки при тестировании пакета.
Установка и настройка rpm-build
Для сборки RPM-пакетов требуется пакет rpm-build. На системах RHEL, CentOS и Fedora установка выполняется командой sudo dnf install rpm-build или sudo yum install rpm-build в зависимости от версии системы. Проверить успешную установку можно командой rpm —version.
После установки создаётся стандартная структура каталогов в домашней директории пользователя: ~/rpmbuild/BUILD, ~/rpmbuild/RPMS, ~/rpmbuild/SOURCES, ~/rpmbuild/SPECS, ~/rpmbuild/SRPMS. Если директории отсутствуют, их можно создать вручную с помощью rpmdev-setuptree, который автоматически создаёт все необходимые подкаталоги.
В конфигурационном файле ~/.rpmmacros рекомендуется задать переменные %_topdir для указания пути к корневой директории rpmbuild и %_tmppath для временных файлов сборки. Это позволяет изменять расположение каталогов без изменения системных настроек и упрощает многопользовательскую сборку пакетов.
Для сборки пакетов, требующих компиляции, необходимо убедиться, что установлены компиляторы и утилиты сборки: gcc, make, autoconf, automake. Их наличие можно проверить через gcc —version и make —version. Без этих инструментов сборка RPM с исходными файлами невозможна.
Создание структуры каталогов для пакета
Структура каталогов для RPM-пакета должна соответствовать стандарту rpmbuild, чтобы сборка прошла без ошибок. В домашней директории пользователя создаются следующие каталоги:
- BUILD – временные файлы сборки пакета.
- RPMS – готовые бинарные RPM-файлы, разделённые по архитектурам.
- SOURCES – исходные архивы, патчи и дополнительные файлы.
- SPECS – SPEC-файлы с инструкциями сборки и установки.
- SRPMS – исходные RPM-пакеты, включающие исходники и SPEC-файлы.
Для организации пользовательских пакетов внутри BUILD можно создать отдельные подкаталоги с именами проектов. Это облегчает отслеживание версий и управление патчами:
- Создать подкаталог myapp-1.2.3 в BUILD.
- Разместить исходники и патчи в SOURCES с соответствующими именами.
- Создать SPEC-файл в SPECS с точным указанием исходного архива и всех зависимостей.
Важно соблюдать права доступа к каталогам: 755 для всех директорий и 644 для файлов, чтобы rpmbuild имел возможность читать и записывать данные во время сборки. Некорректные права часто приводят к ошибкам при создании RPM.
Написание SPEC-файла для RPM
SPEC-файл задаёт инструкцию для сборки RPM-пакета, включая метаданные, зависимости, скрипты и список файлов. Файл должен располагаться в каталоге SPECS и иметь имя вида имя-программы.spec, например myapp.spec.
Основные разделы SPEC-файла:
| Раздел | Назначение | Пример |
|---|---|---|
| Header | Метаданные пакета: имя, версия, релиз, описание, лицензия, URL, группы | Name: myapp Version: 1.2.3 Release: 1%{?dist} License: MIT Summary: Приложение для мониторинга |
| Prep | Подготовка исходников: распаковка архивов, применение патчей | %setup -q %patch0 -p1 |
| Build | Компиляция исходного кода и сборка бинарных файлов | %configure make %{?_smp_mflags} |
| Install | Копирование файлов в временный каталог для пакета | make install DESTDIR=%{buildroot} |
| Files | Список файлов и каталогов, которые будут включены в RPM | /usr/bin/myapp /etc/myapp/config.ini |
| Changelog | История изменений для версии пакета | * Thu Nov 21 2025 Developer <dev@example.com> — 1.2.3-1 — Добавлена поддержка systemd |
При написании SPEC-файла важно точно указывать версии зависимостей через Requires и корректно использовать макросы rpmbuild для совместимости с разными системами. Ошибки в разделах Prep и Install приводят к сбоям сборки и некорректной установке пакета.
Добавление файлов и скриптов в пакет
Файлы и скрипты включаются в RPM через раздел %files SPEC-файла и соответствующие скриптовые макросы. Все пути должны указывать на расположение файлов в файловой системе после установки пакета.
Рекомендуется разделять файлы по категориям и назначению:
- Бинарные файлы – /usr/bin или /usr/local/bin.
- Конфигурационные файлы – /etc/имя_программы с указанием макроса %config для сохранения изменений пользователя при обновлении.
- Логи и временные файлы – /var/log/имя_программы или /var/tmp.
- Документация – /usr/share/doc/имя_программы с макросом %doc.
Скрипты выполняются на этапах установки и удаления пакета. В SPEC-файле они задаются через:
- %pre – выполняется до установки файлов.
- %post – выполняется после установки.
- %preun – перед удалением пакета.
- %postun – после удаления пакета.
Скрипты должны быть короткими и проверять существование каталогов и файлов, чтобы избежать ошибок при повторной установке или удалении. Например, проверка и создание директории логов:
if [ ! -d /var/log/myapp ]; then mkdir -p /var/log/myapp; fi
Все файлы, добавляемые в пакет, должны иметь корректные права доступа: исполняемые файлы – 755, конфигурационные – 644. Это обеспечивает корректную работу приложения после установки RPM.
Сборка RPM пакета с помощью rpmbuild
Для сборки RPM используется команда rpmbuild с указанием пути к SPEC-файлу. Стандартная команда выглядит так: rpmbuild -ba ~/rpmbuild/SPECS/myapp.spec. Флаг -ba собирает как бинарный, так и исходный RPM.
Перед запуском сборки следует убедиться, что все исходники и патчи находятся в каталоге SOURCES и соответствуют имени и версии, указанным в SPEC-файле. Любое несоответствие приведёт к ошибке file not found.
Для многопоточности сборки можно использовать макрос %{?_smp_mflags} в разделе Build SPEC-файла, что ускоряет компиляцию на системах с несколькими ядрами.
После завершения сборки проверяется наличие RPM-файлов в каталогах RPMS/архитектура и SRPMS. Их имена должны соответствовать шаблону имя-версия-релиз.arch.rpm, например myapp-1.2.3-1.x86_64.rpm. Если файлы отсутствуют, необходимо изучить лог сборки и исправить ошибки в SPEC-файле или исходниках.
Проверка и тестирование собранного RPM
После сборки RPM необходимо убедиться, что пакет корректно устанавливается и удаляется. Для проверки используют команду rpm -ivh для установки и rpm -e для удаления. Проверяется наличие всех файлов в системе и правильность их расположения.
Для проверки целостности и подписей RPM применяют rpm -K имя_пакета.rpm. Это позволяет убедиться, что пакет не повреждён и соответствует стандартам безопасности.
Важно проверить работу приложения после установки: запуск бинарных файлов, доступ к конфигурации и создание логов. Для приложений с системными сервисами рекомендуется тестировать запуск через systemctl start/stop имя_сервиса и проверять статус с помощью systemctl status.
Проверка зависимостей выполняется командой rpm -qpR имя_пакета.rpm, которая показывает список необходимых библиотек и пакетов. Это позволяет выявить недостающие зависимости до установки на целевую систему.
Для многопакетных проектов полезно создавать тестовую виртуальную машину или контейнер, где проверяется установка, обновление и удаление RPM без риска повреждения основной системы.
Установка и удаление RPM для проверки
Если приложение устанавливается с системными сервисами, их состояние проверяют через systemctl status имя_сервиса и выполняют запуск с помощью systemctl start имя_сервиса. Это позволяет убедиться, что сервис корректно интегрируется в систему.
Для удаления RPM применяется команда rpm -e имя_пакета. При этом проверяется очистка всех файлов и каталогов, за исключением конфигурационных файлов, если они были помечены макросом %config. Удаление с сохранением изменений пользователя помогает избежать потери важных данных при обновлениях.
После установки и удаления рекомендуется повторно проверять зависимости через rpm -qa | grep имя_пакета и убедиться, что пакет полностью удалён из системы. Это гарантирует корректное поведение при повторных тестах или обновлениях.
Вопрос-ответ:
Какие исходные файлы нужны для создания RPM-пакета?
Для сборки RPM требуются архивы с исходным кодом приложения, патчи, конфигурационные файлы и скрипты установки. Все файлы помещаются в каталог SOURCES, а их имена должны совпадать с указанными в SPEC-файле. Контрольные суммы md5sum или sha256sum помогают убедиться, что файлы не повреждены.
Как правильно настроить rpm-build перед сборкой пакета?
После установки rpm-build нужно создать структуру каталогов с помощью rpmdev-setuptree. Рекомендуется задать переменные в ~/.rpmmacros: %_topdir для корневой директории rpmbuild и %_tmppath для временных файлов. Также необходимо убедиться, что установлены компиляторы и утилиты сборки, такие как gcc, make, autoconf и automake.
Какие разделы включает SPEC-файл и как их использовать?
Основные разделы SPEC-файла: Header — метаданные пакета, Prep — подготовка исходников, Build — компиляция, Install — установка в временный каталог, Files — список включаемых файлов и Changelog — история изменений. В разделе Files указываются пути для бинарных, конфигурационных и документационных файлов с корректными правами доступа.
Каким образом проверять корректность собранного RPM-пакета?
После сборки пакет устанавливают командой rpm -ivh и удаляют через rpm -e. Проверяется наличие файлов в системе, права доступа и работа приложения. Для пакетов с сервисами проверяют их запуск и статус через systemctl start/stop/ status. Также проверяют зависимости с помощью rpm -qpR имя_пакета.rpm и цифровые подписи через rpm -K.
Как добавлять скрипты для установки и удаления в RPM?
Скрипты включаются в SPEC-файл через макросы: %pre — перед установкой, %post — после установки, %preun — перед удалением и %postun — после удаления. Скрипты должны проверять существование каталогов и файлов, например, создавать директорию логов только если она отсутствует: if [ ! -d /var/log/myapp ]; then mkdir -p /var/log/myapp; fi. Это предотвращает ошибки при повторной установке или удалении.
Как проверить, что собранный RPM-пакет устанавливается корректно и все файлы размещены правильно?
После сборки пакета его устанавливают командой rpm -ivh имя_пакета.rpm. Затем проверяют наличие всех файлов в указанных каталогах, соответствие прав доступа и работу приложения. Для сервисов выполняют запуск через systemctl start имя_сервиса и проверяют статус командой systemctl status. Для удаления пакета используют rpm -e имя_пакета и проверяют, что файлы и каталоги очищены, за исключением конфигурационных файлов, если они помечены макросом %config. Дополнительно проверяют зависимости через rpm -qpR имя_пакета.rpm и целостность пакета с помощью rpm -K.
