<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mia mamma usa Linux! &#187; rpm</title>
	<atom:link href="http://www.miamammausalinux.org/category/redhat/rpm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:03:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>RPM : Panoramica ed opzioni particolari</title>
		<link>http://www.miamammausalinux.org/2009/01/rpm-panoramica-ed-opzioni-particolari/</link>
		<comments>http://www.miamammausalinux.org/2009/01/rpm-panoramica-ed-opzioni-particolari/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 14:30:57 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Red Hat]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Package management]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=295</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/rpm.png" alt="rpm" title="rpm" width="100" height="64" class="alignnone size-full wp-image-297" /></p>
<p>Le maggiori distribuzioni Linux relativamente alla gestione dei pacchetti si dividono generalmente in tre grosse categorie : </p>
<ul>
<li>Quelle che utilizzano i binari <em>RPM</em> (RedHat, SuSe, Mandriva e derivate);</li>
<li>Quelle che utilizzano i binari <em>Deb</em> (Debian, Ubuntu e derivate);</li>
<li>Quelle che in maniera diversa ricompilano i sorgenti (Slackware, Gentoo e derivate);</li>
</ul>
<p>Questo articolo si propone di analizzare la struttura del sistema di pacchettizzazione RPM, presentando in particolare esempi di operazioni utilissimi, ma a volte sconosciuti.</p>
<p><strong>Metodi di interrogazione e verifica : opzioni -q e -V</strong></p>
<p>Un sistema è composto da numerosi pacchetti RPM che insieme compongono quella che viene definita &#8220;distribuzione&#8221;.<br />
Per avere una lista di tutti i pacchetti installati è sufficiente lanciare il seguente comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ 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</pre></div></div>

<p>conseguentemente sarà possibile conoscere il numero totale di pacchetti installati :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm -qa | wc -l
513</pre></div></div>

<p>o ad esempio un elenco di pacchetti che rispondano a determinati criteri di ricerca :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm -qa &quot;*gnutls*&quot;
gnu-efi-3.0c-1.1
gnupg-1.4.5-13
gnutls-1.4.1-2</pre></div></div>

<p>Relativamente all&#8217;elenco dei pacchetti installati sono possibili numerose interrogazioni.</p>
<p>E&#8217; possibile stampare i dettagli su un pacchetto installato attraverso l&#8217;opzione <em>-i</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ 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. &lt;http://bugzilla.redhat.com/bugzilla&gt;
Summary     : File di configurazione del sistema.
Description :
Il pacchetto setup contiene vari file di
configurazione molto importanti come: passwd, group e profile.</pre></div></div>

<p>Capire a quale pacchetto appartiene un determinato file con l&#8217;opzione <em>-f</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm -qf /etc/passwd
setup-2.5.58-1.el5</pre></div></div>

<p>Stampare l&#8217;elenco dei files contenuti in un pacchetto con l&#8217;opzione <em>-l</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm -ql setup
/etc/aliases
/etc/bashrc
...
...
/usr/share/doc/setup-2.5.58
/usr/share/doc/setup-2.5.58/uidgid</pre></div></div>

<p>Le interrogazioni illustrate possono essere effettuate anche su pacchetti non ancora installati attraverso l&#8217;aggiunta dell&#8217;opzione &#8220;<em>-p</em>&#8220;, ad esempio per stampare l&#8217;elenco dei file in un pacchetto non installato è sufficiente digitare il seguente comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ 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</pre></div></div>

<p>E&#8217; da notare come in questo caso sia stato passato l&#8217;intero nome del file comprensivo di versione, piattaforma ed estensione e non il solo nome del pacchetto, come avviene per gli RPM già installati.</p>
<p><strong>Metodi di installazione ed aggiornamento : opzioni -i, -U, -F</strong></p>
<p>Per installare un pacchetto RPM è sufficiente utilizzare il seguente comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm -ivh openldap-clients-2.3.27-8.el5_1.3.i386.rpm 
Preparing...                ########################################### [100%]
   1:openldap-clients       ########################################### [100%]</pre></div></div>

