RPM : Panoramica ed opzioni particolari

rpm

Le maggiori distribuzioni Linux relativamente alla gestione dei pacchetti si dividono generalmente in tre grosse categorie :

  • Quelle che utilizzano i binari RPM (RedHat, SuSe, Mandriva e derivate);
  • Quelle che utilizzano i binari Deb (Debian, Ubuntu e derivate);
  • Quelle che in maniera diversa ricompilano i sorgenti (Slackware, Gentoo e derivate);

Questo articolo si propone di analizzare la struttura del sistema di pacchettizzazione RPM, presentando in particolare esempi di operazioni utilissimi, ma a volte sconosciuti.

Metodi di interrogazione e verifica : opzioni -q e -V

Un sistema è composto da numerosi pacchetti RPM che insieme compongono quella che viene definita “distribuzione”.
Per avere una lista di tutti i pacchetti installati è sufficiente lanciare il seguente comando :

$ rpm -qa
basesystem-8.0-5.1.1
glibc-2.5-24
...
...
libwvstreams-4.2.2-2.1
Deployment_Guide-it-IT-5.2-9

conseguentemente sarà possibile conoscere il numero totale di pacchetti installati :

$ rpm -qa | wc -l
513

o ad esempio un elenco di pacchetti che rispondano a determinati criteri di ricerca :

$ rpm -qa "*gnutls*"
gnu-efi-3.0c-1.1
gnupg-1.4.5-13
gnutls-1.4.1-2

Relativamente all’elenco dei pacchetti installati sono possibili numerose interrogazioni.

E’ possibile stampare i dettagli su un pacchetto installato attraverso l’opzione -i :

$ rpm -qi setup
Name        : setup                        Relocations: (not relocatable)
Version     : 2.5.58                            Vendor: Red Hat, Inc.
Release     : 1.el5                         Build Date: mar 28 nov 2006 16:33:00 CET
Install Date: gio 15 gen 2009 13:47:07 CET      Build Host: hs20-bc1-6.build.redhat.com
Group       : System Environment/Base       Source RPM: setup-2.5.58-1.el5.src.rpm
Size        : 379754                           License: public domain
Signature   : DSA/SHA1, mer 17 gen 2007 18:52:25 CET, Key ID 5326810137017186
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary     : File di configurazione del sistema.
Description :
Il pacchetto setup contiene vari file di
configurazione molto importanti come: passwd, group e profile.

Capire a quale pacchetto appartiene un determinato file con l’opzione -f :

$ rpm -qf /etc/passwd
setup-2.5.58-1.el5

Stampare l’elenco dei files contenuti in un pacchetto con l’opzione -l :

$ rpm -ql setup
/etc/aliases
/etc/bashrc
...
...
/usr/share/doc/setup-2.5.58
/usr/share/doc/setup-2.5.58/uidgid

Le interrogazioni illustrate possono essere effettuate anche su pacchetti non ancora installati attraverso l’aggiunta dell’opzione “-p“, ad esempio per stampare l’elenco dei file in un pacchetto non installato è sufficiente digitare il seguente comando :

$ rpm -qlp openldap-clients-2.3.27-8.el5_1.3.i386.rpm 
/usr/bin/ldapadd
/usr/bin/ldapcompare
...
...
/usr/share/man/man1/ldapsearch.1.gz
/usr/share/man/man1/ldapwhoami.1.gz

E’ da notare come in questo caso sia stato passato l’intero nome del file comprensivo di versione, piattaforma ed estensione e non il solo nome del pacchetto, come avviene per gli RPM già installati.

Metodi di installazione ed aggiornamento : opzioni -i, -U, -F

Per installare un pacchetto RPM è sufficiente utilizzare il seguente comando :

$ rpm -ivh openldap-clients-2.3.27-8.el5_1.3.i386.rpm 
Preparing...                ########################################### [100%]
   1:openldap-clients       ########################################### [100%]

