4.3. RPM – Il package-manager della distribuzione

ricorre a RPM (ingl. RPM Package Manager), con i programmi principali rpm e rpmbuild, per amministrare i pacchetti software. In tal modo gli utenti, gli amministratori di sistema e anche coloro che assemblano dei pacchetti dispongono di un potente database, e così di informazioni dettagliate in qualsiasi momento, sul software installato.

Essenzialmente rpm può agire in cinque modi: installare/disinstallare o aggiornare dei pacchetti software, ricreare la banca dati RPM, inviare richieste alla banca dati RPM o a singoli archivi RPM, controllare l'integrità dei pacchetti e firmare pacchetti. rpmbuild crea pacchetti da poter installare da sorgenti cosiddette pristine, cioé non modificati.

Gli archivi RPM installabili vengono compressi in uno speciale formato binario; gli archivi sono composti di file da installare e di diverse meta-informazioni che vengono usate da rpm durante l'installazione stessa per configurare il relativo pacchetto software, o che vengono archiviate nel database RPM a scopo documentativo. Gli archivi RPM hanno l'estensione .rpm.

Con rpm potete amministrare pacchetti conformi allo standard LSB; su LSB cfr. la sezione Section A.4, “Standard e specificazioni”.

[Tip]Tip

In alcuni pacchetti, i componenti necessari allo sviluppo di software (biblioteche, file header ed include, ecc.) sono stati raccolti in pacchetti a se stanti. Questi pacchetti sono necessari soltanto quando si intende compilare da soli del software (ad esempio, nuovi pacchetti GNOME). Generalmente, questi pacchetti sono riconoscibili dall'estensione -devel: alsa-devel, gimp-devel, kdelibs-devel etc.

4.3.1. Controllare l'autenticità di un pacchetto

I pacchetti RPM di vengono firmati con GnuPG; ecco la chiave compreso il fingerprint:

1024D/9C800ACA 2000-10-19 SuSE Package Signing Key <build@suse.de>
Key fingerprint = 79C1 79B2 E1C8 20C1 890F 9994 A84E DAE8 9C80 0ACA

Con il seguente comando potete controllare la firma di un pacchetto RPM e in questo modo stabilire se proviene veramente da o da una altra fonte affidabile:

rpm --checksig apache-1.3.12.rpm

Cosa consigliabile specialmente quando si scaricano pacchetti di aggiornamento da Internet. Di default, la nostra chiave pubblica per firmare i pacchetti si trova in /root/.gnupg/. A partire dalla versione 8.1, la chiave si trova inoltre nella directory /usr/lib/rpm/gnupg/, in modo che anche l'utente normale possa controllare la firma dei pacchetti RPM.

4.3.2. Amministrare i pacchetti: installarli, aggiornarli e disinstallarli

Normalmente, installare un archivio RPM é una questione di pochi attimi:

rpm -i <pacchetto>.rpm 

Con questo comando standard, un pacchetto viene installato solo se sono rispettate le dipendenze e se non vi sono dei conflitti. Tramite una comunicazione d'errore, rpm richiede i pacchetti necessari all'adempimento delle dipendenze. In background, il database fa la guardia che non vi siano dei conflitti: di norma un file può appartenere solo ad un pacchetto. Con diverse opzioni, é possibile aggirare questa regola – chi lo fa deve sapere perfettamente ciò che sta facendo, poiché ciò può compromettere la capacità del sistema di eseguire un aggiornamento.

Di sicuro interesse sono anche le opzioni -U o --upgrade e -F o --freshen per aggiornare un pacchetto.

rpm -F <pacchetto.rpm>

