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. ]