3.3. RPM: il package manager

In SUSE Linux i pacchetti vengono gestiti con RPM (RPM Package Manager). I comandi principali di RPM sono rpm e rpmbuild. Per informazioni dettagliate sul software installato, gli utenti, gli amministratori di sistema e i creatori di pacchetti possono utilizzare l'efficiente database RPM.

rpm include essenzialmente cinque modalità: installazione, disinstallazione o aggiornamento dei pacchetti software, ricompilazione del database RPM; richiesta di database RPM o di singoli archivi RPM; verifica dell'integrità dei pacchetti e firma di pacchetti. rpmbuild consente di compilare i pacchetti installabili dalle sorgenti "pristine" (non modificate).

Gli archivi RPM installabili sono compressi in uno speciale formato binario. Questi archivi sono costituiti dai file di programma da installare e da determinate meta informazioni utilizzate durante l'installazione mediante rpm per configurare il pacchetto software, oppure archiviate nel database RPM come documentazione. Gli archivi RPM presentano generalmente l'estensione .rpm.

[Tip]Pacchetti per lo sviluppo di software

Per molti pacchetti, le componenti necessarie per lo sviluppo del software, ad esempio librerie, file header e include e così via, sono state archiviate in pacchetti separati. Questi pacchetti di sviluppo sono necessari solo quando si desidera compilare il software indipendentemente, come ad esempio i pacchetti GNOME più recenti, e possono essere identificati in base all'estensione del nome -devel, come ad esempio i pacchetti alsa-devel, gimp-devel e kdelibs3-devel.

3.3.1. Verifica dell'autenticità di un pacchetto

I pacchetti RPM di SUSE Linux sono contrassegnati da una firma GnuPG. La chiave che contiene l'impronta digitale è la seguente:


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

È possibile utilizzare il comando rpm --checksig pacchetto-1.2.3.rpm per verificare la firma di un pacchetto RPM e determinare se questa ha veramente origine da SUSE Linux o da un'altra funzionalità sicura. Questo comando è particolarmente consigliato per aggiornare i pacchetti da Internet. La chiave pubblica per le firme dei pacchetti SUSE Linux si trova generalmente nel file /root/.gnupg/ e, inoltre, nella directory /usr/lib/rpm/gnupg/ per consentire agli utenti normali di verificare la firma dei pacchetti RPM.

3.3.2. Gestione dei pacchetti: installazione, aggiornamento e disinstallazione

Il processo di installazione di un archivio RPM è piuttosto semplice: rpm -i pacchetto.rpm. Questo comando consente di installare il pacchetto, purché ne vengano soddisfatte le dipendenze e non si verifichino conflitti con gli altri pacchetti. Quando viene visualizzato un messaggio di errore, rpm richiede che i pacchetti da installare soddisfino i requisiti di dipendenza. Il database RPM garantisce in background che non si verifichino conflitti: un file specifico può appartenere a un solo pacchetto. È possibile scegliere altre opzioni per imporre a rpm di ignorare queste impostazioni predefinite. Tuttavia, solo gli utenti più esperti possono eseguire questa operazione per evitare di compromettere l'integrità del sistema e la possibilità di aggiornarlo.

Per aggiornare un pacchetto, ad esempio rpm -F pacchetto.rpm, è possibile utilizzare le opzioni -U o --upgrade e -F o --freshen. Questo comando rimuove i file della versione precedente e installa subito quelli nuovi. La differenza tra le due versioni consiste nel fatto che -U installa i pacchetti che in precedenza non esistevano sul sistema, mentre -F aggiorna semplicemente i pacchetti già installati. Durante l'aggiornamento, rpm aggiorna i file di configurazione mediante la procedura riportata di seguito.

  • Se l'amministratore del sistema non ha modificato un file di configurazione, rpm installa la nuova versione del file appropriato. Non sono necessari interventi da parte dell'amministratore del sistema.

  • Se l'amministratore del sistema ha modificato un file di configurazione prima dell'aggiornamento, rpm salva il file modificato con l'estensione .rpmorig o .rpmsave (file di back up), quindi installa la versione del nuovo pacchetto, ma solo se il file installato in origine e la versione più recente differiscono. In caso affermativo, confrontare il file di backup (.rpmorig o .rpmsave) con il file appena installato e apporta di nuovo le modifiche nel nuovo file. Quindi, accertarsi di eliminare tutti i file .rpmorig e .rpmsave per evitare problemi con i futuri aggiornamenti.

  • I file .rpmnew vengono visualizzati se il file di configurazione è già esistente e e se nel file .spec è stata specificata l'etichetta noreplace.

