В этом материале будет рассказана практическая часть использования git, какие основные команды нужно знать, как пользоваться, и как они помогают решать повседневные задачи.
RPM (Red Hat Package Manager)— это система управления пакетами программного обеспечения, которая используется для установки, обновления, запроса, проверки и удаления пакетов программного обеспечения в системах на базе Linux. Изначально она была разработана компанией Red Hat, а затем перенята многими другими дистрибутивами Linux.
RPM-пакеты, обычно обозначаемые расширением .rpm, содержат все необходимые файлы, метаданные и скрипты, необходимые для установки программного обеспечения в системе Linux и управления им.Базовый синтаксис RPM в Linux
Базовый синтаксис команды rpm выглядит следующим образом:
|
1 |
rpm [options] [package_name] |
Здесь
- [options] представляют собой различные параметры командной строки, которые управляют поведением команды rpm.
- [package_name] обозначает имя пакета RPM, с которым вы хотите работать.
Параметры, доступные в команде rpm в Linux
Эти параметры обеспечивают широкий спектр функций и возможностей управления при работе с пакетами RPM в системах Linux. С их помощью можно эффективно устанавливать, обновлять, запрашивать пакеты и управлять ими.
|
Options |
Description |
|---|---|
|
-i, —install |
Установите пакет RPM. |
|
-U, —upgrade |
Обновите пакет RPM. |
|
-q, —query |
Запрос к пакету(ам) RPM или отображение информации об установленных пакетах. |
|
-a, —all |
При использовании с параметром -q выводит список всех установленных пакетов. |
|
-V, —verify |
Проверьте целостность установленных пакетов. |
|
-e, —erase |
Удаление или очистка пакета RPM |
|
-F, —freshen |
Обновляйте пакеты, но только если пакет с таким же названием уже установлен. |
|
—nodes |
Игнорировать зависимости пакетов при установке или удалении. |
|
—test |
Тестовый режим; показывает, что сделала бы команда rpm без каких-либо изменений. |
|
-h, —hash |
Отображение хэштегов (#) для обозначения хода установки или удаления. |
|
—force |
Принудительная установка, даже если она приводит к перезаписи файлов из других пакетов или вызывает другие проблемы. |
|
—reinstall |
Переустановите пакет RPM. |
|
—import |
Импортируйте ключ GPG для проверки подписи пакета. |
|
—resign |
Переподпишите пакет RPM с помощью нового ключа GPG. |
|
-F, —file |
При использовании с параметром -q определяет, какому пакету принадлежит тот или иной файл. |
|
—package |
При использовании с параметром -q запрашивает информацию о файле или пакете RPM. |
|
—setperms |
Установите для файлов пакета права доступа по умолчанию. |
|
—setugids |
Установите для файлов пакета права собственности пользователя и группы по умолчанию. |
|
—nodigest |
Отключите проверку дайджестов при установке или обновлении пакетов. |
|
—rebuilddb |
Перестройте базу данных RPM. |
|
—testsig |
Проверьте цифровую подпись пакета RPM. |
|
—showrc |
Показать параметры конфигурации RPM. |
|
-h, —help |
Отобразите справочную информацию. |
|
—version |
Отобразите версию RPM. |
Итак — старт
Сборка RPM-пакета включает несколько этапов: подготовку среды, создание файла спецификации (spec-файла), подготовку исходных файлов и запуск процесса сборки с помощью утилиты
|
1 |
rpmbuild |
на самом деле информации мого, но все они написаны не совсем понятно. Я опишу процесс сборки по шагам на основе linux CentOS 8.3
Установка необходимого программного обеспечения
Для создания пакета RPM необходимо установить следующие пакеты:
|
1 |
$ sudo dnf install -y rpmdevtools rpmlint |
После установки rpmdevtools создайте дерево файлов, необходимое для сборки пакетов RPM:
|
1 |
$ rpmdev-setuptree |
Вы собираете RPM-пакеты как обычный пользователь (не root), хотя можно и от root — ничего страшного в этом нет, поэтому среда сборки находится в вашем домашнем каталоге. Она содержит следующую структуру каталогов, созданную предыдущей командой:
|
1 2 3 4 5 6 |
rpmbuild/ ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS |
- Каталог BUILD используется в процессе сборки RPM-пакета. Здесь хранятся, перемещаются и т. д. временные файлы.
- В каталоге RPMS находятся RPM-пакеты, собранные для разных архитектур и noarch, если это указано в
.specфайле или в процессе сборки. - В каталоге SOURCES, как следует из названия, хранятся исходные коды. Это может быть простой скрипт, сложный проект на языке C, который нужно скомпилировать, предварительно скомпилированная программа и т. д. Обычно исходные файлы сжимаются в
.tar.gzили.tgzфайлов. - В каталоге SPEC находятся файлы
.spec. Файл.specопределяет способ сборки пакета. Подробнее об этом позже. - В каталоге SRPMS находятся пакеты
.src.rpm. Исходный пакет RPM не привязан к архитектуре или дистрибутиву. Фактическая сборка пакета.rpmоснована на пакете.src.rpm.
Пакет .src.rpm очень гибок в использовании, поскольку его можно собрать и пересобрать для любого другого дистрибутива на основе RPM и любой другой архитектуры.
Теперь вы знаете, что находится в каждом каталоге, так что давайте создадим простой скрипт для распространения:
|
1 2 3 4 |
$ cat << EOF >> hello.sh #!/bin/sh echo "Hello world" EOF |
В результате создается сценарий оболочки под названием hello.sh, который выводит на терминал сообщение «Hello world». Это простой пример, но его достаточно, чтобы продемонстрировать процесс упаковки.
Поместите сценарий в указанный каталог
. Чтобы создать пакет для своего сценария, поместите его в каталог, в котором его ожидает система сборки RPM. Создайте для него каталог, используя семантическое управление версиями, как это делают в большинстве проектов, а затем переместите hello.sh в него:
|
1 2 |
$ mkdir hello-0.0.1 $ mv hello.sh hello-0.0.1 |
Большая часть исходного кода распространяется в виде архива, поэтому для создания архивного файла используйте команду tar:
|
1 |
$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1 |
Затем переместите только что созданный архив в каталог SOURCES:
|
1 |
$ mv hello-0.0.1.tar.gz SOURCES |
Создайте файл .spec
. Пакет RPM определяется файлом .spec . Синтаксис файла .spec строг, но rpmdev может сгенерировать для вас шаблонный файл:
|
1 |
$ rpmdev-newspec hello |
В результате создается файл с именем hello.spec, который необходимо переместить в каталог SPECS . Запустите tree ~/rpmbuild , чтобы увидеть структуру каталогов:
|
1 2 3 4 5 6 7 8 9 |
/home/tux/rpmbuild/ ├── BUILD ├── BUILDROOT ├── RPMS ├── SOURCES │ └── hello-0.0.1.tar.gz ├── SPECS │ └── hello.spec └── SRPMS |
Сгенерированный hello.spec файл — хорошая отправная точка, но в нем нет конкретной информации о том, что именно вы собираете. Сгенерированный .spec файл предполагает, что я собираюсь скомпилировать и собрать программное обеспечение.
Вы упаковываете Bash-скрипт, поэтому его можно немного упростить. Например, здесь нет процесса Build, потому что нет кода, который нужно компилировать. Я добавил BuildArch: noarch, потому что этот пакет подходит для 32-битных, 64-битных систем, Arm и любых других архитектур процессоров, на которых работает Bash.
Я также добавил Requires: bash, чтобы пакет гарантировал установку Bash. Этот простой скрипт «Hello World» работает в любой оболочке, но это не относится ко всем скриптам, так что это хороший способ продемонстрировать зависимости.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Name: hello Version: 0.0.1 Release: 1%{?dist} Summary: A simple hello world script BuildArch: noarch License: GPL Source0: %{name}-%{version}.tar.gz Requires: bash %description A demo RPM build %prep %setup -q %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/%{_bindir} cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir} %clean rm -rf $RPM_BUILD_ROOT %files %{_bindir}/%{name}.sh %changelog * Sun Nov 18 2020 Valentin Bajrami <valentin.bajrami@slimmer.ai> - 0.0.1 - First version being packaged |
Как вы можете заметить, в .spec файлах много ярлыков. Они называются макросами, и в документации по упаковке Fedora есть отличный список того, что доступно. Важно использовать макросы в ваших .spec файлах. Они помогают обеспечить согласованность во всех системах RPM, помогают избежать ошибок в именах файлов и нумерации версий, а также упрощают обновление .spec файла при выпуске новой версии вашего скрипта.
Например, необходимо указать, какие именно файлы устанавливаются в разделе %files. Здесь я явно указал следующую строку:
|
1 2 3 |
%files %{_bindir}/%{name}.sh |
Это работает, потому что я хочу, чтобы скрипт устанавливался в %{_bindir} (это макрос, который по умолчанию преобразуется в /usr/bin, но его можно настроить, если пользователь хочет установить программу в другое место, например в /usr/local/bin). Значения макросов можно проверить, выполнив следующую команду:
|
1 2 |
$ rpm --eval '%{_bindir}' /usr/bin |
Другие полезные макросы:
%{name}имя пакета (как указано в поле Name:)%{version}версия пакета (как указано в поле Version:)%{_datadir}общие данные (/usr/sbinпо умолчанию)%{_sysconfdir}каталог конфигурации (/etcпо умолчанию)
Проверка файла .spec на наличие ошибок (rpmlint)
Команда rpmlint может находить ошибки в .spec файлах:
|
1 2 3 4 |
$ rpmlint ~/rpmbuild/SPECS/hello.spec SPECS/hello.spec: W: no-%build-section SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz 0 packages and 1 specfiles checked; 0 errors, 2 warnings. |
Обнаружены 2 ошибки, но обе они допустимы. Код для сборки отсутствует, поэтому нет необходимости в разделе %build, а исходный архив представляет собой локальный файл без сетевого URL.
Все выглядит хорошо.
Сборка пакета (rpmbuild)
Чтобы собрать пакет RPM, используйте команду rpmbuild . Ранее в этом руководстве я рассказывал о разнице между .src.rpm (исходным пакетом RPM) и пакетом .rpm .
Чтобы создать пакет .src rpm:
|
1 |
$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec |
Флаги -bs имеют следующие значения:
- -b: сборка
- -s: исходный код
Чтобы создать бинарный пакет .rpm:
|
1 |
$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec |
Флаги -bb имеют следующие значения:
- -b: сборка
- -b: бинарный файл
Используйте -ba для сборки обоих проектов.
После завершения процесса сборки у вас будет следующая структура каталогов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ tree ~/rpmbuild/ /home/tux/rpmbuild/ ├── BUILD │ └── hello-0.0.1 │ ├── hello.sh ├── BUILDROOT ├── RPMS │ └── noarch │ └── hello-0.0.1-1.el8.noarch.rpm ├── SOURCES │ └── hello-0.0.1.tar.gz ├── SPECS │ └── hello.spec └── SRPMS |
Установка RPM-пакета
После успешной сборки пакета вы можете установить его с помощью команды dnf:
|
1 |
$ sudo dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm |
Его также можно установить с помощью команды rpm напрямую:
|
1 |
$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm |
Убедитесь, что пакет установлен
Чтобы убедиться, что пакет установлен правильно, выполните следующую команду:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ rpm -qi hello Name : hello Version : 0.0.1 Release : 1 Architecture: noarch Install Date: Mon 09 Nov 2020 01:29:51 AM CET Group : Unspecified Size : 294 License : GPL Signature : (none) Source RPM : hello-0.0.1-1.el8.src.rpm Build Date : Mon 09 Nov 2020 01:08:14 AM CET Build Host : slimmerAI Summary : A simple hello world script Description : A demo RPM build |
Также можно просмотреть запись %changelog в пакете:
|
1 2 3 |
$ rpm -q hello --changelog * Sun Nov 08 2020 Valentin Bajrami <valentin.bajrami@slimmer.ai> - 0.1 - First version being packaged |
Посмотрите, что входит в пакет RPM
Посмотреть, какие файлы содержит пакет RPM, очень просто:
|
1 2 |
$ rpm -ql hello /usr/bin/hello.sh |
Удаление пакета RPM
Удалить пакет из системы так же просто, как и установить его. Для этого можно использовать команду dnf:
|
1 |
$ sudo dnf remove hello |
Или используйте команду rpm напрямую:
|
1 |
$ sudo rpm --verbose --erase hello |
Заключительные мысли
В этом документе я рассказал об основах работы с пакетами, в том числе о том, как создавать, устанавливать и удалять пакеты RPM из вашей системы. Файл .spec может стать очень сложным, если вы разрабатываете более продвинутое программное обеспечение, но вы можете изучить реальные примеры из общедоступных репозиториев программного обеспечения, таких как src.fedoraproject.org, чтобы узнать больше.