Indice
Questo capitolo tratta alcuni aspetti dettagliati a basso livello della gestione dei pacchetti di Debian. Se si è principalmente interessati nell'uso degli strumenti relativi, si salti ai capitoli Capitolo 8, Gli strumenti di gestione dei pacchetti Debian e Capitolo 9, Mantenere il sistema Debian aggiornato.
I pacchetti generalmente contengono tutti quei file necessari a implementare una serie di comandi o funzionalità correlate. Ci sono due tipi di pacchetti Debian:
Pacchetti binari, che contengono eseguibili, file di
configurazione, pagine man/info, informazioni sul copyright ed altra
documentazione. Questi pacchetti sono distribuiti in un formato archivio
specifico di Debian (si veda Sezione 7.2, «Qual è il formato di un pacchetto binario Debian?»); sono solitamente
caratterizzati dall'estensione «.deb». I pacchetti binari possono essere
spacchettati usando l'utilità Debian dpkg
(opzionalmente
tramite un frontend come apt); i dettagli sono forniti
nella sua pagina di manuale.
Pacchetti sorgente, che consistono in un file
.dsc
che descrive il pacchetto sorgente (inclusi i nomi
dei file seguenti), un file .orig.tar.gz
che contiene il
sorgente originale non modificato nel formato tar compresso con gzip e
solitamente un file .debian.tar.xz
che contiene le
modifiche specifiche di Debian fatte al sorgente originale. L'utilità
dpkg-source
pacchetta e spacchetta gli archivi sorgente
Debian; i dettagli sono forniti nella sua pagina di manuale. (Il programma
apt-get può essere usato come frontend per
dpkg-source
.)
L'installazione di software attraverso il sistema dei pacchetti usa
"dipendenze" che vengono progettate con cura dai manutentori dei
pacchetti. Queste dipendenze sono documentate nel file
control
associato ad ogni pacchetto. Per esempio, il
pacchetto contenente il compilatore C GNU (gcc
) "dipende" dal pacchetto binutils
che include il linker e
l'assemblatore. Se un utente tenta di installare gcc
senza avere prima installato binutils
, il sistema di gestione dei pacchetti
(dpkg) invia un messaggio di errore avvertendo che necessita anche di
binutils
, e ferma l'installazione di
gcc
. (Questa funzione può essere
tuttavia aggirata dall'utente tenace, si veda
dpkg(8).)
Per maggiori informazioni, si veda Sezione 7.9, «Cosa significa dire che un pacchetto Dipende da,
Raccomanda, Suggerisce,
Va in conflitto con, Sostituisce,
Rompe o Fornisce un altro
pacchetto?» più sotto.
Gli strumenti Debian per i pacchetti possono essere usati per:
manipolare e gestire pacchetti o parti di pacchetti,
amministrare le deviazioni locali dei file in un pacchetto,
aiutare gli sviluppatori nella costruzione degli archivi dei pacchetti e
aiutare gli utenti nell'installazione di pacchetti che sono in un archivio remoto.
A Debian "package", or a Debian archive file, contains the executable files,
libraries, and documentation associated with a particular program or set of
related programs. Normally, a Debian archive file has a filename that ends
in .deb
.
I dettagli di questo formato per i pacchetti binari Debian sono descritti
nella pagina di manuale
deb(5).
Questo formato interno è soggetto a modifiche (tra diversi rilasci
principali di Debian GNU/Linux), quindi usare sempre
dpkg-deb(1)
se si devono effettuare manipolazioni a basso livello di file
.deb
.
The Debian binary package file names conform to the following convention: <DebianPackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb
Checking the package name associated with a particular Debian archive file (.deb file) can be done in one of these ways:
Esaminando il file "Packages" nella directory dove era stato archiviato su un sito archivio Debian. Questo file contiene una sezione che descrive ogni pacchetto; il primo campo in ogni sezione è il nome formale del pacchetto.
use the command dpkg --info PPP_VVV-RRR_AAA.deb
(where
PPP, VVV, RRR and AAA are the package name, version, revision and
architecture of the package in question, respectively). This displays,
among other things, the package name corresponding to the archive file being
unpacked.
La parte VVV
è il numero di versione specificato dallo
sviluppatore originale. Qui non ci sono standard, per cui il numero di
versione può avere formati differenti come "19990513" e "1.3.8pre1".
La parte RRR
è il numero di revisione Debian e viene
specificata dallo sviluppatore Debian (o un utente che sceglie di
ricompilare il pacchetto localmente). Questo numero corrisponde al livello
di revisione del pacchetto Debian, quindi un nuovo livello di revisione
significa solitamente modifiche nel Makefile Debian
(debian/rules
), nel file di controllo Debian
(debian/control
), negli script di installazione o
rimozione (debian/p*
) oppure nei file di configurazione
utilizzati con il pacchetto.
La parte AAA
identifica il processore per cui è stato
compilato il pacchetto. È solitamente amd64
, che si
riferisce ai chip AMD64, Intel 64 o VIA Nano. Per altre possibilità si veda
la struttura delle directory degli archivi Debian in Sezione 6.7, «Cosa sono tutte quelle directory negli archivi Debian?». Per dettagli, si veda la descrizione delle
«architetture Debian» nella pagina di manuale
dpkg-architecture(1).
Le specifiche riguardanti il contenuto di un file di controllo Debian sono fornite nel manuale Debian Policy, sezione 5, si veda Sezione 12.1, «Quale altra documentazione esiste su e per un sistema Debian?».
Brevemente, un esempio di file di controllo è mostrato di seguito per il pacchetto Debian hello:
Package: hello Version: 2.9-2+deb8u1 Architecture: amd64 Maintainer: Santiago Vila <[email protected]> Installed-Size: 145 Depends: libc6 (>= 2.14) Conflicts: hello-traditional Breaks: hello-debhelper (<< 2.9) Replaces: hello-debhelper (<< 2.9), hello-traditional Section: devel Priority: optional Homepage: https://www.gnu.org/software/hello/ Description: pacchetto di esempio basato su hello di GNU Il programma GNU hello produce un familiare e amichevole saluto. Consente ai non programmatori di usare un classico strumento informatico che altrimenti non sarebbe disponibile per loro. . A parte gli scherzi, questo è un esempio di come creare un pacchetto Debian. È la versione Debian del programma "hello world" del progetto GNU (che è esso stesso un esempio per il progetto GNU).
Il campo Package fornisce il nome del pacchetto. Questo è il nome attraverso il quale il pacchetto può essere manipolato con gli strumenti per i pacchetti ed è solitamente simile, ma non necessariamente identico, alla prima parte della stringa del nome del file archivio Debian.
Il campo Version fornisce sia il numero della versione dello sviluppatore originale, sia (nell'ultima parte) il livello di revisione del pacchetto Debian di questo programma, come spiegato in Sezione 7.3, «Perché i nomi dei pacchetti Debian sono così lunghi?».
Il campo Architecture specifica il chip per il quale questo particolare binario è stato compilato.
Il campo Depends fornisce una lista di pacchetti che devono essere installati per poter installare questo pacchetto con successo.
Installed-Size indica quanto spazio su disco occuperà il pacchetto installato. È pensato per essere usato dai frontend di installazione in modo da poter mostrare se c'è abbastanza spazio disponibile su disco per installare il programma.
La riga Section fornisce la "sezione" in cui questo pacchetto Debian è archiviato presso i siti archivio Debian.
Priority indica quanto è importante questo pacchetto per l'installazione, così che i software semi-intelligenti come apt o aptitude possano ordinare il pacchetto dentro una categoria di, ad esempio, pacchetti installati in modo opzionale. Si veda Sezione 7.7, «Cosa sono i pacchetti Essential, Required, Important, Standard, Optional o Extra?».
Il campo Maintainer fornisce l'indirizzo di posta elettronica della persona che è attualmente responsabile della manutenzione di questo pacchetto.
Il campo Description fornisce un breve riassunto delle funzionalità del pacchetto.
Per ulteriori informazioni riguardo tutti i campi possibili che può avere un pacchetto, si veda il manuale Debian Policy, sezione 5, "Control files and their fields" (vedere Sezione 12.1, «Quale altra documentazione esiste su e per un sistema Debian?»).
Conffiles è una lista di file di configurazione (solitamente situati in
/etc
) che il sistema di gestione dei pacchetti non
sovrascriverà quando il pacchetto viene aggiornato. Questo assicura che i
valori locali per il contenuto di questi file vengano preservati, ed è una
caratteristica critica che permette l'aggiornamento in loco di pacchetti su
un sistema in esecuzione.
Per determinare esattamente quali file sono preservati durante un aggiornamento, si esegua:
dpkg --status pacchetto
e si guardi alla voce "Conffiles:".
Questi file sono script eseguibili che vengono automaticamente eseguiti
prima o dopo l'installazione o la rimozione di un pacchetto. Insieme ad un
file chiamato control
, tutti questi file sono parte della
sezione «control» di un file archivio Debian.
I singoli file sono:
Questo script viene eseguito prima che il pacchetto a cui appartiene venga spacchettato dal file di archivio Debian (".deb"). Molti script «preinst» interrompono i servizi per i pacchetti che devono essere aggiornati fino a che la loro installazione o aggiornamento non sono completati (a seguito dell'esecuzione con successo dello script «postinst»).
This script typically completes any required configuration of the package
foo
once foo
has been unpacked from
its Debian archive (".deb") file. Many 'postinst' scripts execute any
commands necessary to start or restart a service once a new package has been
installed or upgraded.
Questo script tipicamente ferma tutti i demoni associati ad un pacchetto. Viene eseguito prima della rimozione di file associati al pacchetto.
Questo script tipicamente modifica i collegamenti o altri file associati a
pippo
, o rimuove i file creati da quel pacchetto. (Si
veda anche Sezione 7.8, «Cos'è un pacchetto virtuale?».)
Attualmente tutti i file di controllo si possono trovare nella directory
/var/lib/dpkg/info
. I file attinenti al pacchetto
pippo
iniziano con il nome «pippo» ed hanno le estensioni
«preinst», «postinst», ecc., a seconda della funzione. Il file
pippo.list
nella stessa directory elenca tutti i file
installati con il pacchetto pippo
. (Si noti che la
posizione di questi file è un dato tecnico interno di dpkg; non ci si
dovrebbe fare affidamento.)
Ad ogni pacchetto Debian viene assegnata una priorità dai manutentori della distribuzione, come aiuto al sistema di gestione dei pacchetti. Le priorità sono:
Required (Richiesto): pacchetti necessari al corretto funzionamento del sistema.
Comprendono tutti gli strumenti che sono necessari per riparare i difetti di sistema. Questi pacchetti non devono essere rimossi o il proprio sistema potrebbe diventare completamente non funzionante e probabilmente non si riuscirebbe nemmeno ad usare dpkg per rimettere le cose a posto. I sistemi con solo i pacchetti Required sono probabilmente inutilizzabili, ma hanno abbastanza funzionalità per permettere all'amministratore di sistema di avviare ed installare altri programmi.
Important (Importante): pacchetti che si dovrebbero trovare su tutti i sistemi *nix.
Comprendono altri pacchetti senza i quali il sistema non funziona bene o non sarebbe utilizzabile. Tra questi NON sono inclusi Emacs o X o TeX o qualsiasi altra grossa applicazione. Questi pacchetti costituiscono solo l'infrastruttura di base.
Standard: pacchetti comuni su qualsiasi sistema Linux, compreso un ragionevolmente piccolo ma nemmeno troppo limitato sistema a caratteri. Sono inclusi strumenti per inviare posta elettronica (con mutt) e scaricare file da server archivio.
Questo è ciò che viene installato in modo predefinito se l'utente non seleziona nient'altro. Non include molte grosse applicazioni, ma include l'interprete Python e qualche software server come OpenSSH (per amministrazione da remoto) ed Exim (per la consegna della posta, anche se può essere configurato per la sola consegna locale). Include anche della documentazione generica comune che può essere utile per la maggior parte degli utenti.
Optional (Opzionale): pacchetti che comprendono tutto quello che si può voler installare senza nemmeno sapere cos'è, o se non si hanno delle necessità particolari.
Comprendono X, una distribuzione completa di TeX e molte applicazioni.
Extra: pacchetti che o entrano in conflitto con altri di priorità più alta, probabilmente utili se già si sa a cosa servono, oppure hanno requisiti speciali che li rendono non adatti come "Optional".
Se si fa un'installazione Debian predefinita verranno installati sul sistema tutti i pacchetti di priorità Standard o maggiore. Se si selezionano attività predefinite si otterranno anche pacchetti con priorità più bassa.
In aggiunta, alcuni pacchetti sono marcati come Essential (Essenziali) dato che sono assolutamente necessari per il corretto funzionamento del sistema. Gli strumenti di gestione dei pacchetti si rifiuteranno di rimuoverli.
Un pacchetto virtuale è un nome generico che si applica ad ognuno dei
componenti di un gruppo di pacchetti, che forniscono funzionalità di base
simili. Per esempio, entrambi i programmi konqueror
e
firefox-esr
sono browser web e dovrebbero quindi
soddisfare qualsiasi dipendenza di un programma che richiede un browser web
sul sistema, per poter funzionare o essere utile. Si dice quindi che
entrambi forniscono il «pacchetto virtuale» chiamato
www-browser
.
Similmente, exim4
e sendmail
forniscono entrambi la funzionalità di agente di trasporto posta. Si dice
quindi che forniscono il pacchetto virtuale «mail-transport-agent». Se uno
qualsiasi dei due è installato, allora ogni pacchetto che dipende
dall'installazione di un mail-transport-agent
vedrà le
proprie dipendenze soddisfatte dalla presenza di questo pacchetto virtuale.
Debian fornisce un meccanismo in modo che, se più di un pacchetto che
fornisce lo stesso pacchetto virtuale è installato su di un sistema,
l'amministratore di sistema può allora impostarne uno come pacchetto
preferito. Il relativo comando è update-alternatives
ed è
descritto più in dettaglio in Sezione 11.11, «Ad alcuni utenti piace mawk, ad altri gawk; ad alcuni piace vim, ad altri
elvis; ad alcuni piace trn, ad altri tin; come supporta Debian le diversità?».
Il sistema dei pacchetti Debian ha una serie di "dipendenze" dei pacchetti che sono pensate per indicare (con un singolo termine) il livello a cui, su un dato sistema, un determinato Programma A può funzionare indipendentemente dall'esistenza di un Programma B.
Il pacchetto A dipende dal Pacchetto B se B deve essere assolutamente installato per eseguire A. In alcuni casi, A dipende non solo da B, ma da una versione di B. In questo caso la dipendenza dalla versione è solitamente un limite inferiore, nel senso che A dipende da qualsiasi versione di B più recente di quella specificata.
Il pacchetto A raccomanda il Pacchetto B se il manutentore del pacchetto giudica che la maggior parte degli utenti non vorrebbe A senza le funzionalità fornite da B.
Il pacchetto A suggerisce il Pacchetto B se B contiene file attinenti alle funzioni di A (e che solitamente le migliorano).
Il pacchetto A va in conflitto con il Pacchetto B quando A non è in grado di funzionare se B è installato sul sistema. Molto spesso i conflitti si hanno quando A contiene dei file che rappresentano dei miglioramenti di quelli in B. Spesso "va in conflitto" è associato a "sostituisce".
Il pacchetto A sostituisce il Pacchetto B quando i file installati da B vengono rimossi e (in alcuni casi) sovrascritti dai file di A.
Il pacchetto A rompe il pacchetto B quando non è possibile configurare simultaneamente entrambi i pacchetti su un sistema. Il sistema di gestione dei pacchetti si rifiuta di installare uno se l'altro è già installato e configurato sul sistema.
Il pacchetto A fornisce il Pacchetto B quando tutti i file e le funzionalità di B sono incorporate in A. Questo meccanismo permette agli utenti con limitato spazio su disco rigido di avere solo la parte del pacchetto A realmente necessaria per loro.
Informazioni più dettagliate sull'utilizzo di ognuno di questi termini possono essere trovate nel manuale Debian Policy, sezione 7.2 "Binary Dependencies" (vedere Sezione 12.1, «Quale altra documentazione esiste su e per un sistema Debian?»).
«Pre-Depends» è una dipendenza speciale. Per la maggior parte dei pacchetti,
dpkg
spacchetta il loro file di archivio (ovvero il loro
file .deb
) indipendentemente dal fatto che i file da cui
dipendono siano o meno sul sistema. Semplificando, spacchettare vuol dire
che dpkg
estrae i file da installare dall'archivio e li
mette al loro posto nel file system. Se quei pacchetti
dipendono dall'esistenza di qualche altro pacchetto sul
sistema, dpkg
si rifiuta di completare l'installazione
(eseguendo l'azione «configura»), finché gli altri pacchetti non sono
installati.
Tuttavia, per alcuni pacchetti, dpkg
si rifiuta persino
di spacchettarli finché certe dipendenze non vengono risolte. Tali pacchetti
si dice che "Pre-dipendono" dalla presenza di altri pacchetti. Il progetto
Debian aveva fornito questo meccanismo per supportare un aggiornamento
sicuro di sistemi dal formato a.out
al formato
ELF
, dove l'ordine
in cui i pacchetti
venivano spacchettati era critico. Esistono altre situazioni di
aggiornamenti estesi in cui questo metodo è utile, per esempio pacchetti con
priorità richiesta e la loro dipendenza da libC.
Come sopra, informazioni più dettagliate al riguardo possono essere reperite nel manuale Debian Policy.
Queste etichette dei «desiderata» indicano il volere dell'utente riguardo ad
un pacchetto (come indicato direttamente dall'utente nell'esecuzione di
dpkg
/apt
/aptitude
).
I loro significati sono:
sconosciuto: l'utente non ha mai indicato se vuole il pacchetto;
installa: l'utente vuole che il pacchetto sia installato o aggiornato;
rimuovi: l'utente vuole che sia rimosso il pacchetto, ma non i file di configurazione esistenti;
elimina: l'utente vuole che il pacchetto sia completamente rimosso, compresi i file di configurazione;
blocca: l'utente non vuole che il pacchetto sia processato, ovvero vuole mantenere la versione attuale con lo stato attuale, qualunque essi siano.
Esistono tre modi per bloccare (hold) pacchetti, con dpkg, apt o aptitude.
Con dpkg, si deve solo esportare la lista delle selezioni dei pacchetti con:
dpkg --get-selections \* > selezione.txt
Poi modificare il file risultante selezione.txt
,
cambiando la riga contenente il pacchetto che si desidera bloccare, per
esempio libc6
, da questo:
libc6 install
a questo:
libc6 hold
Salvare il file e ricaricarlo nel database di dpkg con:
dpkg --set-selections < selezione.txt
Con apt si può bloccare un pacchetto usando
apt-mark hold nome_pacchetto
e rimuovere il blocco con
apt-mark unhold nome_pacchetto
Con aptitude, si può bloccare un pacchetto usando
aptitude hold nome_pacchetto
e rimuovere il blocco con
aptitude unhold nome_pacchetto
I pacchetti sorgente Debian non possono realmente venire "installati", vengono solo spacchettati in qualsiasi directory in cui si vogliano compilare i pacchetti binari che producono.
I pacchetti sorgente sono distribuiti sulla maggior parte dei mirror dove si possono ottenere i pacchetti binari. Se si imposta il proprio sources.list(5) di APT in modo che includa le righe «deb-src» appropriate, sarà possibile scaricare facilmente qualsiasi pacchetto sorgente eseguendo
apt-get source pippo
Per aiutare nella reale compilazione del pacchetto sorgente, i pacchetti sorgente Debian forniscono il cosiddetto meccanismo di dipendenze di compilazione. Significa che il manutentore del pacchetto sorgente mantiene una lista di altri pacchetti che sono richiesti per compilare il suo pacchetto. Per vedere come questo sia utile, si esegua
apt-get build-dep pippo
prima di compilare il sorgente.
Il metodo consigliato è usare vari strumenti wrapper. Verrà mostrato come
farlo usando gli strumenti devscripts
. Installare questo
pacchetto se non è ancora stato fatto.
Ora, come prima cosa recuperare il pacchetto sorgente:
apt-get source pippo
e spostarsi nell'albero dei sorgenti:
cd pippo-*
Poi installare le dipendenze di compilazione necessarie (se ce ne sono):
sudo apt-get build-dep pippo
Creare quindi una versione dedicata della propria compilazione (in modo da non confondersi successivamente quando Debian stessa rilascerà una nuova versione):
dch -l local 'Bla bla bla'
Da ultimo compilare il proprio pacchetto:
debuild -us -uc
Se tutto ha funzionato a dovere, dovrebbe essere ora possibile installare il proprio pacchetto eseguendo
sudo dpkg -i ../*.deb
Se si preferisce fare le cose a mano, e non si vuole usare
devscripts
, seguire la procedura seguente:
Si avrà bisogno di tutti i file pippo_*.dsc, pippo_*.tar.gz e pippo_*.debian.tar.xz per compilare i sorgenti (nota: non c'è nessun .debian.tar.xz per alcuni pacchetti che sono nativi di Debian).
Una volta che li si ha (Sezione 7.13, «Come si installa un pacchetto sorgente?»), e si ha il pacchetto
dpkg-dev
installato, il seguente
comando
dpkg-source -x pippo_versione-revisione.dsc
estrarrà il pacchetto in una directory chiamata
pippo-versione
.
Se si vuole solo compilare il pacchetto, si può entrare nella directory
pippo-versione
e lanciare il comando
dpkg-buildpackage -rfakeroot -b
per compilare il pacchetto (si noti che questo richiede anche il pacchetto
fakeroot
), e poi
dpkg -i ../pippo_versione-revisione_arch.deb
per installare il pacchetto appena compilato.
Per maggiori dettagli al riguardo si legga la New Maintainers' Guide, (Guida
per il nuovo Maintainer) disponibile nel pacchetto maint-guide
o su https://iwawocd.cewmufwd.tk/doc/devel-manuals#maint-guide, oppure la
«Guide for Debian Maintainers», disponibile nel pacchetto debmake-doc
o su https://iwawocd.cewmufwd.tk/doc/devel-manuals#debmake-doc.