Erstellung eines RPM-Pakets am Beispiel von Nginx

Erstellung eines RPM-Pakets am Beispiel von Nginx

27.01.2023
Autor: HostZealot Team
2 min.
305

RPM ist ein Paketmanager, der in Red Hat-basierten Linux-Betriebssystemen verwendet wird. Die Datenspeicherung im RPM-Format erfolgt mit dem Archivcontainer cpio, der die Daten je nach Version mit den Dienstprogrammen gzip, bzip2, LZMA, XZ oder XAR komprimiert. Der Name eines jeden RPM-Pakets besteht aus 4 Elementen:

  • den Namen des Programms;
  • Version;
  • Bezeichnung der Versionsnummer;
  • einen Hinweis auf die Architektur, für die das Paket erstellt wurde.

Der folgende Artikel beschreibt, wie Sie Ihr eigenes RPM-Paket für CentOS am Beispiel von Nginx mit dem SPNEGO-Modul erstellen können. Wir werden uns diesem Ziel in mehreren Schritten nähern: von der Erstellung eines einfachen Pakets über das Hinzufügen einzelner Module bis hin zur Bearbeitung der Konfigurationsdatei.

Vorkonfiguration des CentOS-Betriebssystems

Als erstes müssen Sie einige wichtige Pakete installieren:

yum install wget rpm-build rpmdevtools gcc make


Allein mit diesem Befehl laden wir ein Dienstprogramm zum Herunterladen über das Netzwerk, Software zur Erstellung von Installationspaketen, einen SI-Compiler, einen Source Builder und einen Directory Builder auf das System. All das werden wir als nächstes brauchen.

Der nächste Schritt besteht darin, die Abhängigkeiten einzurichten:

yum install openssl-devel zlib-devel pcre-devel


Alle im Befehl angegebenen Pakete werden für unsere Version des RPM-Builds benötigt. Andere Abhängigkeiten können in Ihrem Fall erforderlich sein, schreiben Sie sie einfach mit einem Leerzeichen. Wenn die erforderlichen Pakete nicht auf Ihrem System vorhanden sind, erhalten Sie eine Fehlermeldung, wenn Sie zum ersten Mal versuchen, das Programm zu erstellen.

Der letzte Schritt der Vorkonfiguration des Betriebssystems besteht darin, einen eigenen Benutzer anzulegen. Dies sollte nicht als Benutzer mit Root-Rechten geschehen, da jeder Fehler in den Pfaden zum Verlust von Dateien oder sogar ganzen Verzeichnissen führen kann. Also, führen Sie den Befehl aus:

useradd creator -m


Dadurch werden der Benutzer creator und ein eigenes Home-Verzeichnis für ihn angelegt. Um den Namen dieses Benutzers für alle weiteren Aktionen zu verwenden, geben Sie ein:

su - creator 

Einrichten der Benutzerumgebung

Stellen Sie sicher, dass Sie sich im richtigen Verzeichnis befinden. Dieses Verzeichnis kann ein beliebiger Ordner sein, der zu diesem Zweck erstellt wurde. Im vorliegenden Beispiel verwenden wir das Heimatverzeichnis des Benutzers creator, das wir zuvor angelegt haben.

Um sicherzustellen, dass Sie sich im richtigen Verzeichnis befinden, geben Sie den Befehl ein:

$ pwd


Wenn die Konsole die Meldung "/home/creator" anzeigt, sind Sie am richtigen Ort. Wenn Sie etwas anderes sehen, navigieren Sie einfach mit dem Befehl zum Home-Verzeichnis:

$ cd ~


Und erstellen Sie dann eine Verzeichnisstruktur für die Baugruppe:

$ rpmdev-setuptree


Der rpmbuild-Ordner, der diese Struktur enthält, wird nun im Home-Verzeichnis unseres Erzeuger-Benutzers erscheinen:

  • BUILD – hier befinden sich die Dateien, die während der Erstellung des RPM-Pakets erscheinen.
  • RPMS – hier werden die fertigen Pakete liegen.
  • SOURCES – enthält die Quellen für die Erstellung von RPM-Paketen.
  • SPECS – Dies enthält die Build-Beschreibungsdateien.
  • SRPMS – enthält die Quelle der RPM-Dateien.

