Erstellung eines RPM-Pakets am Beispiel von Nginx
09:36, 27.01.2023
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.
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!