Збірка RPM-пакета на прикладі Nginx
09:45, 27.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 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 ~/.rpmmacros
Додайте в цей файл такі рядки:
%_signature gpg %_gpg_name Вольт %_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. Всього доброго!