# RPM Package Manager

RPM Package Manager (of RPM, oorspronkelijk Red Hat Package Manager genaamd) is een package manager die primair is bedoeld voor het besturingssysteem Linux. RPM installeert, update, verwijdert, verifieert en bevraagt softwarepakketten. RPM is het standaardsoftwarepakketformaat van de Linux Standard Base. RPM is oorspronkelijk ontwikkeld door Red Hat voor Red Hat Linux, maar wordt nu door vele Linuxdistributies gebruikt. Het is daarnaast ook geporteerd naar enkele andere besturingssystemen, zoals Novell Netware (sinds versie 6.5 SP3) en IBM AIX. De vorm waarin het acroniem "RPM" heden ten dage wordt gebruikt, i.e. in de betekenis "RPM Package Manager", is een goed voorbeeld van een recursief acroniem.

## De RPM-database

Achter de schermen van RPM zit de op Berkeley DB gebaseerde RPM-database. Deze bevat alle informatie voor elk geïnstalleerd pakket. De database houdt de gegevens bij van elke file die door middel van RPM is geïnstalleerd. Daardoor kunnen diezelfde geïnstalleerde files eenvoudig weer worden verwijderd. Indien de database verstoord raakt, wat kan gebeuren indien het RPM-programma abrupt wordt afgebroken, kan de database vaak toch nog worden hersteld dankzij de ingebouwde dubbelgelinkte lijst. Op Red Hatsystemen staat de database in /var/lib/rpm. Een lijst met de bestanden in de database kan afgedrukt worden met de opdracht:

## Frontend

Door Linuxgebruikers en systeembeheerders worden rpm-bestanden gebruikt om op een eenvoudige manier software te kunnen updaten, upgraden of installeren. Het programma rpm vormt de basis van het pakketbeheersysteem. Daar overheen wordt meestal een gebruiksvriendelijke gebruikersomgeving (frontend), zoals yum of PackageKit, gebruikt waarmee een gebruiker via een simpele opdracht of een paar muisklikken, een toepassing kan installeren of updaten.
De volgende gereedschappen worden veel gebruikt op RPM-gebaseerde systemen:
* yum, gebruikt in Yellow Dog Linux, Red Hat Linux en in Fedora.
* up2date, gebruikt in Red Hat Enterprise Linux en in Fedora Core.
* YaST, gebruikt in SUSE
* zypper, gebruikt in openSUSE en SUSE Enterprise Linux
* urpmi, gebruikt in Mandriva Linux
* apt-rpm, de met RPM compatibele versie van apt-get

## Pakketnaam

Elk RPM-softwarepakket in een repository heeft een naam die bestaat uit een label of etiket en een extensie .rpm.

### Label

Het label bevat de volgende gegevens:
* de pakketnaam
* de versie van het pakket (een code die van het versiebeheersysteem van de oorspronkelijke softwarebron wordt overgenomen)
* de release (het aantal keren dat een gelijkende versie van het pakket werd samengesteld); met dit veld wordt bovendien vaak de desbetreffende distributie waarvoor het bedoeld is, aangeduid, bijvoorbeeld door tekenreeksen als mdk (Mandriva Linux), fc4 (Fedora Core 4), rhl9 (Red Hat Linux 9), suse93 (SuSE Linux 9.3) etc.
* de architectuur waarop of waarvoor het pakket werd gebouwd (i386, i686, Athlon, ppc, etc.)
De naam van elk RPM-softwarepakket heeft normaliter het volgende formaat:
Een voorbeeld:
Het pakketlabel is vervat in de RPM-softwarepakketfile, maar stemt niet noodzakelijk overeen met de naam van de file.

### src

Broncode wordt in SRPM-files verpakt en gedistribueerd. Zulke pakketten zijn bedoeld voor het maken van RPM-bestanden en behoren niet tot een bepaalde architectuur. Ze krijgen daarom als architectuurbenaming src (van het Engelse "source" = bron). Bijvoorbeeld:

### noarch
#### Scripts

    Naast software in de vorm van gecompileerde code wordt veel software geïnstalleerd in de vorm van een scripttaal voor een interpreter. Scripts zijn niet afhankelijk van de architectuur van de hardware. Op unixplatforms worden vaak shellscripts of scripts voor Perl en Python gebruikt. Een voorbeeld is yum:
    Het programma bestaat uit een script voor Python.

#### Libraries

    Softwarebibliotheken (libraries) worden voor elke versie in twee afzonderlijke pakketten gedistribueerd. Het ene pakket bevat de voorgecompileerde code (de binary) die direct gebruikt kan worden en het andere (de library) bevat de ontwikkelingsfiles van het desbetreffende pakket, zoals zogenaamde headerfiles en de broncode van de implementatie. Aan de naam van deze librarypakketten is de tekenreeks -devel toegevoegd omdat deze pakketten alleen bestemd zijn voor softwareontwikkelaars. Om de library te laten samenwerken met andere programma's, dient de versie van de voorgecompileerde code overeen te stemmen met die van de library.