<p>oltre all&#8217;opzione <em>-i</em> che sta per <em>install</em> sono aggiunte anche <em>v</em> per <em>verbose</em>, che aggiunge verbosità all&#8217;output e <em>h</em> per <em>hash</em> che mostra la barra di progresso.<br />
E&#8217; possibile inoltre aggiornare un pacchetto ad una versione successiva. Se si utilizza l&#8217;opzione <em>U</em> verrà effettuato un aggiornamento del pacchetto e la sua eventuale installazione se questo non risulta già installato nel sistema l&#8217;opzione. Se invece si utilizza l&#8217;opzione <em>F</em> 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 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm -Fvh *.rpm 
Preparing...                ########################################### [100%]
...
...</pre></div></div>

<p>Aggiornerà solo i pacchetti già installati nel sistema.</p>
<p><strong>La risoluzione delle dipendenze</strong></p>
<p>In fase di installazione è possibile utilizzare un&#8217;opzione (molte volte abusata) che permette di soprassedere il controllo delle dipendenze ed installare il pacchetto senza controlli, tale opzione è <em>&#8211;nodeps</em>. Inutile dire che l&#8217;utilizzo di questa, sebbene appaia nell&#8217;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.<br />
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.<br />
L&#8217;installazione del pacchetto <em>rpmdb</em> consente di avere localmente l&#8217;intero database relativo alle dipendenze dei pacchetti della distribuzione.<br />
Tale pacchetto consente di estendere le informazioni relative alle dipendenze :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ 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</pre></div></div>

<p>nel caso illustrato si ha quindi una dipendenza non soddisfatta relativa al pacchetto <em>lynx</em> che richiede <em>perl-CGI</em>. 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&#8217;opzione <em>&#8211;aid</em> che si occuperà di automatizzare l&#8217;installazione dei pacchetti suggeriti :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm -ivh --aid lynx-2.8.5-11.2.i386.rpm 
Preparing...                ########################################### [100%]
   1:perl-CGI               ########################################### [ 50%]
   2:lynx                   ########################################### [100%]</pre></div></div>

<p><em>rpmdb</em> consente di avvalersi anche di altre due interessanti opzioni che sono <em>&#8211;redhatprovides</em> e <em>&#8211;redhatrequires</em>. Il nome autoesplicativo di queste opzioni chiarisce quale può essere il loro impiego :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm --redhatprovides /etc/passwd
setup-2.5.27-1</pre></div></div>

<p>In questo caso l&#8217;impiego è del tutto simile all&#8217;opzione di interrogazione <em>-qf</em> spiegata poco sopra, ma un&#8217;ulteriore indubbio vantaggio di questa opzione è che si applica anche a pacchetti non installati.<br />
Nel seguente esempio :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ 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</pre></div></div>

<p>l&#8217;opzione <em>&#8211;redhatrequires</em> consente di capire quali pacchetti (installati e non) necessitano della libreria <em>libcap.so.1</em>.</p>
<p><strong>Metodi di rimozione dei pacchetti : opzione -e</strong></p>
<p>Rimuovere un pacchetto installato è possibile attraverso l&#8217;utilizzo dell&#8217;opzione <em>-e</em>, chiaramente il pacchetto non deve essere una dipendenza di altri installati, altrimenti l&#8217;operazione fallisce :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm --aid -e perl-CGI
error: Failed dependencies:
	perl(CGI) is needed by (installed) lynx-2.8.5-11.2</pre></div></div>

