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

So erstellen Sie ein Linux-RPM-Paket

Dieser Artikel zeigt Ihnen, wie Sie ein Skript zur einfachen Installation, Aktualisierung und Entfernung von Ihren Linux-Systemen in eine RPM-Datei packen. Bevor ich in die Details gehe, erkläre ich, was ein RPM-Paket ist und wie Sie eines installieren, abfragen, entfernen und vor allem selbst erstellen können.

Dieser Artikel behandelt:

  • Was ein RPM-Paket ist.
  • So erstellen Sie ein RPM-Paket.
  • Wie man ein RPM-Paket installiert, abfragt und entfernt.

Was ist ein RPM-Paket?

RPM steht für Red Hat Package Manager . Es wurde von Red Hat entwickelt und wird hauptsächlich auf Red Hat-basierten Linux-Betriebssystemen (Fedora, CentOS, RHEL usw.) verwendet.

Ein RPM-Paket verwendet den .rpm Erweiterung und ist ein Bündel (eine Sammlung) verschiedener Dateien. Es kann Folgendes enthalten:

  • Binärdateien, auch als ausführbare Dateien bekannt (nmap , stat , xattr , ssh , sshd , usw.).
  • Konfigurationsdateien (sshd.conf , updatedb.conf , logrotate.conf usw.).
  • Dokumentationsdateien (README , TODO , AUTHOR usw.).

Der Name eines RPM-Pakets folgt diesem Format:

<name>-<version>-<release>.<arch>.rpm

Ein Beispiel:

bdsync-0.11.1-1.x86_64.rpm

Einige Pakete enthalten auch eine Kurzversion der Distribution, für die sie gebaut wurden, wie zum Beispiel:

bdsync-0.11.1-1.el8.x86_64.rpm

[Das könnte Ihnen auch gefallen: Linux-Paketverwaltung mit YUM und RPM]

So erstellen Sie ein RPM-Paket

Sie benötigen die folgenden Komponenten, um ein RPM-Paket zu erstellen:

  • Eine Arbeitsstation oder eine virtuelle Maschine, auf der eine RPM-basierte Distribution wie RHEL oder Fedora ausgeführt wird.
  • Software zum Erstellen des Pakets.
  • Quellcode zum Paketieren.
  • SPEC-Datei zum Erstellen des RPM.

Installieren der erforderlichen Software

Die folgenden Pakete müssen installiert werden, um das RPM-Paket zu erstellen:

$ sudo dnf install -y rpmdevtools rpmlint

Nach der Installation von rpmdevtools , erstellen Sie den Dateibaum, den Sie zum Erstellen von RPM-Paketen benötigen:

$ rpmdev-setuptree

Sie erstellen RPM-Pakete als normaler Benutzer (nicht als Root), sodass Ihre Erstellungsumgebung in Ihrem Home-Verzeichnis abgelegt wird. Es enthält diese Verzeichnisstruktur:

rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
  • Der BAU Verzeichnis wird während des Erstellungsprozesses des RPM-Pakets verwendet. Hier werden die temporären Dateien gespeichert, verschoben usw.
  • Das RPMS Das Verzeichnis enthält RPM-Pakete, die für verschiedene Architekturen erstellt wurden, und noarch, falls in .spec angegeben Datei oder während des Builds.
  • Die QUELLEN Verzeichnis enthält, wie der Name schon sagt, Quellen. Dies kann ein einfaches Skript sein, ein komplexes C-Projekt, das kompiliert werden muss, ein vorkompiliertes Programm usw. Normalerweise werden die Quellen als .tar.gz komprimiert oder .tgz Dateien.
  • Die SPEC Verzeichnis enthält die .spec Dateien. Die .spec Datei definiert, wie ein Paket aufgebaut wird. Dazu später mehr.
  • Das SRPMS Verzeichnis enthält die .src.rpm Pakete. Ein Quell-RPM-Paket gehört keiner Architektur oder Distribution an. Die eigentliche .rpm Paketerstellung basiert auf .src.rpm Paket.

Eine .src.rpm Das Paket ist sehr flexibel, da es auf jeder anderen RPM-basierten Distribution und Architektur erstellt und neu erstellt werden kann.

Sie sind jetzt mit dem Inhalt der einzelnen Verzeichnisse vertraut, also erstellen Sie jetzt ein einfaches Skript zum Verteilen:

$ cat << EOF >> hello.sh
#!/bin/sh
echo "Hello world"
EOF

Dadurch wird ein Shell-Skript namens hello.sh erstellt , die "Hello world" an das Terminal ausgibt. Es ist einfach, aber es reicht aus, um die Verpackung zu demonstrieren.