Al termine dell'aggiornamento, è necessario confrontare e quindi rimuovere i file .rpmsave e .rpmnew per non ostacolare i futuri aggiornamenti. Se il file non è stato riconosciuto dal database RPM, gli viene assegnata l'estensione .rpmorig.

In caso contrario, viene utilizzata l'estensione .rpmsave. In pratica, viene assegnata l'estensione .rpmorig in caso di aggiornamento di un formato estraneo a RPM. Viceversa, viene assegnata l'estensione .rpmsave in caso di aggiornamento da una versione precedente RPM a una più recente. .rpmnew non segnala se l'amministratore del sistema ha apportato modifiche al file di configurazione. In /var/adm/rpmconfigcheck è disponibile un elenco di questi file. Alcuni file di configurazione, quali /etc/httpd/httpd.conf, non vengono sovrascritti per consentire un flusso di lavoro costante.

L'opzione -U non equivale alla disinstallazione con l'opzione -e e all'installazione con l'opzione -i. Quando possibile, utilizzare -U.

Per rimuovere un pacchetto, immettere rpm -e pacchetto. rpm elimina il pacchetto solo se sono presenti dipendenze non risolte. In teoria è impossibile eliminare Tcl/Tk finché richiesto da un'altra applicazione. Anche in questo caso, il database RPM controlla tutte le operazioni. Se per qualsiasi motivo e in circostanze eccezionali non è possibile eliminare un pacchetto, anche quando non esistono dipendenze aggiuntive, può essere opportuno ricompilare il database RPM con l'opzione --rebuilddb.

3.3.3. RPM e patch

Per garantire la sicurezza operativa di un sistema, è necessario installare ogni tanto i pacchetti di aggiornamento. In precedenza, per eliminare un bug in un pacchetto era necessario sostituire l'intero pacchetto. In questo caso, quando i bug si trovano in piccoli file di pacchetti di grandi dimensioni, è molto probabile che molti dati vadano perduti. Tuttavia, SUSE RPM include una funzione che consente di installare le patch nei pacchetti.

Verrà preso come esempio pine perché consente di illustrare le considerazioni più importanti.

La RPM patch è adatta al sistema in uso?

Per determinarlo, è innanzitutto necessario determinare la versione del pacchetto installata. Per eseguire questa operazione in pine, immettere

rpm -q pine
pine-4.44-188

Quindi verificare se la RPM patch è adatta alla versione pine in uso:

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

Questa patch può essere utilizzata con tre versioni differenti di pine. Poiché anche la versione installata nell'esempio è inclusa nell'elenco, è possibile installare la patch.

Quali file vengono sostituiti dalla patch?

I file modificati dalla patch possono essere facilmente visualizzati nella RPM patch. Il parametro -P di rpm consente di selezionare speciali funzioni della patch. Per visualizzare l'elenco dei file, specificare il seguente comando:

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

oppure, se la patch è già installata, utilizzare il seguente comando:

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

Le RPM patch si utilizzano come normali RPM. Solo che nel caso della RPM patch è necessario che sia già installato un RPM appropriato.

Quali patch sono già installate sul sistema e per quali versioni di pacchetti?

Per visualizzare un elenco di tutti i pacchetti installati sul sistema, utilizzare il comando rpm -qPa. Se su un nuovo sistema è installata una sola patch, come nell'esempio, viene visualizzato l'elenco seguente:

rpm -qPa
pine-4.44-224

Se in futuro si desidera conoscere la versione del pacchetto installata in origine, è possibile cercare queste informazioni nel database RPM. Per visualizzare queste informazioni con pine, specificare il seguente comando:

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