#### Documentatie en multimedia

    Tot de noarch.rpm-categorie behoren verder beeld- en geluidsfiles en door andere programma's te gebruiken tekstinformatiefiles, zoals files met documentatie:
    waarin de naam van het pakket java-1.7.0-openjdk-javadoc, de versie van het pakket 1.7.0.6 en de release van het pakket 2.3.2.fc12.1 is.

## Voor- en nadelen van het RPM-systeem

Voordelen die vaak worden genoemd bij het gebruik van RPM-pakketten boven dat van andere manieren om software te verzamelen en te installeren, zijn:
* Het installeren van programma's gebeurt steeds via dezelfde weg.
* Het verwijderen van programma's is eenvoudig.
* Populariteit: beschikbaarheid van veel pakketten, ook al dient er een hercompilatie plaats te vinden voor een andere distributie.
* Niet-interactieve installatie: dit maakt het makkelijk om installatie te automatiseren.
* Oorspronkelijke bronbestanden meegeleverd: dit maakt verificatie mogelijk.
* Cryptografische verificatie met GPG of md5.
* DeltaRPM's, die het RPM-equivalent zijn van patchfiles, zijn te combineren met reeds door RPM geïnstalleerde pakketten, waardoor updates kunnen worden uitgevoerd. Dit is een veel handiger manier om door RPM geïnstalleerde software te updaten, omdat DeltaRPM niet het oorspronkelijke RPM-pakket nodig heeft om de update uit te voeren.
Vaak genoemde nadelen zijn onder meer:
* Er zitten soms (terugwaarts) incompatibele veranderingen in het pakketformaat.
* De documentatie is incompleet en/of verouderd.
* Het maken van RPM-pakketten heeft een steile leercurve.
* Pakketversieafhankelijkheden spreken elkaar soms tegen, afhankelijk van de gebruikte Linuxdistributie.
* "Gewone" programma's zijn niet in staat om RPM-pakketten uit te pakken, zoals mogelijk is bij tgz-files. Hierbij moet echter worden verteld dat de tarball van de broncode van het programma "rpm" een shellscript bevat - rpm2cpio.sh - dat in staat is om het "cpio"-archiefgedeelte van een RPM-file uit te pakken (door slechts gebruik te maken van "od", "expr", "dd" en "gunzip").
RPM is ook bekritiseerd voor het ontbreken van consistentie in pakketnamen en -inhoud, wat het automatisch afhandelen van afhankelijkheden kan bemoeilijken. Dit is echter geen probleem dat uniek is voor het RPM-systeem, omdat het een coördinatieprobleem betreft tussen de grote Linuxdistributies die RPM als pakketbeheersysteem gebruiken, zoals Red Hat Linux, SuSE en Mandriva Linux. Bij het gebruik van RPM-pakketten van een specifieke distributie (bijvoorbeeld Red Hat Linux) of van RPM-pakketten die zijn gebouwd voor een bepaalde distributie (bijvoorbeeld Freshrpms voor Red Hat Linux) kan een automatische afhankelijkhedenproef werken dankzij het gebruik van gereedschap als "yum" (Yellow Dog Updater Modified) of "apt" (Advanced Packaging Tool) (zie onder). Exclusief gereedschap voor Mandriva Linux is "urpmi", dat kan helpen bij de zogenaamde hel van afhankelijkheden.

## Third-party software

Als een rpm-bestand van bepaalde software ontbreekt in de repositories van een Linuxdistributie, zoals dat bij propriëtaire software vaak het geval is, dan kan die software vaak als third-party software van de site van de leverancier gedownload worden. Als een leverancier een geschikt rpm-bestand aanbiedt, dan kan de software met dat bestand geïnstalleerd worden. Als een leverancier geen geschikt rpm-bestand kan leveren, dan kan de software eventueel vanaf een tarball opgebouwd worden.

### Distributies

Bijna alle Linuxdistributies met een RPM Package Manager zijn forks van Fedora, Mandriva of SUSE. Er zijn verschillen tussen de package managers van verschillende versies van deze distributies. Vaak worden van third-party software verschillende rpm-bestanden aangeboden voor verschillende Linuxdistributies, zoals Red Hat, Fedora, SUSE of Mandriva.
* Scientific Linux, CentOS, Fuduntu en BLAG zijn voorbeelden van forks van Fedora en gebruiken yum als command-line frontend.
* Mageia en PCLinuxOS zijn afgeleid van Mandriva en gebruiken urpmi als command-line frontend.

### Pakketinformatie

Met de zoekfuncties van het RPM-programma kan informatie over een pakket online opgevraagd worden. Met de opdracht:
kan informatie over de inhoud en de herkomst van het rpm-bestand verkregen worden.
De opdracht:
drukt een lijst met de versies van de pakketten af die op het systeem geïnstalleerd moeten zijn. Deze informatie kan van belang zijn voor de installatie van de software.

## Het maken van RPM's

Het "recept" voor het maken van een RPM-pakket is een specfile. Namen van specfiles eindigen op ".spec" en deze files bevatten de pakketnaam, versie, RPM-revisienummer, de stappen om pakketten samen te stellen, te installeren en op te schonen, plus een changelog (= lijst van veranderingen). Uit een enkele RPM-specfile kunnen, indien gewenst, verscheidene pakketten worden samengesteld. RPM-pakketten worden gemaakt met behulp van "rpmbuild".