Сборка RPM-пакета на примере Nginx
09:48, 26.01.2023
RPM – пакетный менеджер, который используется в операционных системах Linux на базе Red Hat. Хранение данных в формате RPM осуществляется с помощью архивного контейнера cpio, который сжимает данные с помощью утилиты gzip, bzip2, LZMA, XZ или XAR, в зависимости от версии. Название каждого RPM пакета включает 4 элемента:
- название программы;
- версия;
- номерное обозначение версии;
- указание архитектуры, под которую пакет собирался.
Далее в статье мы расскажем, как собрать собственный RPM пакет для CentOS на примере Nginx с модулем SPNEGO. Двигаться к этой цели будем в несколько этапов: от создания простейшего пакета до добавления в него отдельных модулей с редактированием конфигурационного файла.
Предварительная настройка операционной системы CentOS
Первым делом нужно установить несколько важных пакетов:
yum install wget rpm-build rpmdevtools gcc make
С помощью одной лишь этой команды мы загружаем в систему утилиту для скачивания файлов по сети, софт для сборки установочного пакета, компилятор СИ, утилиту для сборки исходников, а также программу для создания рабочей среды в виде каталогов. Всё это нам потребуется дальше.
Далее нужно установить зависимости:
yum install openssl-devel zlib-devel pcre-devel
Все указанные в команде пакеты нужны для нашего варианта RPM сборки. В вашем случае могут потребоваться и другие зависимости, просто пропишите их через пробел. Если нужных пакетов в системе не окажется, вы получите сообщение об ошибке при первой же попытке выполнить сборку.
Последний шаг предварительной настройки операционной системы – создание отдельного пользователя. Делать это от имени пользователя с правами доступа уровня root не стоит, так как любая ошибка при указании путей может привести к тому, что какие-то файлы или даже целые директории будут потеряны. Итак, выполните команду:
useradd creator -m
Таким образом мы создали пользователя creator и отдельный домашний каталог для него. Чтобы все дальнейшие действия будем совершать от его имени, пропишите:
su - creator
Настройка окружения пользователя
Убедитесь, что находитесь в нужном каталоге. В качестве этого каталога может выступать абсолютно любая папка, созданная для этой цели. В рассматриваемом примере используем домашнюю директорию пользователя creator, которую создали ранее.
Чтобы удостовериться, что находитесь в нужной директории, пропишите команду:
$ pwd
Если консоль выдаст вам сообщение «/home/creator», вы в правильном месте. Если видите что-то другое, просто перейдите в домашний каталог с помощью команды:
$ cd ~
И затем создайте структуру каталогов для сборки:
$ rpmdev-setuptree
Теперь в нашем домашнем каталоге пользователя creator появится папка rpmbuild, содержащая такую структуру:
- BUILD — здесь расположены файлы, появляющиеся в процессе создания RPM-пакета.
- RPMS — здесь будут лежать готовые пакеты.
- SOURCES — содержит исходники для сборки RPM-пакетов.
- SPECS — здесь содержатся файлы с описанием сборки.
- SRPMS — содержит исходники RPM-файлов.
Теперь мы с вами готовы к загрузке исходника и его подготовке к дальнейшим процессам.
Создание RPM пакетов из исходников
Перейдите на страничку загрузки пакетов Nginx и выберите те из них, которые нужны конкретно для вашей операционной системы. Мы собираем RPM на базе CentOS 7. Если вы тоже – можете сразу же перейти в соответствующий раздел. Здесь вы найдете исходники для конкретной версии ОС. Копируйте ссылку и далее загрузите исходник через консоль:
$ wget https://nginx.org/packages/mainline/centos/7/SRPMS/nginx-1.19.3-1.el7.ngx.src.rpm
И теперь устанавливаем исходник с помощью команды:
$ rpm -Uvh nginx-1.19.3-1.el7.ngx.src.rpm
После этого в каталоге rpmbuild/SOURCES вы сможете увидеть появившиеся исходные файлы для сборки RPM с нужной для вас версией веб-сервера Nginx.
Переходим к созданию сборки установочного RPM-пакета:
$ rpmbuild -bb rpmbuild/SPECS/nginx.spec
Результатом станет появление пакета в каталоге rpmbuild/RPMS/x86_64, который содержит два файла:
- nginx-1.19.3-1.el7.ngx.x86_64.rpm: установочный пакет.
- nginx-debuginfo-1.19.3-1.el7.ngx.x86_64.rpm: установочный пакет со сведениями для отладки.
Теперь мы готовы к установке.
Основные операции с установочным пакетом
Чтобы установить собранный пакет, пишем команду:
rpm -Uvh <путь к собранному пакету>
Ключи -Uvh обеспечивают последовательное обновление, вывод сведений о ходе установке и демонстрацию статуса. Во время инициирования команды вы должны быть расположены в каталоге, в котором размещен пакет RPM.
Далее, чтобы запустить Nginx, прописываем поочередно команды:
systemctl enable nginx systemctl start nginx
Первая команда нужна для автоматического запуска веб-сервера, вторая же инициирует его запуск здесь и сейчас.
Если нужно будет удалить пакет, также потребуется ввести две команды:
systemctl disable nginx systemctl stop nginx
Чтобы получить информацию о полном названии установленного в вашей ОС пакета, пропишите такую команду:
rpm -qa | grep nginx
После остановки веб-сервера удалить пакет можно командой:
rpm -e nginx-1.19.3-1.el7.ngx.x86_64
Как добавить модуль SPNEGO?
Добавить модуль SPNEGO в сборку легко. Последовательно введите ряд команд:
yum install git su - creator $ cd ~ $ git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git /tmp/spnego-http-auth-nginx-module $ vi rpmbuild/SPECS/nginx.spec
Перед вами откроется файл nginx.spec, в котором нужно:
- Найти строку «%define BASE_CONFIGURE_ARGS ...».
- После --with-... добавить --add-dynamic-module=/tmp/spnego-http-auth-nginx-module.
Теперь найдите %description и после него добавьте:
%package module-spnego Group: %{_group} Requires: nginx = %{?epoch:%{epoch}:}%{main_version}-%{main_release} Summary: nginx spnego module %description module-spnego Dynamic Spnego module for nginx.
Далее находим %build и добавляем:
echo 'load_module "%{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so";' \ > %{buildroot}%{_sysconfdir}/nginx/modules/spnego-http-auth-nginx-module.conf
И последнее – находим %files и добавляем:
%files module-spnego %{_libdir}/nginx/modules/spnego-http-auth-nginx-module.conf %{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so
Теперь, чтобы запустить сборку, вводим команду:
$ rpmbuild -bb rpmbuild/SPECS/nginx.spec
Чтобы установить сборку, нам потребуются два RPM-пакета:
- nginx-1.19.3-1.el7.ngx.x86_64.rpm
- nginx-module-spnego-1.19.3-1.el7.ngx.x86_64.rpm
Оба они расположены в каталоге RPMS.
Когда установка будет завершена, выполните команду:
nginx -V
Отыщите опцию ... --add-dynamic-module=/tmp/spnego-http-auth-nginx-module ... – это и есть опция вашей сборки.
Чтобы модули подгружались, отредактируем конфиг Nginx:
vi /etc/nginx/nginx.conf
В корень необходимо добавить такой текст:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; include /etc/nginx/modules/*.conf; events { ...
Настройка конфигурации NGINX
Далее расскажем, как сделать подпись пакета и проверить её, чтобы можно было гарантировать авторство сборки. Для создания подписи прописываем несколько команд от имени пользователя с правами доступа уровня root:
# yum install rpm-sign pinentry
Далее переключаемся на пользователя creator, которого мы создали ранее, и генерируем ключ:
$ gpg2 --gen-key
Перед вами появится запрос, на который нужно ответить «4» – это будет значить, что RSA ключ только для подписи. Размер ключа оставляйте по умолчанию, а вот период актуальности ключа установите уже на свое усмотрение.
Подтвердить корректность данных можно стандартным «y».
Теперь нужно ввести данные ключа. Например, так:
Real name: Volt Email address: rpm@volt.com Comment:
Корректность данных подтверждается ключом «O». После этого дважды введите пароль.
В конце концов откройте вторую версию SSH и введите последовательно три команды:
dd if=/dev/sda of=/dev/zero $ gpg -K $ vi ~/.rpmmacros
Добавьте в этот файл следующие строки:
%_signature gpg %_gpg_name Volt %_gpgbin /usr/bin/gpg2 %__gpg_sign_cmd %{__gpg} gpg --force-v3-sigs --batch --verbose --no-armor --no-secmem-warning -u "%{_gpg_name}" -sbo %{__signature_filename} --digest-algo sha256 %{__plaintext_filename}'
Остается лишь подписать пакет:
$ rpm --addsign rpmbuild/RPMS/x86_64/nginx-1.19.3-1.el7.ngx.x86_64.rpm
Подтвердите действие с помощью пароля.
Проверка подписи RPM-пакета
Для проверки подписи сперва экспортируйте public key:
gpg2 -a --export Volt > RPM-GPG-KEY-Volt
После этого вы получите ключ RPM-GPG-KEY-Volt, его нужно перенести на целевой ПК, где и выполнить проверку подписи. Импортируем ключ от имени пользователя с правами root:
rpm --import RPM-GPG-KEY-Volt
И проверяем подпись:
rpm --checksig nginx-1.19.3-1.el7.ngx.x86_64.rpm
В результате вы увидите перед собой сообщение, похожее на это:
nginx-1.19.3-1.el7.ngx.x86_64.rpm: digests signatures OK
Надеемся, наша статья помогла вам разобраться, как собрать RPM-пакет на примере Nginx. Если возникнут сложности, обращайтесь к специалистам HostZealot. Всего доброго!