Capitolo successivo Capitolo precedente Indice

7. Confezionamento dei pacchetti di applicazioni Linux

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.

7.1 Archivi RPM

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.

Materiale necessario

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

Breve panoramica

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

Gli errori

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.


sigla descrizione
5 checksum MD5 fallito
S variazione della dimensione del file
L link 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
Elenco delle segnalazioni di errore generabili da un controllo di una installazione di pacchetti RPM.

Esempi di utilizzo

Le potenzialità del programma rpm sono molte e possono disorientare. In questa sezione sono descritti alcuni utilizzi tipici di questo programma.

query

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.

install

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.

upgrade

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.

erase

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

Elimina (disinstalla) il pacchetto.

verify

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.

Problemi dovuti alle dipendenze

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.

Approfondimento

Per ottenere maggiori notizie sul sistema di archiviazione e installazione RPM si può visitare il seguente indirizzo.

http://www.rpm.org/

7.2 Archivi Debian

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.

Materiale necessario

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.

Breve panoramica

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.

Alcuni esempi

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.

Problemi dovuti alle dipendenze

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.

7.3 Archivi Slackware

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

Struttura degli archivi

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.

Installazione manuale

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

7.4 Conversione

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

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).


Capitolo successivo Capitolo precedente Indice