In questo modo viene cancellata una versione vecchia del pacchetto ed installata quella nuova. La differenza tra le due versioni é che con -U vengono installati anche pacchetti che finora non sono disponibili nel sistema, mentre con l'opzione -F un pacchetto viene aggiornato solo se installato in precedenza. Contemporaneamente rpm cerca di intervenire con cautela sui file di configurazione applicando – detto in maniera un pò semplificata –la seguente strategia:

  • Se un file di configurazione non é stato modificato dall'amministratore di sistema, rpm installa la nuova versione del file relativo. Un intervento da parte dell'amministratore non é più necessario.

  • Se un file di configurazione é stato modificato prima dell'aggiornamento, rpm memorizzerà con l'estensione .rpmorig o .rpmsave il file modificato e installerà la nuova versione del pacchetto RPM solo nel caso vi siano delle differenze tra il file originale e il file del pacchetto d'aggiornamento. In questo caso é molto probabile che dobbiate adattare il file di configurazione appena installato in base alla copia di sicurezza (.rpmorig o .rpmsave) al vostro sistema.

  • I file .rpmnew appaiono se il file di configurazione esiste già e se nel file .spec é stato attivato noreplace.

Alla fine di un update, dopo l'adattamento, si devono rimuovere tutti i file .rpmorig-, .rpmsave- o .rpmnew per non essere d'impaccio ai futuri update. L'estensione .rpmorig viene scelta se il file era sconosciuto alla banca dati RPM, altrimenti si ha l'estensione .rpmsave. Cioé: .rpmorig si ha quando si esegue l'update da un formato estraneo ad RPM; .rpmsave si ha all'update dall'RPM vecchio all'RPM nuovo. Con .rpmnew non si può dire se l'amministratore abbia eseguito una modifica nel file di configurazione o meno. Un elenco di questi file lo trovate sotto /var/adm/rpmconfigcheck.

Tenete presente che alcuni file di configurazione (p.es. /etc/httpd/httpd.conf) non vengono sovrascritti di proposito, affinché si possa continuare a lavora senza interruzione con le proprie impostazioni.

L'opzione -U é dunque più che un equivalente della sequenza -e (disinstallare/cancellare) ed -i (installare). Ogni qualvolta sia possibile é consigliabile usare l'opzione -U.

[Important]Important

Dopo ogni aggiornamento dovete controllare le copie di sicurezza con l'estensione .rpmorig o .rpmsave create da rpm; si tratta dei vostri vecchi file di configurazione. Se necessario, assumete i vostri adattamenti dalle copie di sicurezza ed inseritele nei nuovi file di configurazione, e cancellate quindi i vecchi file con l'estensione .rpmorig o .rpmsave.

, tramite l'opzione -i, riesce a risolvere tutte le dipendenze di pacchetti e di eseguire di conseguenza l'installazione tramite l'opzione:

yast -i <pacchetto>

Se intendete eliminare un pacchetto, procedete in modo analogo:

rpm -e <pacchetto>

rpm elimina un pacchetto solo quando non esistono più delle dipendenze;. p.es. é teoreticamente impossibile cancellare Tcl/Tk finché richiesto da un programma – anche qui fa la guardia RPM con il suo database. Se, in casi eccezionali, non é possibile cancellare un pacchetto, benché non ci sia alcuna dipendenza, può essere d'aiuto ricostruire il database RPM con l'aiuto dell'opzione --rebuilddb; si vedano più avanti le note sull'RPM database.

4.3.3. RPM e patch

Per garantire la sicurezza di un sistema é necessario di tanto in tanto installare dei pacchetti che lo aggiornano. Finora un bug in un pacchetto si lasciava eliminare solo se si sostituiva l'intero pacchetto. Nel caso di grossi pacchetti con piccoli errori si raggiungeva subito una considerevole quantità di dati. A partire dalla versione 8.1 offre una nuova feature di RPM che consente di installare delle patch per pacchetti.