Ulteriori informazioni, incluse quelle sulle funzioni della patch di RPM, sono disponibili nelle pagine di manuale di rpm e rpmbuild.

3.3.4. Pacchetti RPM delta

I pacchetti RPM delta contengono la differenza tra una versione vecchia e nuova di un pacchetto RPM. Applicando un RPM delta su un vecchio RPM si genererà un RPM completamente nuovo. Visto che un RPM delta è applicabile anche su un RPM installato, non è necessario disporre di una copia del vecchio RPM. I pacchetti RPM delta sono più piccoli di una RPM patch. Ciò rappresenta un vantaggio quando si trasferiscono i pacchetti di aggiornamento tramite Internet. Lo svantaggio è che in fase di aggiornamento con gli RPM delta si genera un maggior numero di cicli CPU rispetto a RPM comuni o patch. Per fare in modo che YaST utilizzi dei pacchetti RPM delta durante delle sessioni YOU, impostare YOU_USE_DELTAS su yes in /etc/sysconfig/onlineupdate. In questo caso, tenere a portata di mano il disco di installazione. Se YOU_USE_DELTAS è vuoto o impostato su filesystem, YOU tenta di scaricare i pacchetti delta appropriati ai file installati. In questo caso, non è necessario l'utilizzo del disco di installazione. Tuttavia, è possibile che il download duri più a lungo. Se impostato su no, YOU utilizza solo gli RPM patch e normali.

I binari prepdeltarpm, writedeltarpm e applydeltarpm sono parte della suite RPM delta (deltarpm di pacchetto) e permettono di creare e applicare pacchetti RPM delta. I seguenti comandi consentono di creare un RPM delta denominato new.delta.rpm. Il comando seguente presuppone che i file old.rpm e new.rpm sono presenti:

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio

xdelta delta -0 old.cpio new.cpio delta

writedeltarpm new.rpm delta info new.delta.rpm
rm old.cpio new.cpio delta

Se il vecchio pacchetto è già installato, è possibile utilizzare il comando applydeltarpm per ricostruire il nuovo RPM dal file system:

applydeltarpm new.delta.rpm new.rpm

Per derivare il nuovo RPM da quello vecchio senza accedere al file system, utilizzare l'opzione -r:

applydeltarpm -r old.rpm new.delta.rpm new.rpm
  

Per i dettagli tecnici, vedere /usr/share/doc/packages/deltarpm/README.

3.3.5. Query a RPM