Jetzt sind wir beide bereit, den Quellcode herunterzuladen und für die weitere Bearbeitung vorzubereiten.

RPM-Pakete aus dem Quellcode erstellen

Rufen Sie die Download-Seite für Nginx-Pakete auf und wählen Sie die Pakete aus, die Sie speziell für Ihr Betriebssystem benötigen. Wir bauen RPM auf CentOS 7. Wenn Sie das auch sind, können Sie direkt zu dem entsprechenden Abschnitt gehen. Hier finden Sie die Quellen für Ihre jeweilige Betriebssystemversion. Kopieren Sie den Link und laden Sie den Quellcode über die Konsole herunter:

$ wget https://nginx.org/packages/mainline/centos/7/SRPMS/nginx-1.19.3-1.el7.ngx.src.rpm


Installieren Sie nun die Quelle mit dem Befehl:

$ rpm -Uvh nginx-1.19.3-1.el7.ngx.src.rpm


Im Verzeichnis rpmbuild/SOURCES sehen Sie dann die Quelldateien für die Erstellung des RPM mit der gewünschten Nginx-Webserverversion.

Fahren Sie mit der Erstellung des RPM-Installationspakets fort:

$ rpmbuild -bb rpmbuild/SPECS/nginx.spec


Das Ergebnis wird ein Paket im Verzeichnis rpmbuild/RPMS/x86_64 sein, das zwei Dateien enthält:

  • nginx-1.19.3-1.el7.ngx.x86_64.rpm: Installationspaket.
  • nginx-debuginfo-1.19.3-1.el7.ngx.x86_64.rpm: Installationspaket für Debugging-Informationen.

Wir sind jetzt bereit für die Installation.

erstellung eines rpm-pakets am beispiel von nginx

Grundlegende Arbeiten mit dem Installationspaket

Um das zusammengestellte Paket zu installieren, schreiben Sie den Befehl

rpm -Uvh <Pfad zum kompilierten Paket


Die -Uvh-Schlüssel bieten eine konsistente Aktualisierung, Ausgabe des Installationsfortschritts und Statusanzeige. Wenn Sie den Befehl starten, müssen Sie sich in dem Verzeichnis befinden, in dem sich das RPM-Paket befindet.

Um Nginx zu starten, schreiben Sie einen Befehl nach dem anderen:

systemctl enable nginx
systemctl start nginx


Der erste Befehl wird benötigt, um den Webserver automatisch zu starten, während der zweite Befehl ihn hier und jetzt initiiert.

Wenn Sie ein Paket entfernen möchten, müssen Sie ebenfalls zwei Befehle eingeben:

systemctl disable nginx
systemctl stop nginx


Um den vollständigen Namen des auf Ihrem Betriebssystem installierten Pakets abzurufen, geben Sie folgenden Befehl ein

rpm -qa | grep nginx


Nachdem Sie den Webserver gestoppt haben, können Sie das Paket mit dem Befehl löschen:

rpm -e nginx-1.19.3-1.el7.ngx.x86_64

Wie kann ich ein SPNEGO-Modul hinzufügen?

Der Einbau des SPNEGO-Moduls in die Baugruppe ist einfach. Geben Sie eine Reihe von Befehlen nacheinander ein:

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


Die Datei nginx.spec wird vor Ihnen geöffnet:

  • Suchen Sie die Zeile "%define BASE_CONFIGURE_ARGS ...".
  • Nach --mit-. add --add-dynamic-module=/tmp/spnego-http-auth-nginx-module.

Suchen Sie nun %description und fügen Sie es danach ein:

%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.


Als nächstes suchen Sie %build und fügen es hinzu:

echo 'load_module "%{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so";' \
	> %{buildroot}%{_sysconfdir}/nginx/modules/spnego-http-auth-nginx-module.conf


Als letztes suchen Sie %files und fügen es hinzu:

%dateien modul-spnego
%{_libdir}/nginx/modules/spnego-http-auth-nginx-module.conf
%{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so


Geben Sie nun den Befehl ein, um die Erstellung zu starten:

$ rpmbuild -bb rpmbuild/SPECS/nginx.spec


Um eine Baugruppe zu installieren, benötigen wir zwei RPM-Pakete:

  • nginx-1.19.3-1.el7.ngx.x86_64.rpm
  • nginx-module-spnego-1.19.3-1.el7.ngx.x86_64.rpm

Beide befinden sich im RPMS-Verzeichnis.

Wenn die Installation abgeschlossen ist, führen Sie den Befehl aus:

nginx -V


Schauen Sie sich die Option ... --add-dynamic-module=/tmp/spnego-http-auth-nginx-module ... - Dies ist die Option für Ihr Build.

Um die Module zu laden, bearbeiten Sie die Nginx-Konfiguration:

vi /etc/nginx/nginx.conf


Der folgende Text muss in der Wurzel hinzugefügt werden:

user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
include /etc/nginx/modules/*.conf;
 
events {

...

Konfigurieren der NGINX-Konfiguration

Als Nächstes werden wir Ihnen erklären, wie Sie eine Paketsignatur erstellen und verifizieren können, damit Sie die Urheberschaft des Builds garantieren können. Um eine Signatur zu erstellen, werden wir einige Befehle als Benutzer mit Root-Rechten ausführen:

# yum install rpm-sign pinentry


Als Nächstes wechseln Sie zu dem zuvor angelegten Ersteller-Benutzer und erzeugen den Schlüssel:

$ gpg2 --gen-key


Sie werden aufgefordert, mit "4" zu antworten, um anzugeben, dass der RSA-Schlüssel nur zum Signieren verwendet werden soll. Belassen Sie die Standardschlüsselgröße, aber stellen Sie die Gültigkeitsdauer nach Ihren Wünschen ein.

Sie können die Korrektheit der Daten mit dem Standard "y" bestätigen.

Sie müssen nun die Schlüsseldaten eingeben. Zum Beispiel so:

Real name: Volt
Email address: rpm@volt.com
Comment:


Die Korrektheit der Daten wird mit der Taste "O" bestätigt. Geben Sie dann das Passwort zweimal ein.

Öffnen Sie schließlich die zweite Version von SSH und geben Sie nacheinander drei Befehle ein:

dd if=dev/sda of=/dev/zero
$ gpg -K
$ vi ~/.rpmmacros


Fügen Sie die folgenden Zeilen in diese Datei ein:

%_signatur 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}'


Es bleibt nur noch, das Paket zu unterschreiben:

$ rpm --addsign rpmbuild/RPMS/x86_64/nginx-1.19.3-1.el7.ngx.x86_64.rpm


Bestätigen Sie die Aktion mit dem Passwort.

Überprüfung der Signatur des RPM-Pakets

Um die Signatur zu überprüfen, exportieren Sie zunächst den öffentlichen Schlüssel:

gpg2 -a --export Volt > RPM-GPG-KEY-Volt


Sie erhalten dann den RPM-GPG-KEY-Volt-Schlüssel, den Sie auf den Ziel-PC übertragen müssen, wo Sie die Signaturprüfung durchführen werden. Importieren Sie den Schlüssel als root-Benutzer:

rpm --import RPM-GPG-KEY-Volt


Und wir prüfen die Unterschrift:

rpm --checksig nginx-1.19.3-1.el7.ngx.x86_64.rpm


Daraufhin sehen Sie eine ähnliche Meldung wie die folgende:

nginx-1.19.3-1.el7.ngx.x86_64.rpm: digests signatures OK


Wir hoffen, dieser Artikel hat Ihnen geholfen zu verstehen, wie man ein RPM-Paket am Beispiel von Nginx erstellt. Sollten Sie auf Schwierigkeiten stoßen, zögern Sie bitte nicht, HostZealot zu kontaktieren. Passen Sie auf sich auf!

Verwandte Artikel