Platzieren Sie das Skript im angegebenen Verzeichnis

Um ein Paket für Ihr Skript zu erstellen, müssen Sie Ihr Skript in dem Verzeichnis ablegen, in dem es vom RPM-Build-System erwartet wird. Erstellen Sie ein Verzeichnis dafür, indem Sie semantische Versionierung verwenden, wie es die meisten Projekte tun, und verschieben Sie dann hello.sh hinein:

$ mkdir hello-0.0.1
$ mv hello.sh hello-0.0.1

Der meiste Quellcode wird als Archiv verteilt, verwenden Sie also den tar-Befehl, um eine Archivdatei zu erstellen:

$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1

Verschieben Sie dann den soeben erstellten Tarball in die SOURCES Verzeichnis:

$ mv hello-0.0.1.tar.gz SOURCES

Erstellen Sie eine .spec-Datei

Ein RPM-Paket wird durch eine .spec definiert Datei. Die Syntax einer .spec file ist strikt, aber rpmdev kann eine Boilerplate-Datei für Sie generieren:

$ rpmdev-newspec hello

Dadurch wird eine Datei namens hello.spec generiert , die Sie in die SPECS verschieben müssen Verzeichnis. Führen Sie tree ~/rpmbuild aus um zu sehen, wie die Verzeichnisstruktur aussieht:

/home/tux/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

Die generierte hello.spec -Datei bietet einen guten Ausgangspunkt, enthält jedoch keine spezifischen Informationen darüber, was Sie erstellen. Die generierte .spec Datei geht davon aus, dass ich Software kompilieren und bauen werde.

Sie packen ein Bash-Skript, also können Sie etwas vereinfachen. Zum Beispiel gibt es kein Build verarbeiten, da kein Code zum Kompilieren vorhanden ist. Ich habe BuildArch:noarch hinzugefügt weil dieses Paket für 32-Bit, 64-Bit, Arm und jede andere CPU-Architektur gültig ist, die Bash ausführt.

Ich habe auch Requires:bash hinzugefügt damit das Paket sicherstellt, dass Bash installiert wird. Dieses einfache "Hallo Welt"-Skript läuft natürlich auf jeder Shell, aber das gilt nicht für alle Skripte, daher ist dies eine gute Möglichkeit, Abhängigkeiten zu demonstrieren.

Name:           hello
Version:        0.0.1
Release:        1%{?dist}
Summary:        A simple hello world script
BuildArch:      noarch

License:        GPL
Source0:        %{name}-%{version}.tar.gz

Requires:       bash

%description
A demo RPM build

%prep
%setup -q

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir}

%clean
rm -rf $RPM_BUILD_ROOT

%files
%{_bindir}/%{name}.sh

%changelog
* Sun Nov  18 2020 Valentin Bajrami <[email protected]> - 0.0.1
- First version being packaged

Wie Sie sehen können, gibt es in .spec viele Abkürzungen Dateien. Sie werden Makros genannt, und es gibt eine ausgezeichnete Liste dessen, was in der Fedora-Paketdokumentation verfügbar ist. Es ist wichtig, Makros in Ihrer .spec zu verwenden Dateien. Sie tragen dazu bei, die Konsistenz über alle RPM-Systeme hinweg sicherzustellen, sie helfen Ihnen, Fehler in Dateinamen und Versionsnummern zu vermeiden, und sie erleichtern die Aktualisierung der .spec Datei, wenn Sie eine neue Version Ihres Skripts veröffentlichen.

Beispielsweise ist es erforderlich, dass Sie genau angeben, welche Dateien unter %files installiert werden Sektion. Hier habe ich explizit folgende Zeile eingefügt:

%files
%{_bindir}/%{name}.sh

Das funktioniert, weil ich möchte, dass das Skript zu %{_bindir} geht (Das ist ein Makro, das zu /usr/bin übersetzt wird standardmäßig, ist aber konfigurierbar, wenn Benutzer an einem anderen Ort installieren möchten, wie z. B. /usr/local/bin ). Sie können Makrowerte überprüfen, indem Sie Folgendes ausführen:

$ rpm --eval '%{_bindir}'
/usr/bin

Weitere nützliche Makros:

  • %{name} Name des Pakets (wie in Name: definiert Feld)
  • %{version} Version des Pakets (wie in der Version: definiert Feld)
  • %{_datadir} freigegebene Daten (/usr/sbin standardmäßig)
  • %{_sysconfdir} Konfigurationsverzeichnis (/etc standardmäßig)

