Ogni distribuzione 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 la eliminazione senza danneggiare il sistema e senza lasciare file ignoti inutilizzati.
Questo capitolo è rivolto a chi vuole gestire pacchetti di distribuzioni diverse da quella che ha utilizzato per installare Linux.
Con questa sigla, RPM, si identificano gli archivi realizzati secondo uno standard definito da RedHat. La maggior parte del software per Linux può essere trovata ``confezionata'' anche con questo formato.
La prima cosa da fare è reperire un pacchetto per la
gestione degli archivi RPM.
Con l'aiuto di ftpsearch si può cercare
un archivio che assomigli a rpm-
*.gz
http://ftpsearch.ntnu.no/ftpsearch
Naturalmente, dal momento che si cerca un pacchetto contenente degli eseguibili, si dovrà fare attenzione di prenderlo dal posto giusto. Quando si vuole fare riferimento ad architetture PC si utilizza normalmente la sigla i386.
<!> Il sistema RPM si basa sull'uso di cpio. È molto probabile che si debba cercare una versione aggiornata di questo programma.
Supponendo di aver trovato il pacchetto
rpm-
2.2.3.gz, si procede con il suo
scompattamento.
#
gzip -
d rpm-
2.2.3.gz
Si otterrà il semplice eseguibile che può essere rinominato in rpm.
Il semplice eseguibile non basta per funzionare correttamente. Il sistema di archiviazione RPM si basa su un piccolo database per tenere traccia delle installazioni eseguite e su alcuni file di configurazione. Per prima cosa occorre ricreare il database.
#
mkdir /var/lib/rpm
#
rpm -
-
initdb
<!> Dal momento che i file di configurazione sono mancanti, rpm continua a dare delle segnalazioni di errore apparentemente ``assurde'', sostenendo di non riconoscere il sistema operativo e nemmeno l'architettura. Per il momento, non è il caso di preoccuparsi.
Prima di proseguire, conviene cercare una versione completa di rpm, impacchettata proprio con questo formato. All'interno dell'FTP di RedHat si può cercare la versione più recente di rpm. Conviene cercare all'interno di uno dei seguenti URL.
ftp://ftp.redhat.com/pub/redhat/updates/i386/
ftp://ftp.redhat.com/pub/redhat/current/i386/RPMS/
Supponendo di aver trovato il pacchetto
rpm-
2.3.10-
1.i386.rpm, si procede come
segue per la sua installazione.
#
rpm -
-
install -
-
ignorearch -
-
nodeps -
-
ignoreos -
-
force rpm-
2.3.10-
1.i386.rpm
Avviando rpm con l'opzione
-
-
help si ottiene l'elenco delle
opzioni utilizzabili.
RPM version 2.3.10
Copyright (C) 1997 - Red Hat Software
This may be freely redistributed under the terms of the GNU Public License
usage:
--help - print this message
--version - print the version of rpm being used
all modes support the following arguments:
--rcfile <file> - use <file> instead of /etc/rpmrc and $HOME/.rpmrc
-v - be a little more verbose
-vv - be incredibly verbose (for debugging)
-q - query mode
--root <dir> - use <dir> as the top level directory
--dbpath <dir> - use <dir> as the directory for the database
--queryformat <s> - use s as the header format (implies -i)
install, upgrade and query (with -p) allow ftp URL's to be used in place
of file names as well as the following options:
--ftpproxy <host> - hostname or IP of ftp proxy
--ftpport <port> - port number of ftp server (or proxy)
Package specification options:
-a - query all packages
-f <file>+ - query package owning <file>
-p <packagefile>+ - query (uninstalled) package <packagefile>
--whatprovides <i> - query packages which provide <i> capability
--whatrequires <i> - query packages which require <i> capability
Information selection options:
-i - display package information
-l - display package file list
-s - show file states (implies -l)
-d - list only documentation files (implies -l)
-c - list only configuration files (implies -l)
--dump - show all verifiable information for each file
(must be used with -l, -c, or -d)
--provides - list capabilities package provides
--requires
-R - list package dependencies
--scripts - print the various [un]install scripts
-V
-y
--pipe <cmd> - send stdout to <cmd>
--verify - verify a package installation using the same
package specification options as -q
--dbpath <dir> - use <dir> as the directory for the database
--root <dir> - use <dir> as the top level directory
--nodeps - do not verify package dependencies
--nomd5 - do not verify file md5 checksums
--nofiles - do not verify file attributes
--setperms - set the file permissions to those in the package
database using the same package specification
options as -q
--setugids - set the file owner and group to those in the
package database using the same package
specification options as -q
--install <packagefile>
-i <packagefile> - install package
--prefix <dir> - relocate the package to <dir>, if relocatable
--dbpath <dir> - use <dir> as the directory for the database
--excludedocs - do not install documentation
--force - short hand for --replacepkgs --replacefiles
-h
--hash - print hash marks as package installs (good with
-v)
--ignorearch - don't verify package architecture
--ignoreos - don't verify package operating system
--includedocs - install documentation
--nodeps - do not verify package dependencies
--noscripts - don't execute any installation scripts
--percent - print percentages as package installs
--replacefiles - install even if the package replaces installed
files
--replacepkgs - reinstall if the package is already present
--root <dir> - use <dir> as the top level directory
--test - don't install, but tell if it would work or not
--upgrade <packagefile>
-U <packagefile> - upgrade package (same options as --install, plus)
--oldpackage - upgrade to an old version of the package (--force
on upgrades does this automatically)
--erase <package>
-e <package> - erase (uninstall) package
--allmatches - remove all packages which match <package>
(normally an error is generated if <package>
specified multiple packages)
--dbpath <dir> - use <dir> as the directory for the database
--nodeps - do not verify package dependencies
--noscripts - do not execute any package specific scripts
--root <dir> - use <dir> as the top level directory
-b<stage> <spec>
-t<stage> <tarball> - build package, where <stage> is one of:
p - prep (unpack sources and apply patches)
l - list check (do some cursory checks on %files)
c - compile (prep and compile)
i - install (prep, compile, install)
b - binary package (prep, compile, install, package)
a - bin/src package (prep, compile, install, package)
--short-circuit - skip straight to specified stage (only for c,i)
--clean - remove build tree when done
--sign - generate PGP signature
--buildroot <s> - use s as the build root
--test - do not execute any stages
--timecheck <s> - set the time check to S seconds (0 disables it)
--rebuild <src_pkg> - install source package, build binary package and
remove spec file, sources, patches, and icons.
--recompile <src_pkg> - like --rebuild, but don't build any package
--resign <pkg>+ - sign a package (discard current signature)
--addsign <pkg>+ - add a signature to a package
-K
--checksig <pkg>+ - verify package signature
--nopgp - skip any PGP signatures
--nomd5 - skip any MD5 signatures
--querytags - list the tags that can be used in a query format
--initdb - make sure a valid database exists
--rebuilddb - rebuild database from existing database
--dbpath <dir> - use <dir> as the directory for the database
--root <dir> - use <dir> as the top level directory
Il sistema di gestione dei pacchetti RPM permette di tenere traccia di molte informazioni inerenti ai pacchetti installati. Quando si eseguono dei controlli sui pacchetti installati, si possono ottenere delle segnalazioni di errore identificate da una singola lettera o da un numero. La tabella (seguente) mostra l'elenco di questi.
Le potenzialità del programma rpm sono molte e possono disorientare. In questa sezione sono descritti alcuni utilizzi tipici di questo programma.
rpm
-
qpi <pacchetto-rpm>
Mostra una descrizione del contenuto del file RPM.
rpm
-
qa
Mostra l'elenco dei pacchetti RPM installati, così come sono stati registrati nel database del sistema RPM.
rpm
-
qpl <pacchetto-rpm>
Mostra l'elenco dei file contenuti nel file RPM e dove andranno collocati se sarà installato.
rpm
-
qf <file>
Determina il nome del pacchetto da cui proviene il file indicato come argomento.
rpm
-
i <pacchetto-rpm>
Installa il pacchetto se non si verificano errori.
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 del computer.
rpm
-
i -
-
ignoreos <pacchetto-rpm>
Installa il pacchetto senza verificare il tipo di sistema operativo.
rpm
-
U <pacchetto-rpm>
Aggiorna il pacchetto se non si verificano errori.
rpm
-
Uvh <pacchetto-rpm>
Aggiorna il pacchetto se non si verificano errori, mostrando qualche informazione e una barra di progressione.
rpm
-
e <nome-del-pacchetto-installato>
Elimina (disinstalla) il pacchetto.
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 effettivamente installato.
Una volta superato il problema dell'architettura del computer
e del sistema operativo (si dovrebbe risolvere dopo
l'installazione di un pacchetto RPM tipo
rpm-
*.i386.rpm), resta il problema delle
dipendenze tra i file.
Se si usa RPM in un sistema che fino a poco prima era stato
organizzato secondo una distribuzione Linux diversa da
RedHat, il sistema di registrazione delle installazioni
usato da RPM non contiene l'indicazione di tutto quello
che è installato realmente.
Di conseguenza, si otterranno sistematicamente segnalazioni
di errore dovuti alla presunta mancanza delle librerie e di altro.
Se si è sicuri che un componente, dichiarato mancante,
sia invece presente, basta usare l'argomento
-
-
nodeps.
Se si ha la necessità di sovrascrivere qualche file
preesistente, si può eventualmente usare anche
l'argomento -
-
replacefiles.
Per ottenere maggiori notizie sul sistema di archiviazione e installazione RPM si può visitare il seguente indirizzo.
Gli archivi della distribuzione Linux Debian hanno un formato particolare e l'estensione .deb. Gran parte del software per Linux può essere trovata ``confezionata'' anche con questo formato.
La prima cosa da fare è reperire un pacchetto per la
gestione degli archivi .deb.
Con l'aiuto di ftpsearch si può cercare
un archivio che assomigli a dpkg-
*tar.gz
http://ftpsearch.ntnu.no/ftpsearch
Con un po' di fortuna si riesce a trovare un pacchetto contenente i sorgenti da compilare di dpkg che è il motore in grado di gestire l'installazione, l'aggiornamento e l'eliminazione dei pacchetti .deb.
Supponendo di aver trovato il pacchetto
dpkg-
1.4.0.17.tar.gz, si procede con il suo
scompattamento.
#
tar -
z -
x -
f dpkg-
1.4.0.17.tar.gz
Si otterranno i sorgenti da compilare nel modo consueto: ./configure, make e make install.
Nonostante la fase di installazione crei tutto ciò che è necessario per il funzionamento di dpkg, potrebbe essere necessario aggiungere due file vuoti: /usr/var/dpkg/status e /usr/var/dpkg/available.
Avviando dpkg con l'opzione
-
-
help si ottiene l'elenco delle
opzioni utilizzabili.
Usage:
dpkg -i|--install <.deb file name> ... | -R|--recursive <dir> ...
dpkg --unpack <.deb file name> ... | -R|--recursive <dir> ...
dpkg -A|--record-avail <.deb file name> ... | -R|--recursive <dir> ...
dpkg --configure <package name> ... | -a|--pending
dpkg -r|--remove | --purge <package name> ... | -a|--pending
dpkg --get-selections [<pattern> ...] get list of selections to stdout
dpkg --set-selections set package selections from stdin
dpkg --update-avail <Packages-file> replace available packages info
dpkg --merge-avail <Packages-file> merge with info from file
dpkg --clear-avail erase existing available info
dpkg --forget-old-unavail forget uninstalled unavailable pkgs
dpkg -s|--status <package-name> ... display package status details
dpkg --print-avail <package-name> ... display available version details
dpkg -L|--listfiles <package-name> ... list files `owned' by package(s)
dpkg -l|--list [<pattern> ...] list packages concisely
dpkg -S|--search <pattern> ... find package(s) owning file(s)
dpkg -C|--audit check for broken package(s)
dpkg --print-architecture print target architecture (uses GCC)
dpkg --print-gnu-build-architecture print GNU version of target arch
dpkg --print-installation-architecture print host architecture (for inst'n)
dpkg --compare-versions <a> <rel> <b> compare version numbers - see below
dpkg --help | --version show this help / version number
dpkg --force-help | -Dh|--debug=help help on forcing resp. debugging
dpkg --licence print copyright licencing terms
Use dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|
-x|--extract|-X|--vextract|--fsys-tarfile on archives (type dpkg-deb --help.)
For internal use: dpkg --assert-support-predepends | --predep-package |
--assert-working-epoch
Options:
--admindir=<directory> Use <directory> instead of /usr/var/dpkg
--root=<directory> Install on alternative system rooted elsewhere
--instdir=<directory> Change inst'n root without changing admin dir
-O|--selected-only Skip packages not selected for install/upgrade
-E|--skip-same-version Skip packages whose same version is installed
-G=--refuse-downgrade Skip packages with earlier version than installed
-B|--auto-deconfigure Install even if it would break some other package
--largemem | --smallmem Optimise for large (>4Mb) or small (<4Mb) RAM use
--no-act Just say what we would do - don't do it
-D|--debug=<octal> Enable debugging - see -Dhelp or --debug=help
--ignore-depends=<package>,... Ignore dependencies involving <package>
--force-... Override problems - see --force-help
--no-force-...|--refuse-... Stop when problems encountered
Comparison operators for --compare-versions are:
lt le eq ne ge gt (treat no version as earlier than any version);
lt-nl le-nl ge-nl gt-nl (treat no version as later than any version);
< << <= = >= >> > (only for compatibility with control file syntax).
Use `dselect' for user-friendly package management.
Le potenzialità del programma dpkg sono molte e possono disorientare. In questa sezione sono descritti alcuni utilizzi tipici di questo programma.
dpkg
-
i <pacchetto-deb>
Installa il pacchetto indicato.
dpkg
-
r <nome-del-pacchetto-installato>
Elimina il pacchetto precedentemente installato lasciando però i file di configurazione.
dpkg
-
-
purge <nome-del-pacchetto-installato>
Elimina completamente il pacchetto precedentemente installato inclusi i file di configurazione.
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.
Durante l'installazione di un pacchetto, dpkg verifica che le dipendenze siano soddisfatte. Se ciò non è o non sembra essere, si ottengono delle segnalazioni di errore. Se si ritiene che le segnalazioni si errore siano fasulle, nel senso che ciò che sembra mancare è stato installato attraverso pacchetti diversi dal formato .deb, si possono ignorare questi messaggi.
Gli archivi della distribuzione Linux Slackware hanno un formato molto semplice: tar-gzip e utilizzano l'estensione tgz.
Gli archivi Slackware sono il risultato di una archiviazione attraverso tar e di una successiva compressione attraverso gzip. L'archivio è fatto in modo di conservare la struttura di directory a partire dalla radice e non contiene i link simbolici.
Nell'archivio viene aggiunta la directory /install/ contenente lo script doinst che normalmente si occupa di ricreare i link simbolici.
Volendo installare un pacchetto Slackware senza l'ausilio degli strumenti Slackware ( installpkg), si devono estrarre i file dall'archivio e quindi si deve avviare lo script /install/doinst.
Le operazioni vanno svolte come utente root. Si suppone di installare il pacchetto esempio.tgz.
#
cd /
#
tar -
x -
z -
p -
f esempio.tgz
#
/install/doinst
Quando si utilizza una distribuzione 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 si occupano di convertire un pacchetto da un formato a un altro, anche se non sempre funzionano perfettamente.
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 o viceversa, occorrono sia dpkg che rpm.
alien {
-
-
to-
deb |
-
-
to-
rpm}
[<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 o RedHat, a partire da questi formati e anche da Slackware o 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 Linux. Va quindi usata in modo consapevole e prudente.
Per maggiori dettagli conviene consultare la documentazione interna: alien(1).
1997.10.26 - Scritto da Daniele Giacomini daniele@calion.com (vedi copyright: Appunti Linux).