Gestione pacchetti software

Loris Tissino

19 giugno 2009

Software da sorgenti non pacchettizzati

Gran parte dei programmi sono normalmente disponibili in formato sorgente (in file tgz) e si possono recuperare via http o con programmi clienti di sistemi di controllo versione.

Per i programmi in formato sorgente, si procede spesso così:

tar xvzf nomepacchetto.tgz
cd nomepacchetto
./configure          # crea il Makefile
make                 # compila i sorgenti
sudo make install    # installa il software
make clean           # rimuove i file temporanei

Checkinstall

Se il programma usa gli strumenti autoconf e automake, è possibile creare velocemente un pacchetto a partire dai sorgenti con checkinstall.

tar xvzf nomepacchetto.tgz
cd nomepacchetto
./configure          # crea il Makefile
make                 # compila i sorgenti
sudo checkinstall    # crea il pacchetto deb e lo installa
make clean           # rimuove i file temporanei

Il Makefile

Il Makefile di un programma serve a indicare cosa deve essere fatto per compilare ed installare un programma partendo dai sorgenti. Normalmente viene creato da uno script, chiamato configure, in base all'hardware presente e alle opzioni passate da riga di comando.

Il primo argomento del comando make specifica cosa deve essere fatto esattamente.

In caso di problemi, cercare in rete (es. pagine del wiki di Ubuntu).

Librerie

Le funzionalità più comuni e generiche dei programmi vengono spesso compilate in librerie dinamiche (raccolte di moduli oggetto), dette shareable objects.

I programmi che sono compilati con l'uso di librerie dinamiche non possono essere eseguiti senza che la libreria sia presente. Il programma ldd permette di vedere da quali librerie dipende un programma e se esse vengono trovate.

$ ldd evolutolib_d
libloris.so => not found
libc.so.6 => /lib/tls/libc.so.6 (0x00cd8000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00a57000)

/etc/ld.so.conf

Il file /etc/ld.so.conf indica i percorsi dove vengono cercate le librerie al caricamento di un programma. Si tratta di un file di testo da cui viene ricavato il file binario /etc/ld.so.cache (tramite il comando sudo ldconfig).

È anche possibile specificare dove cercare le librerie indicando il loro percorso nella variabile d'ambiente _LD_LIBRARYPATH.

$ export LD_LIBRARY_PATH=.
$ ldd evolutolib_d
        libloris.so => ./libloris.so (0x005ed000)
        libc.so.6 => /lib/tls/libc.so.6 (0x0017b000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00b31000)
$ ./evolutolib_d
Hello, world!

Ltrace e Strace

A fini di debug, o per conoscere meglio il funzionamento di un programma, può essere utile ricorrere a due programmi che tracciano in un file di testo tutte le chiamate a funzioni di libreria (ltrace) e di sistema (strace).

$ ltrace -o chiamatelibreria cal > /dev/null
$ strace -o chiamatesistema cal > /dev/null

