Manchmal haben Sie möglicherweise Zugriff auf den Quellcode einer Open-Source-Anwendung, haben aber möglicherweise nicht die RPM-Datei, um sie auf Ihrem System zu installieren.
In diesem Fall können Sie entweder den Quellcode kompilieren und die Anwendung aus dem Quellcode installieren oder selbst eine RPM-Datei aus dem Quellcode erstellen und die RPM-Datei verwenden, um die Anwendung zu installieren.
Es kann auch vorkommen, dass Sie ein benutzerdefiniertes RPM-Paket für die von Ihnen entwickelte Anwendung erstellen möchten.
Dieses Tutorial erklärt, wie Sie ein RPM-Paket aus dem Quellcode erstellen.
Um RPMs zu erstellen, benötigen Sie Quellcode, was normalerweise eine komprimierte tar-Datei bedeutet, die auch die SPEC-Datei enthält.
Die SPEC-Datei enthält normalerweise Anweisungen zum Erstellen von RPM, welche Dateien Teil des Pakets sind und wo es installiert werden sollte.
Das RPM führt während des Build-Prozesses die folgenden Aufgaben aus.
- Führt die Befehle und Makros aus, die im Vorbereitungsabschnitt der Spezifikationsdatei erwähnt werden.
- Überprüft den Inhalt der Dateiliste
- Führt die Befehle und Makros im Build-Abschnitt der Spezifikationsdatei aus. Makros aus der Dateiliste werden bei diesem Schritt ebenfalls ausgeführt.
- Erzeugt die Binärpaketdatei
- Erstellt die Quellpaketdatei
Sobald das RPM die obigen Schritte ausführt, erstellt es die Binärpaketdatei und die Quellpaketdatei.
Die Binärpaketdatei besteht aus allen Quelldateien zusammen mit zusätzlichen Informationen zum Installieren oder Deinstallieren des Pakets.
Es ist normalerweise mit allen Optionen zum Installieren des Pakets aktiviert, die plattformspezifisch sind. Die Binärpaketdatei enthält vollständige Anwendungen oder Funktionsbibliotheken, die für eine bestimmte Architektur kompiliert wurden. Das Quellpaket besteht normalerweise aus der komprimierten Original-TAR-Datei, der Spezifikationsdatei und den Patches, die zum Erstellen der Binärpaketdatei erforderlich sind.
Sehen wir uns an, wie man einfache Quell- und BIN-RPM-Pakete mit einer tar-Datei erstellt.
Wenn Sie das RPM-Paket noch nicht kennen, möchten Sie vielleicht zuerst verstehen, wie Sie den RPM-Befehl verwenden, um Pakete unter CentOS oder RedHat zu installieren, zu aktualisieren und zu entfernen.
1. RPM-Build-Paket installieren
Um eine RPM-Datei basierend auf der gerade erstellten Spezifikationsdatei zu erstellen, müssen wir den Befehl rpmbuild verwenden.
Der Befehl rpmbuild ist Teil des Pakets rpm-build. Installieren Sie es wie unten gezeigt.
# yum install rpm-build
rpm-build ist vom folgenden Paket abhängig. Wenn Sie diese noch nicht installiert haben, installiert yum diese Abhängigkeiten automatisch für Sie.
elfutils-libelf rpm rpm-libs rpm-python
2. RPM-Build-Verzeichnisse
rpm-build erstellt automatisch die folgenden Verzeichnisstrukturen, die während des RPM-Builds verwendet werden.
# ls -lF /root/rpmbuild/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 BUILD/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 BUILDROOT/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 RPMS/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SOURCES/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SPECS/ drwxr-xr-x. 2 root root 4096 Feb 4 12:21 SRPMS/
Hinweis:Die obige Verzeichnisstruktur gilt sowohl für CentOS als auch für RedHat, wenn das Paket rpmbuild verwendet wird. Sie können auch das Verzeichnis /usr/src/redhat verwenden, aber Sie müssen den topdir-Parameter während des RPM-Builds entsprechend ändern. Wenn Sie dies unter SuSE Enterprise Linux tun, verwenden Sie das Verzeichnis /usr/src/packages.
Wenn Sie anstelle von /root/rpmbuild Ihre eigene Verzeichnisstruktur verwenden möchten, können Sie eine der folgenden Optionen verwenden:
- Verwenden Sie die Option –buildroot und geben Sie das benutzerdefinierte Verzeichnis während des RPMBuild an
- Geben Sie den topdir-Parameter in der rpmrc-Datei oder der rpmmacros-Datei an.
3. Quell-Tar-Datei herunterladen
Laden Sie als Nächstes die Quell-TAR-Datei für das Paket herunter, das Sie erstellen möchten, und speichern Sie sie im Verzeichnis SOURCES.
Für dieses Beispiel habe ich den Quellcode der Open-Source-Anwendung icecase verwendet, einer Serversoftware zum Streamen von Multimedia. Die Schritte zum Erstellen von RPM für jede andere Anwendung sind jedoch genau gleich. Sie müssen nur den entsprechenden Quellcode für das RPM herunterladen, das Sie erstellen möchten.
# cd /root/rpmbuild/SOURCES/ # wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz # ls -l -rw-r--r--. 1 root root 1161774 Jun 11 2012 icecast-2.3.3.tar.gz
4. Erstellen Sie die SPEC-Datei
In diesem Schritt steuern wir RPM im Build-Prozess, indem wir eine Spezifikationsdatei erstellen. Die Spezifikationsdatei besteht normalerweise aus den folgenden acht verschiedenen Abschnitten:
- Präambel – Der Präambelabschnitt enthält Informationen über das zu erstellende Paket und definiert alle Abhängigkeiten zum Paket. Im Allgemeinen besteht die Präambel aus Einträgen, einer pro Zeile, die mit einem Tag beginnen, gefolgt von einem Doppelpunkt und dann einigen Informationen.
- %prep – In diesem Abschnitt bereiten wir die Software für den Erstellungsprozess vor. Alle vorherigen Builds werden während dieses Prozesses entfernt und die Quelldatei (.tar)-Datei wird erweitert usw.
- Eine weitere wichtige Sache ist zu verstehen, dass vordefinierte Makros verfügbar sind, um verschiedene Shortcut-Optionen zum Erstellen von RPM auszuführen. Möglicherweise verwenden Sie diese Makros, wenn Sie versuchen, komplexe Pakete zu erstellen. Im folgenden Beispiel habe ich ein Makro namens %setup verwendet, das alle vorherigen Builds entfernt, die Quelldateien entpackt und den Besitz der Dateien ändert. Sie können auch sh-Skripte im Abschnitt %prep verwenden, um diese Aktion auszuführen, aber das %setup-Makro vereinfacht den Prozess durch die Verwendung vordefinierter sh-Skripte.
- %description – der Beschreibungsabschnitt enthält normalerweise eine Beschreibung des Pakets.
- %build – Dies ist der Abschnitt, der für die Ausführung des Builds verantwortlich ist. Normalerweise ist der Abschnitt %build ein sh-Skript.
- %install – der Abschnitt %install wird ebenfalls als sh-Skript ausgeführt, genau wie %prep und %build. Dies ist der Schritt, der für die Installation verwendet wird.
- %files – Dieser Abschnitt enthält die Liste der Dateien, die Teil des Pakets sind. Wenn die Dateien nicht Teil des %files-Abschnitts sind, sind sie nicht im Paket verfügbar. Vollständige Pfade sind erforderlich und Sie können die Attribute und Eigentümer der Dateien in diesem Abschnitt festlegen.
- %clean – Dieser Abschnitt weist den RPM an, alle Dateien zu bereinigen, die nicht Teil des normalen Build-Bereichs der Anwendung sind. Nehmen wir als Beispiel an, wenn die Anwendung eine temporäre Verzeichnisstruktur in /tmp/ als Teil ihres Builds erstellt, wird sie nicht entfernt. Durch Hinzufügen eines sh-Skripts im %clean-Abschnitt kann das Verzeichnis entfernt werden, nachdem der Erstellungsprozess abgeschlossen ist.
Hier ist die SPEC-Datei, die ich für die Icecast-Anwendung erstellt habe, um eine RPM-Datei zu erstellen.
# cat /root/rpmbuild/SPECS/icecast.spec Name: icecast Version: 2.3.3 Release: 0 Summary: Xiph Streaming media server that supports multiple formats. Group: Applications/Multimedia License: GPL URL: http://www.icecast.org/ Vendor: Xiph.org Foundation [email protected] Source: http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gz Prefix: %{_prefix} Packager: Karthik BuildRoot: %{_tmppath}/%{name}-root %description Icecast is a streaming media server which currently supports Ogg Vorbis and MP3 audio streams. It can be used to create an Internet radio station or a privately running jukebox and many things in between. It is very versatile in that new formats can be added relatively easily and supports open standards for commuincation and interaction. %prep %setup -q -n %{name}-%{version} %build CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --mandir=%{_mandir} --sysconfdir=/etc make %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name} %clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc README AUTHORS COPYING NEWS TODO ChangeLog %doc doc/*.html %doc doc/*.jpg %doc doc/*.css %config(noreplace) /etc/%{name}.xml %{_bindir}/icecast %{_prefix}/share/icecast/* %changelog In this file, under % prep section you may noticed the macro “%setup -q -n %{name}-%{version}”. This macro executes the following command in the background. cd /usr/src/redhat/BUILD rm -rf icecast gzip -dc /usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz | tar -xvvf - if [ $? -ne 0 ]; then exit $? fi cd icecast cd /usr/src/redhat/BUILD/icecast chown -R root.root . chmod -R a+rX,g-w,o-w .
Im Abschnitt %build sehen Sie die CFLAGS mit Konfigurationsoptionen, die die Optionen definieren, die während der RPM-Installation verwendet werden können, und die Präfixoption , ein obligatorisches Verzeichnis, das für die Installation vorhanden sein muss, und ein sysconfig-Verzeichnis, in das die Systemdateien kopiert werden müssen .
Unter dieser Zeile sehen Sie das Make-Dienstprogramm, das die Liste der zu kompilierenden Dateien bestimmt und sie entsprechend kompiliert.
Im Abschnitt % install wird die Zeile unter %install mit der Aufschrift „make install“ verwendet, um die im vorherigen Schritt kompilierten Binärdateien zu übernehmen und sie an die entsprechenden Speicherorte zu installieren oder zu kopieren, damit auf sie zugegriffen werden kann.
5. Erstellen Sie die RPM-Datei mit rpmbuild
Sobald die SPEC-Datei fertig ist, können Sie mit der Erstellung Ihrer RPM mit dem Befehl rpm –b beginnen. Die Option –b wird verwendet, um alle Phasen des Erstellungsprozesses auszuführen. Wenn Sie während dieser Phase Fehler sehen, müssen Sie diese beheben, bevor Sie es erneut versuchen. Die Fehler werden normalerweise von Bibliotheksabhängigkeiten verursacht und Sie können sie bei Bedarf herunterladen und installieren.
# cd /root/rpmbuild/SPECS # rpmbuild -ba icecast.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kohe4t + umask 022 + cd /root/rpmbuild/BUILD + cd /root/rpmbuild/BUILD + rm -rf icecast-2.3.3 + /usr/bin/gzip -dc /root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz + /bin/tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + cd icecast-2.3.3 + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.ynm7H7 + umask 022 + cd /root/rpmbuild/BUILD + cd icecast-2.3.3 + CFLAGS='-O2 -g' + ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether to enable maintainer-specific portions of Makefiles... no checking for gcc... gcc .. .. .. Wrote: /root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.dzahrv + umask 022 + cd /root/rpmbuild/BUILD + cd icecast-2.3.3 + '[' /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 '!=' / ']' + rm -rf /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 + exit 0
Hinweis:Wenn Sie SuSE Linux verwenden und rpmbuild nicht verfügbar ist, versuchen Sie es mit „rpm -ba“, um das rpm-Paket zu erstellen.
Während der obigen rpmbuild-Installation werden Ihnen möglicherweise die folgenden Fehlermeldungen angezeigt:
Fehler 1:XSLT-Konfiguration konnte nicht gefunden werden
checking for xslt-config... no configure: error: XSLT configuration could not be found error: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build) RPM build errors: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
Lösung 1:Installieren Sie libxstl-devel
Für die xslt-config müssen Sie das Paket libxstl-devel wie unten gezeigt installieren.
yum install libxstl-devel
Dadurch werden auch die folgenden Abhängigkeiten installiert:
- libgcrypt
- libgcrypt-devel
- libgpg-error-devel
Fehler 2:libvorbis-Fehler
checking for libvorbis... configure: error: must have Ogg Vorbis v1.0 or above installed error: Bad exit status from /var/tmp/rpm-tmp.m4Gk3f (%build)
Lösung 2:Installieren Sie libvorbis-devel
Installieren Sie für Ogg Vorbis v1.0 das Paket libvorbis-devel wie unten gezeigt:
yum install libvorbis-devel
Dadurch werden auch die folgenden Abhängigkeiten installiert:
- libogg
- libogg-devel
- libvorbis
6. Überprüfen Sie die Quell- und binären RPM-Dateien
Sobald die RPM-Erstellung abgeschlossen ist, können Sie überprüfen, ob die Quell-RPM und die Binär-RPM in den folgenden Verzeichnissen erstellt wurden.
# ls -l /root/rpmbuild/SRPMS/ -rw-r--r-- 1 root root 1162483 Aug 25 15:46 icecast-2.3.3-0.src.rpm # ls -l /root/rpmbuild/RPMS/x86_64/ -rw-r--r--. 1 root root 349181 Feb 4 12:54 icecast-2.3.3-0.x86_64.rpm
7. Installieren Sie die zu überprüfende RPM-Datei
Als letzten Schritt können Sie das binäre RPM installieren, um zu überprüfen, ob es erfolgreich installiert wurde und alle Abhängigkeiten aufgelöst wurden.
# rpm -ivvh /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm D: ============== /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key D: loading keyring from rpmdb D: opening db environment /var/lib/rpm cdb:mpool:joinenv D: opening db index /var/lib/rpm/Packages rdonly mode=0x0 D: read h# 210 Header sanity check: OK D: added key gpg-pubkey-c105b9de-4e0fd3a3 to keyring D: Using legacy gpg-pubkey(s) from rpmdb D: Expected size: 349181 = lead(96)+sigs(180)+pad(4)+data(348901) D: Actual size: 349181 D: ========== relocations D: added binary package [0] D: found 0 source and 1 binary packages D: ========== +++ icecast-2.3.3-0 x86_64/linux 0x2 .. ..
Nach der obigen Installation können Sie überprüfen, ob Ihre benutzerdefinierte RPM-Datei wie unten gezeigt erfolgreich installiert wurde.
# rpm -qa icecast icecast-2.3.3-0.x86_64