oltre all’opzione -i che sta per install sono aggiunte anche v per verbose, che aggiunge verbosità all’output e h per hash che mostra la barra di progresso.
E’ possibile inoltre aggiornare un pacchetto ad una versione successiva. Se si utilizza l’opzione U verrà effettuato un aggiornamento del pacchetto e la sua eventuale installazione se questo non risulta già installato nel sistema l’opzione. Se invece si utilizza l’opzione F il pacchetto verrà aggiornato solo se ne esiste una versione precedente installata nel sistema. Questa opzione risulta molto utile nel caso in cui si voglia procedere con un aggiornamento massivo di pacchetti per i quali non si ha un resoconto preciso di quanto installato. In questo caso un comando simile :

$ rpm -Fvh *.rpm 
Preparing...                ########################################### [100%]
...
...

Aggiornerà solo i pacchetti già installati nel sistema.

La risoluzione delle dipendenze

In fase di installazione è possibile utilizzare un’opzione (molte volte abusata) che permette di soprassedere il controllo delle dipendenze ed installare il pacchetto senza controlli, tale opzione è –nodeps. Inutile dire che l’utilizzo di questa, sebbene appaia nell’immediato un forte vantaggio (e cioè non dover installare pacchetti dipendenti da quello interessato), incide pesantemente sulla coerenza dei pacchetti installati. Pertanto è sempre bene trovare il modo di soddisfare le dipendenze.
Dalla versione 5 di RedHat Linux tutta la gestione dei pacchetti (e quindi delle dipendenze) è demandata ed automatizzata da yum, ma nelle versioni precedenti non essendo questo pacchetto integrato in origine la risoluzione delle dipendenze molte volte richiede un intervento manuale.
L’installazione del pacchetto rpmdb consente di avere localmente l’intero database relativo alle dipendenze dei pacchetti della distribuzione.
Tale pacchetto consente di estendere le informazioni relative alle dipendenze :

$ rpm -ivh lynx-2.8.5-11.2.i386.rpm
error: Failed dependencies:
	perl(CGI) is needed by lynx-2.8.5-11.2
    Suggested resolutions:
	/var/spool/up2date/perl-CGI-2.89-94.EL3.i386.rpm

nel caso illustrato si ha quindi una dipendenza non soddisfatta relativa al pacchetto lynx che richiede perl-CGI. A questo punto si può installare il pacchetto mancante (supponendo ovviamente o di avere il pacchetto mancante o di trovarsi in un repository contenente tutti i pacchetti) e poi procedere oppure sfruttare l’opzione –aid che si occuperà di automatizzare l’installazione dei pacchetti suggeriti :

$ rpm -ivh --aid lynx-2.8.5-11.2.i386.rpm 
Preparing...                ########################################### [100%]
   1:perl-CGI               ########################################### [ 50%]
   2:lynx                   ########################################### [100%]

rpmdb consente di avvalersi anche di altre due interessanti opzioni che sono –redhatprovides e –redhatrequires. Il nome autoesplicativo di queste opzioni chiarisce quale può essere il loro impiego :

$ rpm --redhatprovides /etc/passwd
setup-2.5.27-1

In questo caso l’impiego è del tutto simile all’opzione di interrogazione -qf spiegata poco sopra, ma un’ulteriore indubbio vantaggio di questa opzione è che si applica anche a pacchetti non installati.
Nel seguente esempio :

$ rpm --redhatrequires libcap.so.1
libcap-1.10-15.1
ntp-4.1.2-5.el3
quagga-0.96.2-11.3E
vsftpd-1.2.1-3E.12
zsh-4.0.7-1.EL.2

l’opzione –redhatrequires consente di capire quali pacchetti (installati e non) necessitano della libreria libcap.so.1.

Metodi di rimozione dei pacchetti : opzione -e

Rimuovere un pacchetto installato è possibile attraverso l’utilizzo dell’opzione -e, chiaramente il pacchetto non deve essere una dipendenza di altri installati, altrimenti l’operazione fallisce :

$ rpm --aid -e perl-CGI
error: Failed dependencies:
	perl(CGI) is needed by (installed) lynx-2.8.5-11.2

E’ da notare che anche in questo caso è possibile utilizzare l’opzione –nodeps, pena la perdita di coerenza del database.
Opzioni utili durante la rimozione possono rivelarsi le seguenti :