$ head -3 chiamate*
==> chiamatelibreria <==
__libc_start_main(0x402960, 1, 0x7fff0c423bd8, 0x403640, 0x403630 <unfinished ...>
setlocale(6, "")                                 = "it_IT.UTF-8"
setlocale(2, NULL)                               = "it_IT.UTF-8"

==> chiamatesistema <==
execve("/usr/bin/cal", ["cal"], [/* 31 vars */]) = 0
brk(0)                                  = 0x606000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b4dd9056000

I pacchetti

Le distribuzioni Linux mettono a disposizione (spesso, non sempre) sistemi di pacchettizzazione del software che permettono una più agevole amministrazione.

La pacchettizzazione infatti prevede:

Cosa c'è in un pacchetto

In un pacchetto sono presenti, solitamente, file che devono essere posti in diverse directory.

Ad esempio:

Sistemi di gestione dei pacchetti

Esistono due livelli di gestione dei pacchetti:

Inoltre, vi è la possibilità di recuperare i file sorgente e di compilarli, in modo da ottimizzarne o personalizzarne le prestazioni (cosa che si può fare con i pacchetti sorgente rpm e deb, ma è la norma con il sistema Portage della distribuzione Gentoo).

Installazione di un nuovo pacchetto

Fedora/RedHat:

rpm -i nomepacchetto-1.2.9-2.rpm

Debian/Ubuntu:

dpkg --install nomepacchetto-1.2.9-2.deb

Eventuali problemi di dipendenza verranno segnalati. Per le dipendenze incrociate (A dipende da B, B dipende da A), normalmente basta indicare sulla riga di comando l'insieme dei pacchetti necessari.

Aggiornamento di un pacchetto

Fedora/RedHat:

rpm -U nomepacchetto-1.2.9-2.rpm

Debian/Ubuntu:

dpkg --install -G nomepacchetto-1.2.9-2.deb

Installazione di un pacchetto con download da sorgente nota

Fedora:

yum install nomepacchetto

Debian/Ubuntu:

apt-get install nomepacchetto

Le sorgenti note sono indicate in /etc/yum.conf (Fedora) e in /etc/apt/sources-list (Debian).

Da dove viene questo file?

Fedora/RedHat:

rpm -q -f nomefile

Debian/Ubuntu:

dpkg -S nomefile

Cosa contiene questo pacchetto?

Fedora/RedHat:

rpm -q --provides -p nomepacchetto-1.2.9-2.rpm

Debian:

dpkg --contents nomepacchetto-1.2.9.deb 

Che pacchetti ho installato?

Fedora/RedHat:

rpm -q -a

Debian:

dpkg --list

Dove trovare i pacchetti?

Fedora/RedHat:

www.freshrpms.net, www.rpmfind.net

Debian:

packages.debian.org, www.backports.org

Ubuntu:

packages.ubuntu.com

Il sistema APT

Il file /etc/apt/sources.list contiene righe come le seguenti (per Ubuntu):

deb http://archive.ubuntu.com/ubuntu/ jaunty main restricted
deb-src http://archive.ubuntu.com/ubuntu/ jaunty main restricted

Queste righe specificano, rispettivamente, dove devono essere prelevati i pacchetti binari e dei sorgenti. In particolare, sono indicati l'URL di riferimento, il nome della distribuzione e le sezioni per cui quella riga va considerata.

Archivi APT

Gli archivi (ad esempio, http://archive.ubuntu.com/ubuntu) sono organizzati in directory:

La directory pool è suddivisa in directory corrispondenti alle sezioni:

Per Debian, le sezioni sono invece main, contrib e non-free.

Elenco dei pacchetti

L'elenco dei pacchetti, con le relative descrizioni, è posto in file compressi (Packages.gz oppure Packages.bz2) posti dentro dists.

Ad esempio,

http://archive.ubuntu.com/ubuntu/dists/jaunty/main/binary-i386/Packages.gz
http://archive.ubuntu.com/ubuntu/dists/jaunty/main/binary-i386/Packages.bz2

Le traduzioni nelle diverse lingue delle descrizioni sono presenti in file Translation-it.gz, Translation-fr.gz, ecc., presenti nella directory i18n.

Altre cose utili

Con Debian/Ubuntu, si può:

Creazione e gestione di un mirror APT

Può essere utile gestire una copia dei pacchetti per la propria distribuzione, ad esempio per poterla sfruttare all'interno di una rete locale.

A tale scopo si può usare il programma apt-mirror.

I passi da compiere sono i seguenti:

  1. installare apt-mirror (sudo apt-get install apt-mirror)
  2. modificare, se necessario, il file di configurazione /etc/apt/mirror.list
  3. verificare che l'utente apt-mirror sia il proprietario e abbia il permesso di scrittura nella directory indicata nel file di configurazione (di default /var/spool/apt-mirror)
  4. avviare il programma per il recupero dei pacchetti (sudo -u apt-mirror apt-mirror) -- per Ubuntu Jaunty vengono scaricati 25 GiB di dati
  5. creare in /var/www i link simbolici necessari per rendere disponibili via HTTP i file (ad esempio, /var/www/ubuntu deve essere un link a /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu)

Sulle altre macchine della rete bisognerà poi avere righe come la seguente (ovviamente l'indirizzo IP sarà diverso):

deb http://192.168.1.3/ubuntu/ jaunty main restricted universe multiverse