Vogliamo illustrare le caratteristiche di maggior interesse di una RPM patch prendendo pine come esempio:

  • La RPM patch va bene per il mio sistema?

    Per poter rispondere a questa domanda bisogna sapere quale versione del pacchetto é installata. Nel caso di pine immettete il comando

     rpm -q pine
     pine-4.44-188
     

    Ora viene analizzato se l'RPM patch va bene per questa versione di pine:

    rpm -qp --basedon pine-4.44-224.i586.patch.rpm 
    pine = 4.44-188 
    pine = 4.44-195 
    pine = 4.44-207
    

    Questa patch va bene per le tre versioni di pine riportate. Visto che é inclusa anche la nostra, possiamo installare la patch.

  • Quali file vengono sostituiti dalla patch?

    I file interessati possono essere letti facilmente da una RPM patch. Il parametro -P di rpm serve a selezionare determinate feature della patch, e con

    rpm -qpPl pine-4.44-224.i586.patch.rpm
    /etc/pine.conf
    /etc/pine.conf.fixed
    /usr/bin/pine
    

    si ottiene un elenco dei file, o se la patch é già installata l'elenco si ottiene con

    rpm -qPl pine
    /etc/pine.conf
    /etc/pine.conf.fixed
    /usr/bin/pine
    
  • Come si installa una RPM patch?

    Alla stregua di RPM 'normali'. L'unica differenza é che deve essere già installato un RPM adatto alla RPM patch.

  • Quali patch sono installate nel sistema e su quale versione del pacchetto si basano?

    Un elenco delle patch installate si ottiene con il comando rpm -qPa. Se, come nel nostro esempio, in un sistema nuovo é stata installata finora solo una patch, si avrà:

    rpm -qPa
    pine-4.44-224
    

    Se dopo un certo periodo di tempo volete sapere quale versione del pacchetto é stata installata originariamente, consultate la banca dati di RPM. Nel caso di pine immettete il comando .

    rpm -q --basedon pine
    pine = 4.44-188
    

Ulteriori informazioni, anche sulle feature della patch di RPM, sono reperibili nella pagina di manuale rpm e rpmbuild.

4.3.4. Inviare richieste

Con l'opzione -q (ingl.query) si crea una richiesta. Con essa é possibile sia rovistare negli archivi RPM (opzione -p pacchetto_file) che interrogare la banca dati RPM. Le modalità di risposta possono venire impostate tramite ulteriori parametri; cfr la tabella Table 4.7, “Le opzioni di richiesta più importanti (-q [-p] pacchetto)”.

Table 4.7. Le opzioni di richiesta più importanti (-q [-p] pacchetto)

-i

mostra le informazioni sul pacchetto

-l

mostra la lista dettagliata dei file

-f FILE

richiesta del pacchetto che contiene il file FILE; FILE deve venire indicato con il percorso completo!

-s

mostra lo stato del file (implica -l)

-d

elenca solo i file di documentazione (implica -l)

-c

elenca solo i file di configurazione (implica -l)

--dump

mostra tutte le informazioni verificabili di ogni file (usare insieme a -l, -c o -d!)

--provides

elenca le funzionalità del pacchetto che possono venire richieste da un altro pacchetto con --requires

--requires, -R

elenca le dipendenze del pacchetto

--scripts

elenca i diversi script di (dis)installazione

Il seguente comando elenca le informazioni nell'output Example 4.2, “rpm -q -i wget”:

rpm -q -i wget

Example 4.2. rpm -q -i wget

Name        : wget                    Relocations: (not relocateable)
Version     : 1.8.2                   Vendor: SuSE Linux AG, Nuernberg, Germany
Release     : 301                     Build Date: Di 23 Sep 2003 20:26:38 CEST
Install date: Mi 08 Okt 2003 11:46:31 CEST      Build Host: levi.suse.de
Group: Productivity/Networking/Web/Utilities Source RPM: wget-1.8.2-301.src.rpm
Size        : 1333235                          License: GPL
Signature   : DSA/SHA1, Di 23 Sep 2003 22:13:12 CEST, Key ID a84edae89c800aca
Packager    : http://www.suse.de/feedback
URL         : http://wget.sunsite.dk/
Summary     : A tool for mirroring FTP and HTTP servers
Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This can be done in script files or via the command line.
[...]

L'opzione -f ha l'effetto desiderato se si conosce il nome del file completo, incluso il percorso; si può inserire una quantità qualsiasi di noimi di file da cercare, p.es.:

rpm -q -f /bin/rpm /usr/bin/wget

conduce al risultato:

rpm-3.0.3-3
wget-1.5.3-55

Se si conosce solo una parte del nome del file ci si deve aiutare con uno shell script (cfr. Example 4.3, “Script cerca-pacchetti”); il nome del file cercato é da indicare come parametro alla chiamata dello script.