Prüfen der .spec-Datei auf Fehler (rpmlint)

Der rpmlint Befehl kann Fehler in .spec finden Dateien:

$ rpmlint ~/rpmbuild/SPECS/hello.spec
SPECS/hello.spec: W: no-%build-section
SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 2 warnings.

Es werden 2 Fehler gemeldet, aber beide sind akzeptabel. Es muss kein Code erstellt werden, daher ist kein %build erforderlich Abschnitt, und das Quellarchiv ist eine lokale Datei und hat keine Netzwerk-URL.

Alles sieht gut aus.

Paket erstellen (rpmbuild)

Um das RPM-Paket zu erstellen, verwenden Sie rpmbuild Befehl. Weiter oben in diesem Tutorial habe ich den Unterschied zwischen .src.rpm erwähnt (Quell-RPM-Paket) und die .rpm Paket.

Um die .src zu erstellen RPM-Paket:

$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec

Die Flags -bs haben folgende Bedeutung:

  • -b:bauen
  • -s:Quelle

So erstellen Sie das binäre .rpm-Paket:

$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec

Die Flags -bb haben folgende Bedeutung:

  • -b:bauen
  • -b:binär

Verwenden Sie -ba um beides zu bauen.

Nachdem der Erstellungsprozess abgeschlossen ist, haben Sie die folgende Verzeichnisstruktur:

$ tree ~/rpmbuild/
/home/tux/rpmbuild/
├── BUILD
│   └── hello-0.0.1
│       ├── hello.sh
├── BUILDROOT
├── RPMS
│   └── noarch
│       └── hello-0.0.1-1.el8.noarch.rpm
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

Installieren des RPM-Pakets

Nach einem erfolgreichen Build des Pakets können Sie das RPM-Paket mit dnf installieren Befehl:

$ sudo dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

Es kann alternativ mit dem rpm installiert werden Befehl direkt:

$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

Vergewissern Sie sich, dass das Paket installiert wurde

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob das Paket korrekt installiert wurde:

$ rpm -qi hello
Name        : hello
Version     : 0.0.1
Release     : 1
Architecture: noarch
Install Date: Mon 09 Nov 2020 01:29:51 AM CET
Group       : Unspecified
Size        : 294
License     : GPL
Signature   : (none)
Source RPM  : hello-0.0.1-1.el8.src.rpm
Build Date  : Mon 09 Nov 2020 01:08:14 AM CET
Build Host  : slimmerAI
Summary     : A simple hello world script
Description : A demo RPM build

Das %Änderungsprotokoll Eintrag eines Paketes kann auch eingesehen werden:

$ rpm -q hello --changelog
* Sun Nov 08 2020 Valentin Bajrami <[email protected]> - 0.1
- First version being packaged

Sehen Sie, was im RPM-Paket enthalten ist

Es ist leicht zu erkennen, welche Dateien ein RPM-Paket enthält:

$ rpm -ql hello
/usr/bin/hello.sh

Entfernen des RPM-Pakets

Das Entfernen des Pakets aus dem System ist genauso einfach wie das Installieren. Sie können den dnf verwenden Befehl:

$ sudo dnf remove hello

Oder die rpm Befehl direkt:

$ sudo rpm --verbose --erase hello

Abschließende Gedanken

In diesem Dokument habe ich die Grundlagen des Paketierens behandelt, einschließlich des Erstellens, Installierens und Entfernens eines RPM-Pakets von Ihrem System. Die .spec Datei kann sehr kompliziert werden, wenn Sie fortgeschrittenere Software erstellen, aber Sie können Beispiele aus der Praxis in öffentlichen Software-Repositories wie src.fedoraproject.org lesen, um mehr zu erfahren.

[ Kostenloser Online-Kurs:Technischer Überblick zu Red Hat Enterprise Linux. ] 


Linux
  1. So packen Sie Python-Anwendungen für Linux

  2. Wie man RPM-Pakete baut

  3. So listen Sie Dateien auf, die von einem RPM- oder DEB-Paket in Linux installiert wurden

  4. So erstellen Sie eine Auslagerungsdatei unter Linux

  5. So überprüfen Sie die Integrität des RPM-Pakets in Linux

So erstellen Sie eine Datei unter Linux

So erstellen Sie Verknüpfungen auf dem Linux-Desktop

So erstellen Sie einen SSH-Alias ​​unter Linux

So erstellen Sie einen Alias ​​unter Linux

So erstellen Sie ein RPM-Paket aus einem Tarball

Wie erstelle ich ein Paket in WHM?