Con l'opzione -q rpm è possibile avviare delle query che consentono di ispezionare l'archivio RPM (aggiungendo l'opzione -p) e inoltre di interrogare il database RPM dei pacchetti installati. Per specificare il tipo di informazioni richieste, sono disponibili numerosi parametri. Vedere la Tabella 3.6, "Opzioni più importanti per le query RPM".

Tabella 3.6. Opzioni più importanti per le query RPM

-i

Informazioni sul pacchetto

-l

Elenco file

-f FILE

Interroga il pacchetto che contiene il file FILE (è necessario specificare il percorso completo di FILE)

-s

Elenco dei file con le informazioni sullo stato (implica -l)

-d

Elenco solo dei file della documentazione (implica -l)

-c

Elenco solo dei file di configurazione (implica -l)

--dump

Elenco file dettagliato (da utilizzare con -l, -c o -d)

--provides

Elenca le funzionalità del pacchetto che un altro pacchetto può richiedere tramite --requires

--requires, -R

Contenuto richiesto dal pacchetto

--scripts

Script di installazione (preinstall, postinstall, uninstall)

Ad esempio il comando rpm -q -i wget visualizza le informazioni illustrate nell'Esempio 3.2, "rpm -q -i wget".

Esempio 3.2. rpm -q -i wget


Nome: wget                         Relocations: (not relocatable) 
Version     : 1.9.1                             Vendor: SUSE LINUX AG, Nuernberg, Germany 
Release     : 50                            Build Date: Sat 02 Oct 2004 03:49:13 AM CEST 
Install date: Mon 11 Oct 2004 10:24:56 AM CEST      Build Host: f53.suse.de 
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.9.1-50.src.rpm 
Size        : 1637514                          License: GPL 
Signature   : DSA/SHA1, Sat 02 Oct 2004 03:59:56 AM 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 produce l'effetto desiderato solo se si specifica il nome del file completo, incluso il percorso. È possibile specificare il numero di file desiderato. Ad esempio, il seguente comando

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

produce come risultato:

rpm-4.1.1-191
wget-1.9.1-50

Se si conosce solo una parte del nome del file, utilizzare una schell script come illustrato nell Esempio 3.3, "Script per la ricerca di pacchetti". Passare il nome parziale del file allo script indicato come parametro mentre viene eseguito.

Esempio 3.3. Script per la ricerca di pacchetti

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

Il comando rpm -q --changelog rpm mostra un elenco dettagliato delle informazioni di modifica su un determinato pacchetto, ordinato in base alla data. Nell'esempio seguente vengono illustrate le informazioni sul pacchetto rpm.

In base al database RPM installato è anche possibile effettuare delle verifiche. Per avviarle, utilizzare -V, -y o --verify. Con questa opzione si induce rpm a mostrare tutti quei file che sono stati modificati rispetto alla versione attualmente installata. rpm antepone al nome di file vero e proprio fino ad otto caratteri, i quali indicano le seguenti modifiche:

Tabella 3.7. Opzioni di verifica RPM

5

Check sum MD5

S

Dimensione file

L

Collegamento simbolico

T

Ora della modifica

D

Numeri di dispositivi principali e secondari

U

Proprietario

G

Gruppo

M

Modalità (autorizzazioni e tipo di file)

Nel caso dei file di configurazione viene visualizzata la lettera c. Se ad esempio è stata apportata una modifica al file /etc/wgetrc (wget):

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

I file del database RPM si trovano in /var/lib/rpm. Se la partizione /usr è pari a 1 GB, questo database può occupare quasi 30 MB, specialmente dopo un aggiornamento completo. Se il database è molto più grande del previsto, può essere utile ricompilarlo con l'opzione --rebuilddb. Prima di eseguire questa operazione, creare una copia di back up del vecchio database. Lo script cron cron.daily crea copie di back up giornaliere del database (compresse nel formato gzip) e le archivia nel file /var/adm/backup/rpmdb. Il numero di copie create è controllato dalla variabile MAX_RPMDB_BACKUPS (il valore predefinito è: 5) in /etc/sysconfig/backup. La dimensione di ogni copia di backup è di circa 1 MB per 1 GB in /usr.

3.3.6. Installazione e compilazione dei pacchetti di origine

Tutti i pacchetti di origine di SUSE Linux presentano l'estensione .src.rpm (RPM di origine).

[Tip]Suggerimento

È possibile copiare i pacchetti di origine dal disco di installazione sul disco rigido e decomprimerli con YaST. Tuttavia, questi pacchetti non vengono contrassegnati come non installati ([i]) nel gestore pacchetti. Questo perché i pacchetti di origine non vengono registrati nel database RPM. Nel database RPM, infatti, viene visualizzato solo il software installato. Pertanto quando si "installa" un pacchetto di origine, nel sistema viene aggiunto solo il codice sorgente.

Le seguenti directory devono essere disponibili per rpm e rpmbuild in /usr/src/packages (a meno che si siano specificate impostazioni personalizzate in un file quale /etc/rpmrc):

SOURCES

per i sorgenti originali (file .tar.bz2 o .tar.gz e così via) e per le modifiche specifiche della distribuzione (generalmente .diff o .patch)

SPECS

per i file .spec, che in maniera simile a un meta Makefile controllano il processo build

BUILD

in questa directory tutti i sorgenti vengono decompressi, adattati (patched) e compilati

RPMS

qui vengono archiviati i pacchetti binari pronti

SRPMS

qui vengono archiviati gli RPM di origine

Quando si installa un pacchetto di origine con YaST, tutti i componenti necessari vengono installati in /usr/src/packages: i sorgenti e gli adattamenti in SOURCES e il file .spec corrispondente in SPECS.

[Warning]Avvertimento

Non fare esperimenti con componenti importanti del sistema (glibc, rpm, sysvinit e così via) per non compromettere il funzionamento del sistema.

Nell'esempio seguente viene utilizzato il pacchetto wget.src.rpm. Dopo aver installato il pacchetto con YaST, si dispone più o meno dell'elenco di file seguenti:

/usr/src/packages/SOURCES/nops_doc.diff
/usr/src/packages/SOURCES/toplev_destdir.diff
/usr/src/packages/SOURCES/wget-1.9.1+ipvmisc.patch
/usr/src/packages/SOURCES/wget-1.9.1-brokentime.patch
/usr/src/packages/SOURCES/wget-1.9.1-passive_ftp.diff
/usr/src/packages/SOURCES/wget-LFS-20040909.tar.bz2
/usr/src/packages/SOURCES/wget-wrong_charset.patch
/usr/src/packages/SPECS/wget.spec

rpmbuild -b X /usr/src/packages/SPECS/wget.spec avvia il processo di compilazione. X una variabile che può indicare vari stadi del processo di compilazione (per ulteriori dettagli, vedere l'output di --help o la documentazione RPM). Di seguito è illustrata una breve descrizione:

-bp

preparare i sorgenti in /usr/src/packages/BUILD: decompressione e adattamento.

-bc

Come -bp, ma con ulteriore compilazione.

-bi

Come -bp, ma con installazione aggiuntiva del software integrato. Attenzione: se il pacchetto non supporta la funzionalità BuildRoot, si rischia di sovrascrivere i file di configurazione.

-bb

Come -bi, ma con la creazione aggiuntiva del pacchetto binario. Se l'operazione viene eseguita correttamente, il file binario è archiviato in /usr/src/packages/RPMS.

-ba

Come -bi, ma con la creazione aggiuntiva dell'RPM di origine. Se l'operazione viene eseguita correttamente, il file binario è archiviato in /usr/src/packages/RPMS.

--short-circuit

Consente di ignorare alcuni passaggi.

L'RPM binario creato può ora venire installato con rpm -i o, meglio con rpm -U. L'installazione con rpm supporta la visualizzazione del pacchetto nel database RPM.

3.3.7. Compilazione di pacchetti RPM con build

Durante l'esecuzione del processo build può accadere con alcuni pacchetti che file indesiderati vengano aggiunti nel sistema in esecuzione. Per evitare che ciò avvenga, utilizzare build che crea un ambiente ben definito in cui assemblare il pacchetto. Per creare questo ambiente chroot, lo script build deve disporre di un albero di pacchetti completo, disponibile sul disco rigido, tramite NFS o ancora mediante DVD. Specificare la posizione dell'albero con build --rpms directory. A differenza di rpm, il comando build cerca il file SPEC nella directory dei sorgenti. Per compilare wget (come nell'esempio riportato sopra) mediante il DVD montato nel sistema in /media/dvd, utilizzare 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. Al termine, i pacchetti creati si trovano in /var/tmp/build-root/usr/src/packages/RPMS.

Lo script build offre molte altre opzioni. Ad esempio consente di utilizzare lo script preferito per i propri RPM, ignorare l'inizializzazione dell'ambiente build oppure limitare il comando rpm a uno dei passaggi sopra descritti. Per ulteriori informazioni, specificare build --help e leggere la pagina di manuale di build.

3.3.8. Strumenti per gli archivi RPM e il database RPM

Midnight Commander (mc) consente di visualizzare il contenuto degli archivi RPM e copiarne delle parti. Rappresenta gli archivi come file system virtuali, offrendo tutte le voci di menu tipiche di Midnight Commander. Per visualizzare il file HEADER, premere F3. Per visualizzare la struttura dell'archivio, utilizzare i tasti freccia e premere Invio. Per copiare i componenti dell'archivio, premere F5.

KDE offre lo strumento kpackage come front-end per rpm. Un gestore pacchetti completo è disponibile come modulo YaST (vedere la Sezione 2.3.1, "Installazione e rimozione del software" (↑Avvio)).