–allmatches : indica di rimuove TUTTE le occorrenze del pacchetto ed è utilizzata in caso di situazioni anomale in cui un pacchetto appare nell’elenco come installato più volte (con versioni differenti o con la stessa);

–repackage : prima di rimuovere il pacchetto ne crea uno partendo dai file attualmente installati nel sistema (assorbendo quindi le eventuali modifiche effettuate). Il pacchetto creato verrà posto in /var/spool/repackage/;

E’ possibile anche fare in modo che i processi denominati trigger o gli script associati al pacchetto non vengano eseguiti in fase di rimozione attraverso le opzioni –no…... I trigger e gli script possono eseguire le operazioni più disparate, dalla modifica di file di configurazione sino allo spostamento, alla rimozione di altri file e così via. E’ chiaro che prima di disabilitare queste operazioni è bene conoscere a fondo cosa fanno e di conseguenza il pacchetto a cui sono associate.
Tutte queste opzioni sono spiegate in maniera approfondita nella man page di rpm.

Metodi di verifica dei pacchetti : opzione -V

E’ possibile controllare la consistenza di un pacchetto verificando quanto presente nel database con quanto realmente esiste nel sistema.
Supponendo per il pacchetto lynx di aver rimosso tutti i file relativi al programma nella cartella /etc, la verifica del pacchetto produrrà il seguente output :

$ rpm -V lynx
missing  c /etc/lynx.cfg
missing  c /etc/lynx.cfg.cs
missing  c /etc/lynx.cfg.ja
missing  c /etc/lynx.cfg.sk

Estrazione di file da un pacchetto : utilizzo di rpm2cpio

Potrebbe nascere l’esigenza di estrarre un pacchetto in un path diverso da quello del sistema in modo da analizzare il contenuto prima di un’effettiva installazione. Il programma necessario per effettuare questa operazione è rpm2cpio distribuito nel pacchetto rpm, quindi presente in tutti i sistemi.
Attraverso rpm2cpio è possibile estrarre il pacchetto nella directory in cui ci si trova :

$ rpm2cpio  /var/spool/up2date/lynx-2.8.5-11.2.i386.rpm | cpio -id
7831 blocks

nella directory attuale verrà riprodotto il path relativo ai file contenuti nel pacchetto :

$ ls
etc  usr

Se invece l’esigenza è quella di estrarre un solo file, la sintassi del comando è la seguente :

$ rpm2cpio  /var/spool/up2date/lynx-2.8.5-11.2.i386.rpm | cpio -id --no-absolute-filenames --no-preserve-owner "*lynx.cfg*"
7831 blocks

In questo caso tutti i file corrispondono al criterio di selezione *lynx.cfg* verranno estratti dal pacchetto rpm e depositati nella cartella con il relativo path.

Posizionamento del database su disco

Come ultimo argomento di questo articolo viene trattata quella che è la posizione del database relativo ai pacchetti installati su disco. Infatti le informazioni relative alla struttura dei pacchetti installati sono memorizzate in file con formato db4 depositati nella cartella /var/lib/rpm :

$ ls /var/lib/rpm/__db.00*
/var/lib/rpm/__db.001  /var/lib/rpm/__db.002  /var/lib/rpm/__db.003

è possibile che tale database in seguito ad anomalie o malfunzionamenti si corrompa non permettendo il regolare funzionamento del sistema di pacchettizzazione.
In questo caso è necessario cancellare i file esistenti e ricostruire il database con l’opzione –rebuilddb :

$ rm /var/lib/rpm/__db.00*
$ rpm --rebuilddb

Partendo dai pacchetti installati e dalle informazioni in essi contenute il comando ricostruirà il database.
E’ possibile anche costruire un nuovo database vuoto con l’opzione –initdb, ma tale opzione è utilizzata di raro.

Conclusioni

Questa breve panoramica non ha lo scopo di analizzare tutto lo spettro di possibilità in merito all’argomento, ma si pone l’obiettivo di offrire spunti per approfondire le proprie conoscenze.
Molte altre sono le opzioni disponibili per la gestione dei pacchetti e possono essere analizzate a fondo nella man page del comando rpm.

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.

Tags: , , ,