[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]

7. Confezionamento e conversione dei pacchetti di applicazioni per GNU/Linux

Ogni distribuzione GNU/Linux utilizza un metodo per il confezionamento dei pacchetti (blocchi) che compongono l'intero sistema. Il problema principale è quello di tenere traccia della collocazione dei file di ogni applicazione, delle sue dipendenze da altri pacchetti e di permetterne l'aggiornamento o l'eliminazione senza danneggiare il sistema e senza lasciare file ignoti inutilizzati.

7.1 Archivi RPM

Con la sigla RPM si identificano gli archivi realizzati secondo uno standard definito da RedHat (RedHat Package Manager) che hanno l'estensione .rpm. Oltre alla distribuzione RedHat, anche Caldera e SuSE utilizzano questo formato.

Per poter gestire tale formato occorre il programma rpm. Eventualmente, questo può essere ottenuto dalla sua origine, ftp://ftp.redhat.com/pub/redhat/code/rpm/, oppure da un altro sito dopo una ricerca per mezzo di FTPSearch, http://ftpsearch.lycos.com, per un archivio che assomigli a rpm-*.tar.gz. *1*

Se la propria distribuzione GNU/Linux non è fatta per gestire i pacchetti in formato RPM, l'unica motivazione ragionevole per procurarsi il programma di gestione di questi pacchetti è quella di poterli convertire nel formato a cui si è abituati.

7.1.1 Breve panoramica

Per comprendere l'utilizzo del programma rpm, quando la propria distribuzione è organizzata secondo questo standard, vengono proposti alcuni esempi, senza entrare nel dettaglio della sua sintassi. Per maggiori informazioni conviene consultare la pagina di manuale rpm(8), oppure, per ottenere uno schema sintattico stringato basta avviare il programma stesso senza argomenti.

Informazioni

query -- richiesta di informazioni

rpm -qpi <pacchetto-rpm>

Mostra una descrizione del contenuto del file RPM.

rpm -qpl <pacchetto-rpm>

Mostra l'elenco dei file contenuti nel file RPM e dove andranno collocati se sarà installato.

rpm -qa

Mostra l'elenco dei pacchetti RPM installati, così come sono stati registrati nel sistema RPM.

rpm -qf <file>

Determina il nome del pacchetto da cui proviene il file indicato come argomento.

Installazione

rpm -i <pacchetto-rpm>

Installa il pacchetto se non si verificano errori.

rpm -i <uri-ftp>

Installa il pacchetto a partire dal'URI indicato se non si verificano errori. Per esempio potrebbe trattarsi di rpm -i ftp://dinkel.brot.dg/pub/RPMS/mio-1.1-0.i386.rpm

rpm -ivh <pacchetto-rpm>

Installa il pacchetto se non si verificano errori, mostrando qualche informazione e una barra di progressione.

rpm -i --nodeps <pacchetto-rpm>

Installa il pacchetto senza verificare le dipendenze tra i file.

rpm -i --replacefiles <pacchetto-rpm>

Installa il pacchetto senza verificare se vengono sovrascritti dei file.

rpm -i --ignorearch <pacchetto-rpm>

Installa il pacchetto senza verificare l'architettura dell'elaboratore.

rpm -i --ignoreos <pacchetto-rpm>

Installa il pacchetto senza verificare il tipo di sistema operativo.

Aggiornamento

rpm -U <pacchetto-rpm>

Aggiorna o installa il pacchetto se non si verificano errori.

rpm -Uvh <pacchetto-rpm>

Aggiorna o installa il pacchetto se non si verificano errori, mostrando qualche informazione e una barra di progressione.

rpm -F <pacchetto-rpm>

Aggiorna il pacchetto solo se risulta già installata una versione precedente.

rpm -F <modello-pacchetti-rpm>

Aggiorna i pacchetti che risultano già installati nelle loro versioni precedenti.

Eliminazione

rpm -e <nome-del-pacchetto-installato>

Elimina (disinstalla) il pacchetto.

Verifica

rpm -V <nome-del-pacchetto-installato>

Verifica che il pacchetto indicato sia installato correttamente.

rpm -Vf <file>

Verifica il pacchetto contenente il file indicato.

rpm -Va

Verifica tutti i pacchetti.

rpm -Vp <pacchetto-rpm>

Verifica la corrispondenza tra il file RPM indicato come argomento e quanto installato effettivamente.

Sigla Descrizione
5 Controllo MD5 fallito.
S Variazione della dimensione del file.
L Collegamento simbolico alterato.
T Data di variazione del file alterata.
D Alterazione del file di dispositivo.
U Utente proprietario diverso.
G Gruppo proprietario diverso.
M Modalità, comprendendo sia i permessi che il tipo di file.

Tabella 7.1: Elenco delle segnalazioni di errore generabili da un controllo di un'installazione di pacchetti RPM (opzione -V).

