linux-suse-opensuse package-management rpm internals sles opensuse

RPM Format: SUSE Package Internals (Artikel 130)

Analyse des RPM-Paketformats unter SUSE. Erfahren Sie alles über Metadaten, Abhängigkeits-Deklarationen und den Umgang mit Source-RPMs für eigene Anpassungen.

# RPM Deep Dive: Die DNA von SUSE-Paketen

TL;DR / Management Summary Das RPM (Red Hat Package Manager) Format ist der gemeinsame Nenner von SUSE und Red Hat. Ein RPM ist jedoch weit mehr als ein komprimiertes Archiv. Es ist eine Datenbank-Entität, die Skripte zur Installation, Deinstallation und komplexe Abhängigkeits-Graphen enthält. Wer RPM auf Experten-Ebene versteht, kann Pakete manuell analysieren, Integritätsprüfungen durchführen und Fehler in der Paket-Logik finden, bevor diese das System beschädigen.


# 1. Einführung & Architektur

Was steckt in der .rpm Datei?

Ein RPM-Paket besteht aus vier Teilen:

  1. Lead: Identifiziert die Datei als RPM.
  2. Signature: Garantiert die Unversehrtheit und Herkunft (GPG).
  3. Header: Enthält Metadaten (Name, Version, Abhängigkeiten).
  4. Archive: Die eigentlichen Dateien (meist CPIO komprimiert).

# Der Paket-Lebenszyklus (Mermaid)

graph TD
    A[Source Code] --> B[Spec-File: Rules]
    B --> C[OBS / rpmbuild]
    C --> D[Source RPM .src.rpm]
    C --> E[Binary RPM .rpm]
    E -->|Verify Signature| F[Target System]
    F -->|Scripts: pre/post| G[Installation]
    G -->|Update Database| H[/usr/lib/sysimage/rpm]

# 2. Metadaten-Analyse

Blick in den Header.

Nutzen Sie das rpm Kommando für die Analyse, auch wenn Sie Pakete meist mit Zypper installieren.

# Informationen abfragen

# Zeige Informationen zu einem nicht installierten File
rpm -qip mypackage.rpm

# Zeige alle Abhängigkeiten (Requires)
rpm -qpR mypackage.rpm

# Was liefert dieses Paket (Provides)?
rpm -qp --provides mypackage.rpm

# 3. Fortgeschrittene Techniken

Manipulation und Extraktion.

# Skripte anzeigen

RPMs können Skripte ausführen (pre-install, post-install). Dies ist oft die Ursache für hängende Updates.

rpm -qp --scripts mypackage.rpm

# Dateien extrahieren ohne Installation

Wenn Sie nur eine Datei aus einem riesigen Paket brauchen:

# Extrahiert den Inhalt in das aktuelle Verzeichnis
rpm2cpio mypackage.rpm | cpio -idmv

# 4. Day-2 Operations: Integrität & Audit

Wurden Systemdateien geändert?

Ein mächtiges Feature von RPM ist der Verify Modus. Er vergleicht den Ist-Zustand auf der Disk mit den Werten in der RPM-Datenbank.

# System-Check

# Prüft alle installierten Pakete
sudo rpm -Va

Output Legende:

  • S: Dateigröße unterscheidet sich.
  • M: Berechtigungen (Mode) unterscheiden sich.
  • 5: MD5/SHA Checksumme passt nicht (Inhalt geändert!).
  • T: Zeitstempel unterscheidet sich.

# 5. Troubleshooting & “War Stories”

Wenn die Datenbank lügt.

# Story 1: “Der korrupte Superblock der RPM-DB”

Symptom: zypper oder rpm hängen ewig bei 0% oder melden “BDB0060 PANIC”. Ursache: Ein Stromausfall während einer Installation hat die Berkeley-DB unter /usr/lib/sysimage/rpm beschädigt. Lösung:

sudo rm -f /usr/lib/sysimage/rpm/__db*
sudo rpm --rebuilddb

# Story 2: “Das hängende Post-Install Skript”

Symptom: Die Installation bleibt bei “Installing…” stehen und frisst 100% CPU. Ursache: Ein postinstall Skript wartet auf User-Eingaben oder versucht einen DNS-Lookup, der blockiert wird. Lösung: Finden Sie den Prozess mit ps aux | grep rpm. Killen Sie ihn und analysieren Sie das Skript mit rpm -q --scripts <paket>. Installieren Sie das Paket notfalls ohne Skripte: rpm -i --noscripts ....


# 6. Fazit & Empfehlung

  • Signaturen: Installieren Sie niemals RPMs ohne GPG-Check (--nosignature vermeiden!).
  • Audit: Nutzen Sie rpm -V regelmäßig zur Einbruchserkennung (Rootkit-Check).
  • Wahl: Nutzen Sie rpm für die Analyse und zypper für die eigentliche Arbeit.

# Anhang: Cheatsheet

Aufgabe Befehl
Zu welchem Paket gehört Datei X? rpm -qf /path/to/file
Liste aller Dateien im Paket rpm -ql <name>
Changelog lesen rpm -q --changelog <name>
Paket-Integrität prüfen rpm -V <name>
RPM Datenbank reparieren rpm --rebuilddb
Installierte Pakete nach Größe `rpm -qa --queryformat ‘%{SIZE} %{NAME}\n’
Architektur prüfen rpm -qp --queryformat '%{ARCH}\n' <file>