Mein erstes RPM-Paket

Vorwort

Der Inhalt dieses Artikels ist nicht zur Nachahmung empfohlen. Ich halte an dieser Stelle fest, wie ich mein erstes RPM-Paket erstellt habe. Dieses funktioniert zwar und tut was es soll, doch ist es aus qualitativer Sicht noch ein weiter Weg, bis ich es selbst als gut bezeichnen würde. Der Artikel ist daher eher als ein Hilferuf zu verstehen. Ich freue mich, wenn mir geduldige, erfahrene Paketbauer in den Kommentaren Tipps geben, wie ich es besser machen kann.

Was habe ich getan?

Um die Installation des Tivoli TSM-Backup-Client 7.1.6 unter RHEL/CentOS/Fedora zu vereinfachen, habe ich für die Installation ein RPM-Paket erstellt. Der TSM-Backup-Client selbst wird vom Hersteller als TAR-Archiv bereitgestellt, welches die zur Installation benötigten RPM-Pakete enthält. Dazu gibt es eine Dokumentation, welche weitere z.T. optionale Abhängigkeiten aufführt. Darunter z.B. die Installation einiger Bibliotheken und eines Oracle JRE 1.7 oder höher.

All diese Dinge habe ich zusammen mit einem Skript, welches die initiale Installation und Konfiguration vornimmt, in ein RPM-Paket gepackt. Dieses Paket lässt sich auf dem Zielsystem installieren und durch die anschließende Ausführung des (selbst erstellten) Skripts tsm_init.sh werden die benötigten RPM-Pakete und Abhängigkeiten installiert.

Meine SPEC-Datei sieht wie folgt aus:

#---------------------------------------------------------------#
# version for using createRPM_* script
#---------------------------------------------------------------#
Name:      tsm-backup-client
Version:   7.1.6
Release:   1%{?dist}
Packager:  Tronde
Group:     Applications/System
Summary:   Tivoli TSM Backup Client for Linux

License:   non-free
URL:       http://example.com

BuildArch: x86_64
BuildRoot: %{_tmppath}/%{name}-%{version}

# $RPM_SOURCE_DIR : Variable of rpmbuild SOURCE dir
# $RPM_BUILD_DIR  : Variable of rpmbuild BUILD dir
# $RPM_BUILD_ROOT : Variable of rpmbuild BUILDROOT dir
#%define  

#BuildRequires:
Requires: libXrender
Requires: libXtst
Requires: libXp
Requires: xorg-x11-xauth

%description
This package installs the required packages and scripts for the
installation of the Tivoli TSM Backup Client for Linux.

The package contains:
 * bacli
 * tsm_init.sh
 * jre-8u91-linux-x64.tar.gz

#---------------------------------------------------------------#
# not used sections should be be set to comment
#---------------------------------------------------------------#
# The section '%prep' to extract the sourcefile 'Source0'
#%prep

# The section '%build' to build binaries from sources
#%build

# copy files to $RPM_BUILD_ROOT for using in the %files section
%install
cd $RPM_BUILD_ROOT
tar xvzf $RPM_SOURCE_DIR/%{name}.tgz
mv %{name}/* .
rmdir %{name}

# this files will be included in the rpm package
# with path on target host
%files
%defattr(-,root,root)
%doc
/root/bin/tsm_init.sh
/root/bin/start-tivoli-gui.sh
/data/bacli/gskcrypt64-8.0.50.66.linux.x86_64.rpm
/data/bacli/gskssl64-8.0.50.66.linux.x86_64.rpm
%doc /data/bacli/README_api_enu.htm
%doc /data/bacli/README_enu.htm
%doc /data/bacli/README
/data/bacli/cat_README.sh
/data/bacli/TIVsm-API64.x86_64.rpm
/data/bacli/TIVsm-APIcit.x86_64.rpm
/data/bacli/TIVsm-BAcit.x86_64.rpm
/data/bacli/TIVsm-BAhdw.x86_64.rpm
/data/bacli/TIVsm-BA.x86_64.rpm
/data/bacli/TIVsm-filepath-7.1.6-0-rhel59.x86_64.rpm
/data/bacli/TIVsm-filepath-7.1.6-0-rhel64.x86_64.rpm
/data/bacli/TIVsm-filepath-7.1.6-0-rhel7.x86_64.rpm
/data/bacli/TIVsm-filepath-7.1.6-0-sles11sp2.x86_64.rpm
/data/bacli/TIVsm-filepath-source.tar.gz
/data/bacli/TIVsm-JBB.x86_64.rpm
/data/jre-8u91-linux-x64.tar.gz

%clean
rm -rf %{buildroot}

# The section '%pre', for code to be executed prior to install
#%pre

# The section '%prerun' for code to be executed prior to uninstall
%preun

# the section '%post', for code to be executed after install
# normal sh script, prefs variables and macros can be used
%post

# The section '%postun' for code to be executed after uninstall
#%postun

%changelog
*Tue Jul 05 2016  Tronde 7.1.6-1
-- Initial Build.

Bisher erkannte Mängel

Mir sind bisher folgende Mängel aufgefallen:

  1. Nach der Installation des Pakets müssen die enthaltenen RPM-Pakete durch ein weiteres Skript installiert werden.
  2. Das Installationsskript muss manuell auf dem Zielsystem gestartet werden.
  3. Bei der Deinstallation werden die vom tsm_init.sh-Skript installierten RPM-Pakete nicht mit entfernt.

Meine Idee das tsm_init.sh-Skript in die Sektion %post zu packen hat leider nicht funktioniert, da ich die Paketverwaltung damit in einen Deadlock schicke. YUM ist noch durch den Installationsprozess blockiert, welcher mein RPM-Paket installiert und wartet darauf, dass der YUM-Aufruf aus meinem tsm_init.sh-Skript beendet werden kann. So geht es also nicht.

Was möchte ich eigentlich erreichen?

Erreichen möchte ich, dass durch die Installation eines RPM-Paktes die folgenden RPM-Pakete auf dem Zielsystem installiert werden:

  • gskcrypt64-8.0.50.66.linux.x86_64.rpm
  • gskssl64-8.0.50.66.linux.x86_64.rpm
  • TIVsm-API64.x86_64.rpm
  • TIVsm-BA.x86_64.rpm

Das Skript tsm_init.sh soll anschließend nur noch dazu verwendet werden, um den installierten TSM-Backup-Client mit einer initialen Konfiguration zu versehen. Ein zweites Skript soll an einem Ort abgelegt werden, von dem aus es ausgeführt werden kann.

Bisher ist meine einzige Idee, diese Aufgabe zu lösen, die vier genannten RPM-Pakete in ein YUM-Repository zu legen. In meiner SPEC-Datei kann ich sie dann als Abhängigkeiten definieren:

#BuildRequires:
Requires: gskcrypt64-8.0.50.66.linux.x86_64.rpm
Requires: gskssl64-8.0.50.66.linux.x86_64.rpm
Requires: TIVsm-API64.x86_64.rpm
Requires: TIVsm-BA.x86_64.rpm

Allerdings frage ich mich, ob es nicht auch eine Möglichkeit gibt, eine Art Meta-RPM zu erstellen, welches die benötigten RPMs enthält und diese Installiert. Ich könnte die Software auf diesem weg über ein einziges Paket bereitstellen.

Falls ihr Ideen oder Hinweise geben könnt, wie die Anforderung am besten umzusetzen ist, freue ich mich über eure Kommentare unter diesem Artikel.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.