Sistemazione dei permessi

setperms, setugids -- sistemazione dei permessi e delle proprietà

rpm --setperms -a

Verifica ed eventualmente corregge i permessi dei file di tutti i pacchetti installati.

rpm --setugids -a

Verifica ed eventualmente corregge la proprietà dei file di tutti i pacchetti installati.

7.1.2 Problemi dovuti alle dipendenze

Alle volte, quando si installano o si vogliono eliminare dei pacchetti si incontrano dei problemi, perché il programma rpm impedisce di fare ciò che potrebbe essere dannoso e sembra originato a causa di un errore. A questo proposito vale la pena di conoscere alcune opzioni speciali.

--oldpackage

Permette di aggiornare un pacchetto utilizzando una versione precedente a quella che appare essere già installata.

--replacefiles

Permette di installare o aggiornare un pacchetto quando questo fatto implica la sostituzione di file già esistenti che appartengono ad altri pacchetti.

--replacefiles

Permette di installare o aggiornare un pacchetto quando questo fatto implica la sostituzione di file già esistenti che appartengono ad altri pacchetti.

--replacepkgs

Permette di installare un pacchetto anche quando questo risulta già installato.

--force

È l'equivalente delle opzioni --oldpackage, --replacefiles e --replacepkgs, messe assieme.

--nodeps

Installa, aggiorna o disinstalla senza curarsi delle dipendenze da file o da altri pacchetti.

7.1.3 Creazione di pacchetti binari personali

La creazione di pacchetti RPM può essere una procedura complessa e delicata, quando si fanno le cose seriamente, cioè quando si vuole costruire un pacchetto da distribuire attraverso i canali ufficiali. Per distribuire un applicativo in forma binaria, occorre affiancargli un pacchetto SRPM (sorgente), contenente i sorgenti originali (intatti), assieme a tutta la procedura necessaria per applicare le modifiche, compilare il risultato e installarlo correttamente. In questa sezione si vuole mostrare il procedimento minimo necessario a creare un pacchetto RPM «binario» per scopi personali, senza che questo sia affiancato effettivamente da un pacchetto sorgente.

Per creare un pacchetto RPM a partire da file già installati da qualche parte nel proprio filesystem, si utilizza il programma rpm con la sintassi seguente:

rpm -bb <file-spec>

Il file indicato come argomento contiene le informazioni necessarie a recuperare le directory e i singoli file che si vogliono raccogliere nel pacchetto, assieme a una descrizione adeguata. Il file indicato come argomento si compone con una sintassi piuttosto semplice, che conviene vedere direttamente in un esempio.

Si suppone di avere predisposto un applicativo in forma binaria collocato a partire dalla directory /opt/prova/, che utilizza anche il file di configurazione /etc/prova.conf. Le specifiche del pacchetto che si vuole creare potrebbero essere messe nel file /tmp/prova.spec, mostrato sotto.

Name: Prova
Summary: Binari di prova.
Version: 1.0
Release: 1
Copyright: do not redistribute!
Group: Applications
Packager: Tizio Tizi <tizio@dinkel.brot.dg>

%description
Pacchetto applicativo di prova per le
mie prove...:-)

%files
/etc/prova.conf
/opt/prova

Come si vede dall'esempio, alcune direttive sono fatte per utilizzare una sola riga, altre, quelle che iniziano con il simbolo di percentuale, si articolano nelle righe sottostanti. Vale la pena di osservare che il campo Copyright: viene usato in modo differente dalle distribuzioni: la RedHat pone una definizione che serve a capire rapidamente il genere di condizioni che pone la licenza d'uso, mentre altre mettono il titolare dei diritti del software. In questo caso, si immagina che si tratti di un lavoro che per qualche ragione non può essere distribuito.

Si osservi l'elenco che segue la direttiva %files: rappresenta i file singoli e le directory intere che devono essere raccolte nel pacchetto da generare.

Prima di creare il pacchetto, è necessario che la gerarchia /usr/src/redhat/ sia pronta; per quanto riguarda l'architettura i386, è necessario che esista anche la directory relativa ai pacchetti che vengono generati per questa, cioè: /usr/src/redhat/RPMS/i386/. Se manca, occorre crearla manualmente.

rpm -pp /tmp/prova.spec

Quello che si vede è il comando necessario ad avviare la creazione del pacchetto Prova-1.0-1.i386.rpm, che verrà collocato automaticamente nella directory /usr/src/redhat/RPMS/i386/. Per verificare che il proprio lavoro sia stato concluso con successo, si può indagare sul contenuto del pacchetto appena creato nel modo seguente:

rpm -qpli /usr/src/redhat/RPMS/i386/Prova-1.0-1.i386.rpm