Example 4.3. Script cerca-pacchetti

#! /bin/sh
for i in $(rpm -q -a -l | grep  $1); do
   echo "\"$i\" é nel pacchetto:"
    rpm -q -f $i
    echo ""
done

Con il comando rpm -q --changelog rpm vi fate mostrare l'elenco le informazioni (update, configurazione, modifiche etc.) su un determinato pacchetto; si vedaamo nell'esempio il pacchetto rpm:

rpm -q --changelog rpm

Tuttavia, vengono visualizzate solo le ultime 5 voci della banca dati RPM: nel pacchetto sono però contenute tutte le voci (degli ultimi due anni): se il CD 1 é montato su /cdrom potete fare la vostra richiesta.

rpm -qp --changelog /cdrom/suse/i586/rpm-3*.rpm

In base alla banca dati installata, si possono anche eseguire dei controlli; queste operazioni vengono avviate con l'opzione -V (equivale a -y o --verify). Con questa opzione si induce rpm a mostrare tutti quei file che sono stati modificati rispetto alla versione originale (cioé quella contenuta nel pacchetto). rpm antepone al nome di file vero e proprio fino ad otto caratteri, i quali indicano le seguenti modifiche:

Table 4.8. I controlli

5

somma di controllo MD5

S

grandezza del file

L

link simbolico

T

ora della modifica

D

major e minor (ingl. device number)

U

utente (ingl.user)

G

gruppo (ingl.group)

M

modo (incl. diritti e tipo)

Nei file di configurazione viene emessa anche una c. Per esempio, nel caso sia stato modificato qualcosa in /etc/wgetrc del wget:

rpm -V wget
S.5....T c /etc/wgetrc

I file della banca dati RPM si trovano sotto /var/lib/rpm.

Con una partizione /usr di 1 GB, la banca dati può senz'altro riservarsi 30 Mbyte di spazio sull' hard disk; specialmente dopo un aggiornamento completo. Se la banca dati sembra essere troppo grande é sempre d'aiuto crearne (con l'opzione --rebuilddb) una nuova sulla base di quella già esistente; non nuoce mai fare una copia di sicurezza prima di eseguire un rebuild.

Lo script cron cron.daily deposita le copie giornaliere compresse della banca dati sotto /var/adm/backup/rpmdb, la cui quantità viene determinata dalla variabile MAX_RPMDB_BACKUPS (standard: 5) in /etc/sysconfig/backup; si deve contare con fino a 3 Mbyte per ogni back-up con una /usr di 1 Gbyte.

4.3.5. Installare e compilare i sorgenti

Tutti i sorgenti di terminano in .src.rpm, si tratta dei “source-RPM”.

[Tip]Tip

Come tutti i pacchetti, anche questi possono venire installati tramite ; i sorgenti non vengono però mai contrassegnati come installati ([i]), come è invece il caso per pacchetti normali. Ciò dipende dal fatto che i sorgenti non vengono registrati nella banca dati RPM; in essa infatti appare solo software installato.

Le directory di lavoro di rpm oppure rpmbuild sotto /usr/src/packages devono essere presenti (nel caso non si sia fatta una propria configurazione p.es. tramite /etc/rpmrc):

SOURCES

per i sorgenti originali (file .tar.gz etc.) e per gli adattamenti specifici della distribuzione (file .dif).

SPECS

per i file .spec che alla stregua dei meta-makefile controllano il processo build.

BUILD

sotto questa directory si scompattano, si correggono (patch) e si compilano i sorgenti.

RPMS

qui vengono archiviati i pacchetti binari pronti.

SRPMS

e qui i source-RPM.

Se installate con un pacchetto sorgente, le componenti necessarie per il processo build, vengono installate sotto /usr/src/packages: i sorgenti e gli adattamenti sotto SOURCES ed i rispettivi file .spec sotto SPECS.

[Important]Important

Non fate esperimenti con gli RPM e componenti importanti del sistema (libc, rpm, sysvinit, etc.); altrimenti mettete a repentaglio la funzionalità del vostro sistema.

