GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Weitere Tipps zum Packen Ihrer Linux-Software mit RPM

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?

  1. Die Installation des Quell-RPM erstellt den tar Datei und die spec Datei in Ihrem rpmbuild 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
  2. 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%]
  3. 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.

Linux
  1. Tipps und Tricks zur Verwendung von CUPS zum Drucken unter Linux

  2. 4 Tipps, um einen älteren Verwandten mit Linux online zu bringen

  3. 5 Tipps für den Einstieg in die Linux-Serversicherheit

  4. Konfigurieren Sie DNS mit einem Linux-Befehl, erstellen Sie ein Lab in fünf Minuten und weitere Tipps für Systemadministratoren

  5. Beste Malsoftware für Linux

Holen Sie mit diesen einfachen Tipps mehr aus Ihrem Kindle unter Linux heraus

Die 15 besten Linux für Kinder | Lassen Sie Ihre Kinder Linux mit Spaß lernen

Die 15+ Linux-Firewall-Software zum Schutz Ihres Linux-Systems

Linux für Unternehmen:Erweitern Sie Ihr Unternehmen mit diesen Anwendungen

Die 20 besten Linux-Medienserver-Distributionen und -Software für Ihren Heimkino-PC

Die 10 besten Tipp-Tutor-Software für Linux | Erhöhen Sie Ihre Tippfähigkeit