Name        : Prova                Distribution: (none)
Version     : 1.0                        Vendor: (none)
Release     : 1                      Build Date: mar 12 gen 1999 08:50:42 CET
Install date: (not installed)        Build Host: dinkel.brot.dg
Group       : Applications           Source RPM: Prova-1.0-1.src.rpm
Size        : 32074
Packager    : Tizio Tizi <tizio@dinkel.brot.dg>
Summary     : Binari di prova.
Description :
Pacchetto applicativo di prova per le
mie prove...:-)
/etc/prova.conf
/opt/prova
/opt/prova/...
/opt/prova/...
/opt/prova/...

Prima di concludere, è bene tenere presente che se ciò che si impacchetta non dipende dalla piattaforma, come nel caso della documentazione, conviene modificare l'estensione del file ottenuto da .i386.rpm a .noarch.rpm.

7.2 Archivi Debian

Gli archivi della distribuzione GNU/Linux Debian hanno un formato particolare e l'estensione .deb. Anche se attualmente solo la distribuzione Debian utilizza questo formato, la maggior parte del software per GNU/Linux è disponibile sotto forma di archivi Debian; spesso anche molto di più di quello che si può ottenere dalle altre distribuzioni.

Per poter gestire tale formato occorre il programma dpkg. Col l'aiuto di FTPSearch, http://ftpsearch.lycos.com, si può cercare un archivio che assomigli a dpkg*.tar.gz.

Valgono le stesse considerazioni fatte a proposito dei pacchetti RPM: se la propria distribuzione GNU/Linux non è fatta per gestire i pacchetti in formato Debian, l'unica motivazione ragionevole per procurarsi il programma di gestione di questi pacchetti è quella di poterli convertire nel formato a cui si è abituati.

7.2.1 Breve panoramica

Per comprendere l'utilizzo del programma dpkg, quando la propria distribuzione è organizzata secondo questo standard, vengono proposti alcuni esempi, senza entrare nel dettaglio della sua sintassi. Per maggiori informazioni conviene consultare la pagina di manuale dpkg(8), oppure, per ottenere uno schema sintattico stringato basta avviare il programma stesso senza argomenti.

dpkg -i <pacchetto-deb>

Installa il pacchetto indicato.

dpkg -r <nome-del-pacchetto-installato>

Elimina il pacchetto installato precedentemente, lasciando però i file di configurazione.

dpkg --purge <nome-del-pacchetto-installato>

Elimina completamente il pacchetto installato precedentemente, inclusi i file di configurazione. La filosofia di Debian è di lasciare i file di configurazione anche quando il pacchetto viene disinstallato. Per questo si utilizza questa opzione speciale per forzare la loro cancellazione.

dpkg -l

Elenca i nomi dei pacchetti installati.

dpkg -S <modello>

Cerca di determinare a quale pacchetto installato appartengono i file indicati attraverso il modello.

dpkg -C

Controlla i pacchetti installati per determinare quali sono stati installati in modo non corretto o incompleto.

7.3 Archivi Slackware

Gli archivi della distribuzione GNU/Linux Slackware hanno un formato molto semplice: tar+gzip e utilizzano l'estensione .tgz.

7.3.1 Struttura degli archivi

Gli archivi Slackware sono il risultato di un'archiviazione attraverso tar e di una successiva compressione attraverso gzip. L'archivio è fatto in modo da conservare la struttura di directory a partire dalla radice e senza contenere i collegamenti simbolici.

Nell'archivio viene aggiunta la directory /install/ contenente lo script doinst che si occupa normalmente di ricreare i collegamenti simbolici e di eseguire altri aggiustamenti eventuali.

7.3.2 Installazione manuale

Volendo installare un pacchetto Slackware senza l'ausilio degli strumenti offerti da quella distribuzione, si devono estrarre i file dall'archivio e quindi si deve avviare lo script /install/doinst. Le operazioni vanno svolte con i privilegi dell'utente root. Si suppone di installare il pacchetto esempio.tgz.

cd /

tar xzpvf esempio.tgz

/install/doinst

7.4 Conversione ed estrazione

Quando si utilizza una distribuzione GNU/Linux, è quantomeno fastidioso dover mescolare applicazioni installate a partire da pacchetti in formato diverso da quello che si usa normalmente. Ciò proprio perché non è più possibile tenere traccia, in un modo univoco, della posizione dei file appartenenti a ogni pacchetto.

Fortunatamente vengono in aiuto i programmi di conversione che permettono di trasformare un pacchetto da un formato a un altro, anche se non sempre funzionano perfettamente. A questi si affiancano poi degli applicativi che permettono di ispezionare il contenuto di file impacchettati in vari formati, e di estrarne quello che si desidera.

Questi programmi utilizzano gli applicativi delle varie distribuzioni che si occupano di espandere i pacchetti e di generare gli stessi. In pratica, di solito, per convertire da Debian a RedHat e viceversa, o per ispezionare i loro contenuti, occorrono sia dpkg che rpm.

