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
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 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).
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)
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!
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
Le distribuzioni Linux mettono a disposizione (spesso, non sempre) sistemi di pacchettizzazione del software che permettono una più agevole amministrazione.
La pacchettizzazione infatti prevede:
In un pacchetto sono presenti, solitamente, file che devono essere posti in diverse directory.
Ad esempio:
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).
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.
Fedora/RedHat:
rpm -U nomepacchetto-1.2.9-2.rpm
Debian/Ubuntu:
dpkg --install -G nomepacchetto-1.2.9-2.deb
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).
Fedora/RedHat:
rpm -q -f nomefile
Debian/Ubuntu:
dpkg -S nomefile
Fedora/RedHat:
rpm -q --provides -p nomepacchetto-1.2.9-2.rpm
Debian:
dpkg --contents nomepacchetto-1.2.9.deb
Fedora/RedHat:
rpm -q -a
Debian:
dpkg --list
Fedora/RedHat:
www.freshrpms.net, www.rpmfind.net
Debian:
packages.debian.org, www.backports.org
Ubuntu:
packages.ubuntu.com
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.
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.
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.
Con Debian/Ubuntu, si può:
apt-get upgrade --dry-runapt-get upgrade --print-urisapt-cachealienapt-get sourcePuò 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:
sudo apt-get install apt-mirror)sudo -u apt-mirror apt-mirror) -- per Ubuntu Jaunty vengono scaricati 25 GiB di datiSulle 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