<p>E&#8217; da notare che anche in questo caso è possibile utilizzare l&#8217;opzione <em>&#8211;nodeps</em>, pena la perdita di coerenza del database.<br />
Opzioni utili durante la rimozione possono rivelarsi le seguenti :</p>
<p>&#8211;allmatches : indica di rimuove TUTTE le occorrenze del pacchetto ed è utilizzata in caso di situazioni anomale in cui un pacchetto appare nell&#8217;elenco come installato più volte (con versioni differenti o con la stessa);</p>
<p>&#8211;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 <em>/var/spool/repackage/</em>;</p>
<p>E&#8217; possibile anche fare in modo che i processi denominati <em>trigger</em> o gli <em>script</em> associati al pacchetto non vengano eseguiti in fase di rimozione attraverso le opzioni <em>&#8211;no&#8230;..</em>. I <em>trigger</em> e gli <em>script</em> possono eseguire le operazioni più disparate, dalla modifica di file di configurazione sino allo spostamento, alla rimozione di altri file e così via. E&#8217; chiaro che prima di disabilitare queste operazioni è bene conoscere a fondo cosa fanno e di conseguenza il pacchetto a cui sono associate.<br />
Tutte queste opzioni sono spiegate in maniera approfondita nella man page di rpm.</p>
<p><strong>Metodi di verifica dei pacchetti : opzione -V</strong></p>
<p>E&#8217; possibile controllare la consistenza di un pacchetto verificando quanto presente nel database con quanto realmente esiste nel sistema.<br />
Supponendo per il pacchetto <em>lynx</em> di aver rimosso tutti i file relativi al programma nella cartella <em>/etc</em>, la verifica del pacchetto produrrà il seguente output :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ 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</pre></div></div>

<p><strong>Estrazione di file da un pacchetto : utilizzo di rpm2cpio</strong></p>
<p>Potrebbe nascere l&#8217;esigenza di estrarre un pacchetto in un path diverso da quello del sistema in modo da analizzare il contenuto prima di un&#8217;effettiva installazione. Il programma necessario per effettuare questa operazione è <em>rpm2cpio</em> distribuito nel pacchetto rpm, quindi presente in tutti i sistemi.<br />
Attraverso rpm2cpio è possibile estrarre il pacchetto nella directory in cui ci si trova :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm2cpio  /var/spool/up2date/lynx-2.8.5-11.2.i386.rpm | cpio -id
7831 blocks</pre></div></div>

<p>nella directory attuale verrà riprodotto il path relativo ai file contenuti nel pacchetto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls
etc  usr</pre></div></div>

<p>Se invece l&#8217;esigenza è quella di estrarre un solo file, la sintassi del comando è la seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rpm2cpio  /var/spool/up2date/lynx-2.8.5-11.2.i386.rpm | cpio -id --no-absolute-filenames --no-preserve-owner &quot;*lynx.cfg*&quot;
7831 blocks</pre></div></div>

<p>In questo caso tutti i file corrispondono al criterio di selezione <em>*lynx.cfg*</em> verranno estratti dal pacchetto rpm e depositati nella cartella con il relativo <em>path</em>.</p>
<p><strong>Posizionamento del database su disco</strong></p>
<p>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 <em>db4</em> depositati nella cartella <em>/var/lib/rpm</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls /var/lib/rpm/__db.00*
/var/lib/rpm/__db.001  /var/lib/rpm/__db.002  /var/lib/rpm/__db.003</pre></div></div>

<p>è possibile che tale database in seguito ad anomalie o malfunzionamenti si corrompa non permettendo il regolare funzionamento del sistema di pacchettizzazione.<br />
In questo caso è necessario cancellare i file esistenti e ricostruire il database con l&#8217;opzione <em>&#8211;rebuilddb</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rm /var/lib/rpm/__db.00*
$ rpm --rebuilddb</pre></div></div>

<p>Partendo dai pacchetti installati e dalle informazioni in essi contenute il comando ricostruirà il database.<br />
E&#8217; possibile anche costruire un nuovo database vuoto con l&#8217;opzione <em>&#8211;initdb</em>, ma tale opzione è utilizzata di raro.</p>
<p><strong>Conclusioni</strong></p>
<p>Questa breve panoramica non ha lo scopo di analizzare tutto lo spettro di possibilità in merito all&#8217;argomento, ma si pone l&#8217;obiettivo di offrire spunti per approfondire le proprie conoscenze.<br />
Molte altre sono le opzioni disponibili per la gestione dei pacchetti e  possono essere analizzate a fondo nella <em>man page</em> del comando <em>rpm</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/01/rpm-panoramica-ed-opzioni-particolari/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
