RPM-Pakete pflegen

Siehe auch

Dieses Kapitel beschreibt, wie man eigene RPM-Pakete unter RHEL erstellt und in einem Repository ablegt. Ausführliche Hilfe erhält man auf der Seite des Fedora-Projektes.

Build-Maschine bereitstellen

Eine separate Build-Maschine unter RHEL 7 richtet man wie folgt ein:

yum -y install prelink rpm-build rpmdevtools

useradd rpmbuild
usermod --comment="RPM Package Builder" --home=/home/rpmbuild rpmbuild

Erforderliche Struktur im Home-Verzeichnis des rpmbuild-Benutzers erstellen lassen:

su - rpmbuild
rpmdev-setuptree

Danach sieht /home/rpmbuild wie folgt aus:

└── rpmbuild
    ├── BUILD
    ├── RPMS
    ├── SOURCES
    ├── SPECS
    └── SRPMS

RPM Repo-Server bereitstellen

Ein Repository-Server hostet die RPM-Dateien und ist nichts weiteres als ein Webserver, zum Beispiel mit Apache. Dessen Einrichtung geschieht wie folgt:

yum -y install httpd
yum -y install createrepo

Beispiel für eine Verzeichnisstruktur für die Ablage der RPM-Pakete:

mkdir -p /var/www/html/packages/rhel/{6,7,8}/{i386,x86_64}

SPEC-Datei definieren

Diese SPEC-Datei kopiert einfach nur einige Dateien aus dem RPM in die angegebenen Zielverzeichnisse. Im Beispiel heisst das Projekt mycompany-myproduct. Die Zielplattform ist auf i386 und Enterprise Linux 6 festgelegt. Vom Prinzip her erinnert die SPEC-Datei an eine Kickstart-Datei:

Name:     mycompany-myproduct
Version:  2.1
#Release:  0%{?dist}
Release:  0.el6
Summary:  MyCompany Package for MyProduct

Group:    Applications/System
License:  GPLv2+
Requires: java-1.7.0-openjdk,wget,mailx

%description
# nothing to do here

%files
%defattr(-,root,root,-)

# macros:
# %{_sysconfdir}   = /etc
# /%{_lib}         = /lib64 for x86_64, otherwise /lib
# %{_libdir}       = /usr/lib
%{_sysconfdir}     /etc
%{_prefix}         /usr
%{_exec_prefix}    %{_prefix}
%{_bindir}         %{_exec_prefix}/bin
%{_libdir}         %{_exec_prefix}/%{_lib}
%{_libexecdir}     %{_exec_prefix}/libexec
%{_sbindir}        %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datarootdir}    %{_prefix}/share
%{_datadir}        %{_datarootdir}
%{_includedir}     %{_prefix}/include
%{_infodir}        /usr/share/info
%{_mandir}         /usr/share/man
%{_localstatedir}  /var
%{_initddir}       %{_sysconfdir}/rc.d/init.d

%{_sysconfdir}/sysconfig/iptables
/%{_lib}/mydriver.so
%{_libdir}/another-driver.so
/root/myproduct-status-report.sh
/opt/mycompany/myproduct/*

%post
/sbin/ldconfig
service iptables restart

chmod +x /root/myproduct-status-report.sh
chmod +x /opt/mycompany/myproduct/bin/*

ln -s /lib/mydriver.so.5.00 /usr/lib/libeToken.so.5
# and more...


%changelog
* Wed Dec 18 2014 Linuxfabrik GmbH, Zurich, Switzerland <info (at) linuxfabrik (dot) ch> 2.1.0
- Bufix-Release; improved connection handling; ...

RPM erstellen und veröffentlichen

Nach der Erstellung/Anpassung der SPEC-Datei kann das RPM gebaut werden.

su - rpmbuild
rm -rf rpmbuild/BUILDROOT/*

Die gewünschten Dateien in /home/rpmbuild/rpmbuild/BUILDROOT ablegen. Anschliessend die Binary-Pakete bauen (ohne Source-Package).

rpmbuild --target i386 -bb rpmbuild/SPECS/mycompany-myproduct.spec

Unter /home/rpmbuild/rpmbuild/RPMS findet sich das erzeugte RPM, als Beispiel i386/mycompany-myproduct-2.1-0.el6.i386.rpm. Dieses lässt sich entweder direkt - ohne Abhängigkeiten aufzulösen - per rpm --install --verbose mycompany-myproduct-2.1-0.el6.i386.rpm oder mittels yum localinstall mycompany-myproduct-2.1-0.el6.i386.rpm installieren.

Nach erfolgreichem Test kann man das RPM-Paket von der Build-Maschine auf den Repository-Server kopieren:

scp /home/rpmbuild/rpmbuild/RPMS/i386/* root@repo-server:/var/www/html/packages/rhel/6/i386

Auf dem Repository-Server muss anschliessend die Repository-„Datenbank“ aktualisiert werden:

cd /var/www/html/packages/rhel/6/i386
createrepo .
NEWEST_RPM=$(find mycompany-myproduct-* | sort --version-sort | tail -1)
unlink latest.rpm
ln -s $NEWEST_RPM latest.rpm

Built on 2022-06-03