Wenn Sie Red Hat Enterprise Linux (RHEL) oder Fedora verwenden, werden Sie bald feststellen, dass Sie dnf
verwenden (oder yum
), um Softwarepakete zu installieren. Red Hat Package Manager (RPM) ist das wichtigste Softwareverwaltungstool auf diesen Linux-Distributionen. Dieser Artikel zeigt, wie Sie dieses Framework nutzen können, um Ihre eigenen Anwendungen zu verteilen.
Hoffentlich hatten Sie Gelegenheit, den Artikel von Valentin Bajrami zum gleichen Thema zu lesen. Ich werde hier einige der gleichen Konzepte wiederholen und einige Probleme veranschaulichen, auf die Sie möglicherweise stoßen. Ich werde auch zwei komplexere Beispiele verwenden und einige Probleme aufzeigen, die beim Packen nativer Anwendungen auftreten können.
In diesem Artikel erfahren Sie, wie Sie bestimmen, wie Sie Ihre eigene native Anwendung für die Verteilung kompilieren und packen. In einem Folgeartikel erkläre ich, wie Sie Anwendungen von Drittanbietern packen, die kein RPM-Paket haben, oder falls doch, Sie es anpassen möchten.
Zu den Voraussetzungen gehören:
- Sie haben grundlegende Kenntnisse darüber, wie Sie RPM verwenden, um Pakete abzufragen und Pakete zu installieren oder zu löschen. Wenn nicht, machen Sie sich zuerst mit diesen Konzepten vertraut und kommen Sie dann zum Spaß hierher zurück.
- Sie haben Make, Git, GCC und Java installiert, da Sie diese benötigen, um die hier enthaltenen Übungen abzuschließen. Es ist nicht erforderlich, aber es wäre schön, wenn Sie üben, während ich mich bewege.
Um Make, GCC, Java 11 und Git mit dem DNF-Paketmanager zu installieren, führen Sie Folgendes aus:
$ sudo dnf install \
make gcc-10 java-11-openjdk-headless git
Packen Sie Ihre eigene Software mit RPM
Dieser Artikel verwendet für diesen Schritt ein kleines Open-Source-Projekt namens jdumpertools.
Klonen Sie auf Ihrem Linux-Terminal jdumpertools
und dann kompilieren (Sie haben Make und den GCC-Compiler installiert, oder?):
$ git clone [email protected]:josevnz/jdumpertools.git
$ cd jdumpertools
$ make all
$ ls -l jdu jutmp *.so
-rwxrwxr-x 1 josevnz josevnz 32728 Oct 3 16:40 jdu
-rwxrwxr-x 1 josevnz josevnz 32752 Oct 3 16:40 jutmp
-rwxrwxr-x 1 josevnz josevnz 29024 Oct 3 16:40 libjdumpertools.so
Dann können Sie jedes der generierten Programme ausführen. Probieren Sie zum Beispiel jdu
aus (eine einfachere Version des du
Befehl, der die Ergebnisse im JSON-Format ausgibt):
$ LD_LIBRARY_PATH=$PWD $PWD/jdu /
[{"partition": "/", "free_space": 462140129280.000000, "total_space": 510405902336.000000}]
So weit, so gut.
Die Datei jdumpertools.spec in diesem Verzeichnis ist die RPM-Spezifikationsdatei, die steuert, wie jdumpertools
kompiliert und verpackt wird mit RPM.
Installieren Sie als Nächstes einige unterstützende Tools, bevor Sie mit dem Erstellen der RPM-Datei fortfahren.
Installieren Sie RPM-Bausteine
Holen Sie sich die notwendigen rpmdevtools
Dienstprogramme durch Ausführen von:
$ sudo dnf install rpm-build rpmdevtools
Bereiten Sie dann die Sandbox vor, um RPMs mit rpmdevtools
zu erstellen . Verwenden Sie für diesen Schritt niemals root, sondern Ihr persönliches oder Entwickler-Linux-Konto (es wird das -d
Debug-Flag):
$ rpmdev-setuptree -d
josevnz /home/josevnz /home/josevnz/.rpmmacros
/home/josevnz/rpmbuild/RPMS /home/josevnz/rpmbuild/SOURCES /home/josevnz/rpmbuild/SPECS
/home/josevnz/rpmbuild/SRPMS /home/josevnz/rpmbuild/BUILD
Hier ist eine schönere Ansicht:
$ tree ~/rpmbuild
/home/josevnz/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
5 directories, 0 files
Im Moment müssen Sie nur auf zwei Verzeichnisse achten:SOURCES
und SPECS
. Die anderen erkläre ich später.
Es gibt auch eine neue Datei namens ~/.rpmmacros
. Sie können dort einige spezielle Makros platzieren oder überschreiben, um sich wiederholende Aufgaben beim Erstellen von RPM-Paketen zu vermeiden. Diese Datei ist wichtig, weil sie den rpmbuild
verankert Umgebung mit Ihrem Home-Verzeichnis.
Verpacken Sie Ihre Anwendung
Erstellen Sie zuerst ein tar
Datei des Quellcodes im ~/rpmbuild/SOURCES
Verzeichnis:
VERSION=v0.1
NAME=jdumpertools
TARFILE=$(NAME)-$(VERSION).tar.gz
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
Normalerweise der tar
Datei enthält Skripte und Quellcode, die Sie während des Paketierungsprozesses kompilieren.
Erstellen Sie als Nächstes eine RPM-spec
Datei. Wieder rpmdevtools
bietet einen Vorsprung, wie folgt:
$ rpmdev-newspec ~/rpmbuild/jose-package.spec
/home/josevnz/rpmbuild/jose-package.spec created; type minimal, rpm version >= 4.16.
$ cat ~/rpmbuild/jose-package.spec
Name: jose-package
Version:
Release: 1%{?dist}
Summary:
License:
URL:
Source0:
BuildRequires:
Requires:
%description
%prep
%autosetup
%build
%configure
%make_build
%install
rm -rf $RPM_BUILD_ROOT
%make_install
%files
%license add-license-file-here
%doc add-docs-here
%changelog
* Sun Oct 03 2021 Jose Vicente Nunez <[email protected]>
-
Machen Sie sich keine Sorgen, wenn Sie diese Datei jetzt nicht verstehen können. Kopieren Sie die jdumpertools.spec
Datei in ~/rpmbuild/SPECS
Verzeichnis:
$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS
Und erstellen Sie eine Quell- und eine binäre RPM-Datei:
$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.spec
setting SOURCE_DATE_EPOCH=1609718400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.kBlIwO
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd /home/josevnz/rpmbuild/BUILD
+ rm -rf jdumpertools
+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jdumpertools
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
[...]
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uEyCyL
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd jdumpertools
+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0
Das Endergebnis sind zwei Dateien:ein Quell-RPM und ein Binär-RPM.
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Was passiert während einer RPM-Installation
Was passiert also, wenn Sie jedes Ihrer benutzerdefinierten RPMs installieren?
- Die Installation des Quell-RPM erstellt den
tar
Datei und diespec
Datei in Ihremrpmbuild
Verzeichnis. Dadurch können Sie die Anwendung neu kompilieren und Korrekturen an der RPM-spec
vornehmen Datei usw.$ ls rpmbuild/{SPECS,SOURCES} rpmbuild/SOURCES: jdumpertools-v0.1.tar.gz rpmbuild/SPECS: jdumpertools.spec
- Wenn Sie das binäre RPM installieren, installieren Sie tatsächlich die Anwendung:
$ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm Verifying... ################ [100%] Preparing... ################ [100%] Updating / installing... 1:jdumpertools-v0.1-1.fc33 ################ [100%]
- Bestätigen Sie, dass das installierte Paket vorhanden ist:
$ rpm -qi jdumpertools Name : jdumpertools Version : v0.1 Release : 1.fc33 Architecture: x86_64 Install Date: Sun 03 Oct 2021 06:32:50 PM EDT Group : Unspecified Size : 95002 License : Apache License 2.0 Signature : (none) Source RPM : jdumpertools-v0.1-1.fc33.src.rpm Build Date : Sun 03 Oct 2021 06:27:11 PM EDT Build Host : dmaf5.home URL : https://github.com/josevnz/jdumpertools Summary : Programs that can be used to dump Linux usage data in JSON format. Description : Jdumpertools is a collection of programs used to dump Linux usage data in JSON format to be ingested by other tools. * jdu: Similar to UNIX 'du' command. * jutmp: UTMP database dumper
Hinweis :Neugierige Leser haben wahrscheinlich das Makefile
geöffnet und sah ein Ziel namens rpm
:
rpm: all
test -x /usr/bin/rpmdev-setuptree && /usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
/usr/bin/rpmbuild -ba jdumpertools.spec
Dies ist eine bequeme Abkürzung, um einen rpmbuild
vorzubereiten Sandkasten, tar
Dateien, nachdem sie mit make
kompiliert wurden , und packen Sie sie mit rpmbuild
Befehl. Fühlen Sie sich frei, make rpm
aufzurufen und sehen, was passiert.
[ Holen Sie sich weitere Tipps, indem Sie den Spickzettel für Bash-Shell-Skripts herunterladen. ]
Ich habe Ihnen die Befehle und Tools gezeigt, die zum Generieren verwendet werden die RPM-Dateien, aber jetzt ist es an der Zeit zu schreiben die RPM spec
Datei.
Erstellen Sie eine Spezifikationsdatei für jdumper-Tools
Das Arbeiten mit Spezifikationsdateien erfordert das Ausfüllen mehrerer Metadaten-Tags sowie das Beschreiben, wie Sie die Anwendung kompilieren oder packen. Jdumpertools
ist eine einfache ANSI-C-Anwendung, also entpacken Sie die Quellen, kompilieren Sie sie, kopieren Sie sie in einen Zwischenbereich (~/rpmbuild/BUILDROOT
) und dann für die Verteilung packen.
Werfen Sie zunächst einen Blick auf die RPM-Spezifikationsdatei:
Name: jdumpertools
# TODO: Figure out a better way to update version here and on Makefile
Version: v0.1
Release: 1%{?dist}
Summary: Programs that can be used to dump Linux usage data in JSON format.
License: Apache License 2.0
URL: https://github.com/josevnz/jdumpertools
Source0: %{name}-%{version}.tar.gz
BuildRequires: bash,tar,gzip,rpmdevtools,rpmlint,make,gcc >= 10.2.1
Requires: bash
%global debug_package %{nil}
%description
Jdumpertools is a collection of programs you can use to dump Linux usage data in JSON format to be ingested by other tools.
* jdu: Similar to UNIX 'du' command.
* jutmp: UTMP database dumper
%prep
%setup -q -n jdumpertools
%build
make all
%install
rm -rf %{buildroot}
/usr/bin/mkdir -p %{buildroot}/%{_bindir}
/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}
/usr/bin/mkdir -p %{buildroot}/%{_libdir}
/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}
%clean
rm -rf %{buildroot}
%files
%{_bindir}/jdu
%{_bindir}/jutmp
%{_libdir}/libjdumpertools.so
%license LICENSE
%doc README.md
%changelog
* Mon Jan 4 2021 Jose Vicente Nunez <[email protected]> - 0.1
- First version being packaged
Lesen Sie hier, was wichtig ist:
- Die Metadaten, einschließlich Version, Name und Source0; Sie können Variablen oder Makros verwenden
- Entpacken Sie die Quellen im
%prep
Abschnitt mit dem%setup
Makro (der RPM-Leitfaden enthält viele Details zu den Flags) - BuildRequires :Sie müssen die Abhängigkeiten auflisten, die Sie zum Erstellen des Pakets benötigen. Diese können nicht dynamisch erkannt werden.
- %aufbau Abschnitt:Mit
make
kompilieren - %install Abschnitt:Kopieren Sie, was Sie benötigen, damit das Programm funktioniert (Programm, Bibliotheken usw.)
- %Dateien Abschnitt:Hier können Sie angeben, ob es sich bei einer Datei um ein Dokument handelt (%doc ), Lizenzdatei (%-Lizenz ) oder eine normale Datei
Außerdem wichtig:
- Ich habe die Erstellung von Debug-Code während des Packens mit
%global debug_package %{nil}
deaktiviert . - Das
changelog
dokumentiert, was sich mit dieser neuen Paketversion geändert hat.
Überprüfen Sie die Spezifikationsdatei mit rpmlint auf Fehler
Sie möchten nicht auf die harte Tour herausfinden, dass Ihre Drehzahl nicht perfekt ist. Daher ist es gut, nach offensichtlichen Fehlern oder Möglichkeiten zur Verbesserung Ihrer RPMs zu suchen:
$ sudo dnf install rpmlint
Überprüfen Sie nun die RPM-spec
Datei:
$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec
/home/josevnz/rpmbuild/SPECS/jdumpertools.spec: W: invalid-url Source0: jdumpertools-v0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings.
Die rpmlint-Dokumentation besagt, dass Source0 muss eine wohldefinierte URL sein (der Wert sollte eine gültige öffentliche HTTP-, HTTPS- oder FTP-URL sein). Machen Sie sich wegen dieser Warnung keine Sorgen.
Was ist mit der RPM selbst?
$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: summary-ended-with-dot C Programs that can be used to dump Linux usage data in JSON format.
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
jdumpertools.x86_64: E: description-line-too-long C Jdumpertools is a collection of programs that can be used to dump linux usage data in JSON format, so it can be ingested by other tools.
jdumpertools.x86_64: W: incoherent-version-in-changelog 0.1 ['v0.1-1.fc33', 'v0.1-1']
jdumpertools.x86_64: W: invalid-license Apache License 2.0
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jdu
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jutmp
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-soname /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-manual-page-for-binary jdu
jdumpertools.x86_64: W: no-manual-page-for-binary jutmp
1 packages and 0 specfiles checked; 1 errors, 10 warnings.
Zehn Warnungen und ein Fehler. Einige sind einfach zu beheben:
- Die Lizenz muss ein bestimmtes Format haben
- man-Seiten werden für Programme benötigt, also habe ich eine sehr einfache mit troff geschrieben
- Soname in die Bibliothek aufnehmen
Nach den Korrekturen bleibt nur eine Warnung:
$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
The value of this tag appears to be misspelled. Please double-check.
Diese Warnung macht Sie darauf aufmerksam, dass das Wort du
scheint falsch geschrieben zu sein. Es ist jedoch nur ein Verweis auf einen gültigen Befehl, sodass Sie die Warnung ignorieren können.
Aktualisieren Sie jetzt das RPM mit der verbesserten Version:
$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
Ich verwende die rpm
Befehl, um deutlicher zu machen, dass ich das Paket von einer lokalen Festplattenversion statt von einer neuen Version aus einem Repository aktualisiert habe. Wenn Sie möchten, können Sie dasselbe mit dnf
tun :
$ sudo dnf install --upgrade \
~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
Was Sie gelernt haben und was als nächstes kommt
Verpackungssoftware mit RPM sieht auf den ersten Blick einschüchternd aus, aber mit ein wenig Geduld werden Sie im Handumdrehen dorthin gelangen. Wenn Sie auf Probleme stoßen, finden Sie auch geeignete Möglichkeiten, Ihren Code zu verbessern. Nachfolgend finden Sie einige Ressourcen und abschließende Empfehlungen:
- Tun Sie sich selbst einen großen Gefallen und besorgen Sie sich ein Exemplar des RPM Packaging Guide, geschrieben von Adam Miller, Maxim Svistunov und Marie Doleželová. Es ist sehr vollständig und gut organisiert. Im Ernst, tun Sie es jetzt; es ist so gut.
- Der offizielle RPM-Verpackungsleitfaden und der Fedora-RPM-Leitfaden sind ebenfalls voller Details; halten Sie sie ein Lesezeichen fern.
- Verwenden Sie rpmlint. Sie werden überrascht sein, wie viele kleine Dinge Sie auffangen und reparieren können, bevor Sie Ihre RPM-Pakete versenden.
- Nicht genug? Fedora hat eine Liste mit Tricks, die Sie beim Packen von Software anwenden können.
- Immer noch neugierig? Sie sollten sich unbedingt die RPM-Paketierungsrichtlinien ansehen.