Osserviamo ora il pacchetto wget.src.rpm. Dopo aver installato il pacchetto sorgente wget.src.rpm con vi sono i file:

/usr/src/packages/SPECS/wget.spec
/usr/src/packages/SOURCES/wget-1.4.5.dif
/usr/src/packages/SOURCES/wget-1.4.5.tar.gz

Con rpmbuild -b X /usr/src/packages/SPECS/wget.spec viene inizializzato il processo di compilazione; la variabile X può stare per diversi gradi (cfr. l'output di --help o la documentazione RPM); segue una breve descrizione:

-bp

Preparare i sorgenti nella directory /usr/src/packages/BUILD: decomprimere e patchare.

-bc

come -bp ed inoltre compilazione.

-bi

come -bc, con installazione; ATTENZIONE, se un pacchetto non supporta la feature BuildRoot, può accadere che durante l'installazione vengano sovrascritti importanti file di configurazione!

-bb

come -bi, con creazione del cosiddetto RPM binario; se tutto é andato per il verso giusto, lo ritrovate in /usr/src/packages/RPMS.

-ba

come -bb, con creazione del cosiddetto RPM sorgente; se tutto é andato per il verso giusto, si trova in /usr/src/packages/SRPMS.

--short-circuit

Con questa opzione potete saltare i singoli passi.

L'RPM binario creato alla fine deve venire installato con rpm-i o meglio con rpm-U .

4.3.6. Creare pacchetti RPM con build

Nel caso di molti pacchetti sussiste il pericolo che durante la loro compilazione si copiano involontariamente dei file sul sistema in esecuzione. Per evitare che questo avvenga potete usare build che crea un ambiente ben definito in cui assemblare il pacchetto. Per creare un ambiente chroot, lo script di build deve disporre di un albero di pacchetti completo che può trovarsi sul disco rigido o essere messo a disposizione tramite NFS o trovarsi anche su un DVD. Basta comunicarlo allo script con il comando build --rpms <percorso>. A differenza di rpm, il comando build preferisce avere il file SPEC nella stessa directory dei sorgenti. Se come nell'esempio riportato sopra volete ricompilare wget e il DVD é montato sotto /media/dvd, immettete i seguenti comandi come root:

cd /usr/src/packages/SOURCES/
mv ../SPECS/wget.spec . 
build --rpms /media/dvd/suse/ wget.spec

Sotto /var/tmp/build-root viene creato un ambiente minimale in cui assemblare il pacchetto. In seguito i pacchetti creati si trovano sotto /var/tmp/build-root/usr/src/packages/RPMS

Lo script build mette ancora un serie di altre opzioni a vostra disposizione. Potrete utilizzare propri RPM, non inizializzare l'ambiente build o limitare il comando rpm ad uno dei livelli descritti sopra. Per avere maggiori dettagli digitate il comando build --help e consultate la pagina di manuale con man build.

4.3.7. Tool per gli archivi RPM e la banca dati RPM

Il Midnight Commander (mc) é, di per sé, in grado di mostrare il contenuto di un archivio RPM e di copiarne delle parti. L'archivio viene raffigurato come file system virtuale, di modo che siano disponibili i punti di menu di Midnight Commander: le informazioni dell'header del file HEADER possono venire visualizzate premendo F3; con i tasti-cursore e con Invio é possibile navigare nell'archivio, e all'occorrenza copiarne delle componenti con F5.

KDE contiene il tool kpackage. GNOME vi offre gnorpm.

Con Alien (alien) é possibile convertire i formati dei pacchetti delle diverse distribuzioni. In questo modo si può tentare, prima dell'installazione, di convertire vecchi archivi TGZ in RPM, affinché, durante l'installazione stessa, la banca dati RPM venga rifornita con le informazioni dei pacchetti. Ma ATTENZIONE: alien é uno script Perl, e come informano gli autori, si trova ancora in fase “alpha” – nonostante abbia già raggiunto un numero di versione abbastanza elevato. Infine, anche per Emacs vi è rpm.el, un front-end per rpm