L'utilizzo di pacchetti di altre distribuzioni (a seguito di conversione o meno) richiede un'ottima pratica nella gestione di questi. Due pacchetti che dal nome sembrano uguali possono essere diversi nel contenuto, a seguito delle diverse strategie adottate dalle distribuzioni. Questo vale naturalmente anche per pacchetti che utilizzano la stessa tecnica di confezionamento, ma appartengono a distribuzioni differenti.

7.4.1 # alien

alien --to-deb [<opzioni>] <file-da-convertire>...

alien --to-rpm [<opzioni>] <file-da-convertire>...

alien --to-tgz [<opzioni>] <file-da-convertire>...

alien --to-slp [<opzioni>] <file-da-convertire>...

alien consente di convertire un pacchetto di una distribuzione in un altro formato. Precisamente, è in grado di generare pacchetti in formato Debian, RedHat, Stampede e Slackware, a partire da questi formati e anche da un semplice archivio tar+gzip. Non è in grado di gestire i pacchetti sorgenti.

La conversione da un formato a un altro è limitata e può essere fonte di gravi problemi a causa della diversa organizzazione delle varie distribuzioni GNU/Linux. Va quindi usata in modo consapevole e prudente.

alien ha la necessità di conoscere soltanto in quale formato finale occorre produrre la conversione. Il tipo di pacchetto sorgente viene individuato automaticamente, probabilmente in base all'estensione usata nel nome del file. Se con le opzioni non si specifica in quale formato convertire, si ottiene un pacchetto Debian.

In linea di massima, la conversione genera il risultato nella directory corrente, a parte il caso della trasformazione in formato RPM, per cui si ottiene il file a partire dalla directory /usr/src/redhat/ (di solito, per i pacchetti di architettura i386, si tratta precisamente di /usr/src/redhat/RPMS/i386/). *2*

La conversione di un pacchetto Slackware o semplicemente tar+gzip in uno più sofisticato come RPM o Debian, non è conveniente in generale, perché in questo modo mancano molte informazioni che sono importanti per questi formati.

Alcuni pacchetti contengono degli script che devono essere eseguiti alla fine dell'installazione per sistemare ciò che è necessario (come l'aggiunta di un utente di sistema, o cose simili). La conversione in un altro formato tende a perdere questi script.

Alcune opzioni

-d | --to-deb

Specifica che si vuole ottenere la conversione in formato Debian.

-r | --to-rpm

Specifica che si vuole ottenere la conversione in formato RPM.

-t | --to-tgz

Specifica che si vuole ottenere la conversione in formato Slackware.

--to-slp

Specifica che si vuole ottenere la conversione in formato Stampede.

--description=<descrizione>

Specifica una descrizione per il pacchetto, da utilizzare esclusivamente per una conversione in cui l'origine sia un pacchetto Slackware o tar+gzip. Infatti, in questi casi, mancherebbe qualunque descrizione del contenuto del pacchetto.

-c | --scripts

Tenta di convertire gli script. Si deve usare questa opzione con molta prudenza, perché questi script dipendono dalla struttura della distribuzione per cui sono stati fatti, e l'utilizzo in un'altra distribuzione potrebbe essere incompatibile.

Esempi

alien --to-rpm dpkg_1.4.0.23.2-1.i386.deb

Converte il file dpkg_1.4.0.23.2-1.i386.deb in formato RPM, generando il file /usr/src/redhat/RPMS/i386/dpkg-1.4.0.23.2-2.i386.rpm.

7.4.2 Midnight Commander

Midnight Commander è un applicativo integrato per la navigazione all'interno delle directory di filesystem reali o virtuali. In questo senso, permette anche di accedere a file compressi, inclusi i pacchetti delle applicazioni GNU/Linux, purché sia presente il rispettivo sistema di gestione.

Midnight Commander è descritto nel capitolo 54.

7.5 Riferimenti

RedHat Package Manager

http://www.rpm.org/

Donnie Barnes, RPM HOWTO

---------------------------

Appunti Linux 1999.07.12 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ evo.it

1.) È importante che il pacchetto che si preleva sia fatto per l'architettura corrispondente al proprio sistema. Se si utilizza un PC, il nome del file dovrebbe contenere la sigla i386, probabilmente secondo il modello rpm-*.i386.tar.gz.

2.) A questo proposito, è bene tenere presente che la directory /usr/src/redhat/RPMS/i386/ deve esistere perché possa funzionare la conversione in RPM per l'architettura i386. Se il pacchetto non fa riferimento a un'architettura particolare, allora si deve avere pronta anche la directory /usr/src/redhat/RPMS/noarch/. In generale, per questo genere di problemi basta osservare i messaggi di errore di alien.

[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]