Gestione dei metapacchetti: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
 
(27 versioni intermedie di 6 utenti non mostrate)
Riga 1: Riga 1:
==Introduzione==
{{Versioni compatibili}}
== Cosa sono i metapacchetti ==
Esiste un tipo particolare di pacchetto detto [[metapacchetto]] che in realtà non contiene alcun eseguibile o sorgente, ma serve semplicemente per installare tutto l'insieme di pacchetti (spesso a loro volta metapacchetti) che lo costituisce.<br/>
Un esempio è il [[pacchetto]] "kde-full" che permette di installare l'intero ambiente KDE in un colpo solo. Scarichiamo il pacchetto con [[apt-get]]:
<pre>
$ apt-get download kde-full
</pre>
e controlliamo la sua dimensione:
<pre>
$ ls -l kde-full*
-rw-r--r-- 1 pippo pippo 11732 apr 19  2013 kde-full_77+deb7u1_all.deb
</pre>
 
Già le dimensioni lasciano presagire qualcosa: come può un pacchetto come "kde-full" occupare solo poco meno di 12 KB? Vediamo cosa contiene con [[dpkg]]:
 
<pre>
$ dpkg --contents kde-full_77+deb7u1_all.deb
drwxr-xr-x root/root        0 2013-04-19 01:18 ./
drwxr-xr-x root/root        0 2013-04-19 01:18 ./usr/
drwxr-xr-x root/root        0 2013-04-19 01:18 ./usr/share/
drwxr-xr-x root/root        0 2013-04-19 01:18 ./usr/share/doc/
drwxr-xr-x root/root        0 2013-04-19 01:18 ./usr/share/doc/kde-full/
-rw-r--r-- root/root      1038 2013-03-25 19:44 ./usr/share/doc/kde-full/copyright
-rw-r--r-- root/root      9582 2013-04-19 01:18 ./usr/share/doc/kde-full/changelog.gz
</pre>
 
L'archivio <code>data.tar.gz</code> contiene solo due file.<br/>
Diamo un'occhiata al file <code>control</code>:
 
<pre>
$ dpkg --info kde-full_77+deb7u1_all.deb
nuovo pacchetto debian, versione 2.0.
dimensione 11732 byte: archivio di controllo=888 byte.
    1332 byte,    23 righe      control             
    137 byte,    2 righe      md5sums             
Package: kde-full
Source: meta-kde
Version: 5:77+deb7u1
Architecture: all
Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Installed-Size: 35
Depends: kde-plasma-desktop (>= 5:77+deb7u1), kde-plasma-netbook (>= 5:77+deb7u1), kdeadmin (>= 4:4.8.4), kdeartwork (>= 4:4.8.4), kdegraphics (>= 4:4.8.4),
          kdeedu (>= 4:4.8.4), kdegames (>= 4:4.8.4), kdemultimedia (>= 4:4.8.4), kdenetwork (>= 4:4.8.4), kdeutils (>= 4:4.8.4), kdepim (>= 4:4.4.11),
          kdeplasma-addons (>= 4:4.8.4)
Recommends: kde-standard (>= 5:77+deb7u1), kdeaccessibility (>= 4:4.8.4), kdesdk (>= 4:4.8.4), kdetoys (>= 4:4.8.4), kdewebdev (>= 4:4.8.4)
Suggests: kde-l10n (>= 4:4.8.4), calligra (>= 1:2.4.2), xorg
Breaks: kde-minimal (<< 5:57)
Provides: kde-software-compilation
Section: metapackages
Priority: optional
Homepage: http://www.kde.org
Description: ...
</pre>
 
In realtà, vediamo che a costituire il cuore del pacchetto sono le sue [[dipendenze]] (a loro volta metapacchetti). Questo permette di installare KDE attraverso l'installazione di '''un solo''' pacchetto. Senza i metapacchetti bisognerebbe installare uno per uno i pacchetti che costituiscono KDE.
 
L'output precedente indica chiaramente che il pacchetto "kde-full" è in realtà un metapacchetto:
<pre>
Section: metapackages
</pre>


Con questa guida vedremo di scoprire i metapacchetti e capire come utilizzarli/gestirli nel nostro sistema. Per capire alcuni concetti spiegati si darà per sottinteso la conoscenza del funzionamento del gestore di pacchetti '''Apt-Get'''. Per chi non conoscesse il sistema o semplicemente desidererebbe un riassunto a riguardo, vi rimando a una nostra un'introduzione : [[Introduzione_all'_Apt_System]]. Il concetto base da capire è quello di ''dipendenza''.
== Lista dei metapacchetti ==
Si può ottenere una lista completa dei metapacchetti elencando i pacchetti che contengono la parola ''metapackage'' nei [[tag]], nelle descrizioni oppure che appartengono alla sezione "metapackages"; servirà il pacchetto "debtags" e l'uso di [[aptitude]]:
<pre>
$ aptitude search '(~Gmetapackage|~dmetapackage|~smetapackages)' | less
</pre>
Se si vuole avere invece una lista dei metapacchetti installati sul sistema:
<pre>
$ aptitude search '~i(~Gmetapackage|~dmetapackage|~smetapackages)'
</pre>


==Definizione==
{{Warningbox|La ricerca della parola "metapackage" nelle descrizioni potrebbe fornire dei "falsi positivi". Per evitare problemi, indirizzarsi su una ricerca basata solo sui tag o sulla sezione del pacchetto:<pre>$ aptitude search '~i(~Gmetapackage|~smetapackages)'</pre>oppure leggere con attenzione la descrizione del pacchetto:<pre>$ apt-cache show nomepacchetto</pre>}}


Per la definizione di metapacchetto vi rimando al nostro glossario: [[Metapacchetto]].
A questi si aggiungono le eccezioni comprendenti i metapacchetti che riguardano l'installazione del [[kernel]]; questi sono nella forma: <code>linux-image-*</code>
<pre>
$ aptitude search '~nlinux-image-*'
</pre>
che sono dei metapacchetti che dipendono sempre dall'ultimo kernel Linux disponibile per l'[[architettura]] specificata. In tal modo, installando il pacchetto adatto al proprio sistema, il kernel verrà automaticamente aggiornato non appena è disponibile una nuova versione (si passerà ad esempio dal 4.0 alla 4.2). Viceversa, se non si installa il metapacchetto, il kernel non verrà mai aggiornato ad una versione superiore poiché i kernel Debian hanno la versione come parte integrante del nome del pacchetto e quindi una nuova versione viene vista come un nuovo pacchetto e non come un aggiornamento, come giusto che sia.<br/>
In mancanza del relativo metapacchetto:
* restano comunque possibili i normali aggiornamenti automatici correlati alla versione minore del kernel installato (ad esempio dalla 4.0.1 alla 4.0.2);
* se si vuol passare ad un kernel con ''major revision'' superiore (ad esempio se si vuole installare il kernel 4.2 quando sul proprio sistema è installato il kernel 4.0 o inferiore), sarà necessario installare esplicitamente il pacchetto per il nuovo kernel.


==Installazione/Rimozione==
== Installazione/Rimozione ==


Capito cosa sono i metapacchetti, ci accorgeremo subito di un problema: se per l'installazione di una ''suite'', come ad esempio ''GNOME'', l'installazione di un solo metapacchetto ci permette l'installazione di tutti i pacchetti necessari, essendo quest'ultimi tutte dipendenze del metapacchetto, se si andrà a rimuovere un pacchetto della ''suite'' in questione, il metapacchetto precedentemente installato avrà una dipendenza non soddisfatta. Questo farà sì che ad esempio [[Aptitude]] rimuoverà tutti i pacchetti della ''suite'' in quanto risultanti come dipendenze di un pacchetto che non è più installato (il metapacchetto appunto); altri comandi, come ad esempio:
Capito cosa sono i metapacchetti, ci accorgeremo subito di un problema: se per l'installazione di una ''suite'', come ad esempio ''GNOME'', l'installazione di un solo metapacchetto ci permette l'installazione di tutti i pacchetti necessari, essendo quest'ultimi tutte dipendenze del metapacchetto, se si andrà a rimuovere un pacchetto della ''suite'' in questione, il metapacchetto precedentemente installato avrà una dipendenza non soddisfatta. Questo farà sì che ad esempio [[Aptitude]] rimuoverà tutti i pacchetti della ''suite'' in quanto risultanti come dipendenze di un pacchetto che non è più installato (il metapacchetto appunto); altri comandi, come ad esempio:
Riga 15: Riga 89:
porteranno allo stesso risultato, sempre per via di dipendenze installate per un pacchetto che non esiste più.<br /><br />
porteranno allo stesso risultato, sempre per via di dipendenze installate per un pacchetto che non esiste più.<br /><br />


'''NOTA BENE''': questo comportamento dei pacchetti è in realtà un sistema molto ben pensato per "pulire" il sistema da pacchetti "inutili" (o meglio detto, non più utili). Facendo un piccolo esempio, se ho installato un pacchetto Y per soddisfare una dipendenza di un pacchetto X, eliminato X il pacchetto Y non mi servirà più, essendo stato installato unicamente per far funzionare X. Immaginando di aver appena eliminato il pacchetto X, ''Aptitude'' andrà automaticamente ad eliminare il pacchetto Y "ricordandosi" di averlo installato come dipendenza del pacchetto X. ''apt-get autoremove'' "vedrà" il pacchetto Y come installato da ''dipendenza'' e lo eliminerà portando allo stesso risultato.
{{Box|NOTA BENE:|questo comportamento dei pacchetti è in realtà un sistema molto ben architettato per "pulire" il sistema da pacchetti "inutili" (o meglio, per meglio dire, non più utili). Ad esempio: se ho installato il pacchetto Y per soddisfare una dipendenza del pacchetto X, eliminato X il pacchetto Y non mi servirà più, essendo stato installato unicamente per far funzionare X. Immaginando di aver appena eliminato il pacchetto X, ''Aptitude'' andrà automaticamente ad eliminare il pacchetto Y "ricordandosi" di averlo installato come dipendenza del pacchetto X. <code>apt-get autoremove</code> "vedrà" il pacchetto Y come installato da ''dipendenza'' e lo eliminerà portando allo stesso risultato.}}


===Installare un metapacchetto===
=== Installare un metapacchetto ===


In questo caso non occorre nessuna attenzione particolare: installeremo il metapacchetto come qualsiasi altro pacchetto con il nostro gestore preferito (aptitude, apt-get, synaptic, ...), il quale si "porterà dietro" tutti i pacchetti del caso (come sue dipendenze).
In questo caso non occorre nessuna attenzione particolare: installeremo il metapacchetto come qualsiasi altro pacchetto con il nostro gestore preferito di [[APT]] ([[apt-get]], [[aptitude]], [[synaptic]], etc.), il quale si "porterà dietro" tutti i pacchetti del caso (come sue [[dipendenze]]).


===Rimuovere un metapacchetto===
=== Rimuovere un metapacchetto ===


Il problema di quest'azione è riassunto all'inizio di questo capitolo.
Il problema di quest'azione è riassunto all'inizio di questo capitolo.


====Rimuovere l'intera ''suite''====
=== Rimuovere l'intera ''suite'' ===


Se vogliamo semplicemente eliminare tutta la ''suite''' del metapacchetto andremo semplicemente a rimuoverlo con il nostro gestore preferito. Nel caso di ''aptitude'', provvederà lui stesso ad eliminare le dipendenze (dunque i pacchetti della ''suite''); nel caso di apt-get, dopo il classico
Se vogliamo semplicemente eliminare tutta la ''suite'' del metapacchetto andremo semplicemente a rimuoverlo con il nostro gestore preferito. Nel caso di ''aptitude'', provvederà lui stesso ad eliminare le dipendenze (dunque i pacchetti della ''suite''); nel caso di [[apt-get]], dopo il classico


<pre># apt-get --purge remove nomemetapacchetto</pre>
<pre># apt-get remove nomemetapacchetto</pre>


dovremo dare ancora
dovremo eseguire ancora:


<pre># apt-get autoremove</pre>
<pre># apt-get autoremove</pre>
Riga 37: Riga 111:
proprio per rimuovere le dipendenze installate per il metapacchetto.
proprio per rimuovere le dipendenze installate per il metapacchetto.


====Rimuovere uno o più pacchetti della ''suite''====
=== Rimuovere uno o più pacchetti della ''suite'' ===


In questo caso, come già detto in precedenza, la rimozione di uno o più pacchetti della suite, rimuoverà con essi il metapacchetto principale (essendo lui stesso senza una o più dipendenze soddisfatte). A questo punto, senza il metapacchetto che faceva da "scheletro" alla ''suite'', i pacchetti di quest'ultima verranno eliminati da ''aptitude'' o da ''apt-get autoremove''.<br />
In questo caso, come già detto in precedenza, la rimozione di uno o più pacchetti della suite, porterà alla rimozione del metapacchetto principale (essendo esso stesso senza una o più dipendenze soddisfatte). A questo punto, senza il metapacchetto che faceva da "scheletro" alla ''suite'', i pacchetti di quest'ultima verranno eliminati da ''aptitude'' o da ''apt-get autoremove''.<br />
Per eliminare dunque dei pacchetti da una ''suite'' utilizzeremo ''apt-get'' e ''aptitude'' in modo combinato. Facciamo un esempio:
Per eliminare dunque dei pacchetti da una ''suite'' utilizzeremo ''apt-get'' e ''aptitude'' in modo combinato. Facciamo un esempio:


Riga 45: Riga 119:
* andremo ad eliminare il pacchetto ''evolution'' della ''suite'', senza eliminare quest'ultima.
* andremo ad eliminare il pacchetto ''evolution'' della ''suite'', senza eliminare quest'ultima.


Inizieremo dunque con ''apt-get'':
Inizieremo innanzitutto ad aggiornare il sistema per prevenire sopraggiunte modifiche nelle dipendenze tra pacchetti:
<pre>
# apt-get update
</pre>
e poi:
<pre>
# apt-get upgrade
</pre>
oppure:
<pre>
# apt-get dist-upgrade
</pre>
Quindi rimuoviamo il pacchetto che ci interessa:
<pre># apt-get remove evolution</pre>


<pre># apt-get --purge remove evolution</pre>
Lanciato il comando, verremo avvertiti che saranno eliminati cinque pacchetti: ''gnome'', ''gnome-desktop-environment'', ''evolution'',  ''evolution-exchange'', ''evolution-plugins'', tra i quali noteremo i due metapacchetti della ''suite'' in questione. Lo stesso ''apt-get'' ci suggerirà poi di utilizzare ''apt-get autoremove'' per eliminare le dipendenze non soddisfatte (che sono però in questo caso tutti i pacchetti della ''suite''). Per mantenere questi pacchetti daremo il comando:


Lanciato il comando andremo ad eliminare 5 pacchetti: ''gnome'', ''gnome-desktop-environment'', ''evolution'',  ''evolution-exchange'', ''evolution-plugins'', tra i quali noteremo i due metapacchetti della ''suite'' in questione. Lo stesso ''apt-get'' ci suggerirà poi di utilizzare ''apt-get autoremove'' per eliminare le dipendenze non soddisfatte (che sono però in questo caso tutti i pacchetti della ''suite''). Per mantenere questi pacchetti daremo il comando:
<pre># aptitude keep-all</pre>


<pre># aptitude keep-all</pre>
che andrà ad eliminare la loro eliminazione (scusate il gioco di parole). L'opzione ''keep-all'' di ''aptitude'' cancella tutte le azioni impostate per ogni pacchetto; qualsiasi azione d'installazione, rimozione o aggiornamento verrà rimossa dallo stato di tutti i pacchetti interessati.


che andrà ad eliminare la loro eliminazione (scusate il gioco di parole). L'opzione ''keep-all'' di ''aptitude'' cancella tutte le azioni impostate per ogni pacchetto; qualsiasi azione d'installazione, rimozione o aggiornamento verrà rimossa dallo stato di tutti i pacchetti interessati.<br /><br />
Un risultato identico si ottiene con <code>apt-mark</code>:
<pre>
# apt-mark manual pacchetto1 pacchetto2 pacchetto3 ...
</pre>
che marcherà il pacchetto (o i pacchetti) come "manual" al posto di "auto". Questo eviterà che "autoremove" lo consideri come pacchetto da disinstallare.<br/>
"apt-mark", a differenza di "aptitude keep-all", necessita che il nome dei pacchetti sia specificato esplicitamente.


A questo punto, avremo la nostra ''suite'' perfettamente funzionante con le "modifiche" apportate.
A questo punto, avremo la nostra ''suite'' perfettamente funzionante con le "modifiche" apportate.


==Creare un metapacchetto==
== Creare un metapacchetto ==


Come abbiamo visto in precedenza, i metapacchetti sono molto utili per installare ''suite'' di programmi con un solo comando (installando il metapacchetto appunto). Con il pacchetto '''equivs''' tutto è molto semplice; incominceremo con l'installarlo:
Come noto i metapacchetti sono molto utili per installare ''suite'' di programmi con un solo comando (installando il metapacchetto appunto). Con il pacchetto '''equivs''' tutto è molto semplice; incominceremo con l'installarlo:


<pre># aptitude install equivs</pre>
<pre># apt-get install equivs</pre>


A questo punto lanceremo il comando:
A questo punto lanceremo il comando:
Riga 67: Riga 159:
<pre>$ equivs-control controller</pre>
<pre>$ equivs-control controller</pre>


il quale creerà un file ''controller'' per il nostro metapacchetto (il nome è arbitrario, potete scegliere quello che volete). Il suo aspetto è il seguente (dopo averlo aperto in un editor qualsiasi):
il quale creerà un file <code>controller</code> per il nostro metapacchetto (il nome è arbitrario, potete scegliere quello che volete). Il suo aspetto è il seguente (dopo averlo aperto in un editor qualsiasi):


<pre>
<pre>
Riga 96: Riga 188:
</pre>
</pre>


Andremo poi ad inserire i campi illustrati dopo aver ''decommentato'' le righe che vogliamo definire. Il campo più importante è sicuramente ''Depends'', che ha il ruolo fondamentale del metapacchetto, senza dimenticarci di dare il nome al metapacchetto. Gli altri campi sono più o meno facoltativi (inserire la versione, il mantenitore e una piccola descrizione sarebbe comunque auspicato).<br /><br />
Andremo poi ad inserire i campi illustrati dopo aver ''decommentato'' le righe che vogliamo definire. Il campo più importante è sicuramente ''Depends'', che ha il ruolo fondamentale del metapacchetto, senza dimenticarci di dare il nome al metapacchetto. Gli altri campi sono più o meno facoltativi (inserire la versione, il mantenitore e una piccola descrizione sarebbe comunque auspicato).


Infine daremo il comando:
Infine daremo il comando:
Riga 102: Riga 194:
<pre>$ equivs-build controller</pre>
<pre>$ equivs-build controller</pre>


che creerà il metapacchetto ''.deb'' che potremo poi installare come qualsiasi pacchetto
che creerà il metapacchetto <code>.deb</code> che potremo poi installare come qualsiasi pacchetto.


===Esempio pratico===
{{Warningbox | È possibile anche creare un metapacchetto con il nome e la versione di una dipendenza da soddisfare, ingannando così il sistema, che penserà che una data dipendenza è già soddisfatta e non cercherà quindi di installarla. Questo uso è però pericoloso, se non si è più che certi di quello che si sta facendo, e nel caso peggiore può rendere inusabile tanto il programma quanto l'intero sistema.}}


Prendiamo ad esempio questa guida: [[Installare_e_configurare_i_codec_per_DVD_e_Mp3]]. Sarebbe ora interessante creare un metapacchetto che installi i pacchetti necessari con un solo comando. Iniziamo dunque a creare un controller:
 
=== Esempio pratico ===
 
Prendiamo ad esempio questa guida: [[Installare e configurare i codec per DVD e Mp3]]. Sarebbe ora interessante creare un metapacchetto che installi i pacchetti necessari con un solo comando. Iniziamo dunque a creare un controller:


<pre>$ equivs-control controller</pre>
<pre>$ equivs-control controller</pre>


Editiamo poi il file ''controller'' nel modo seguente (sulla base della guida citata):
Editiamo poi il file <code>controller</code> nel modo seguente (sulla base della guida citata):


<pre>
<pre>
Riga 124: Riga 219:
# Pre-Depends: <comma-separated list of packages>
# Pre-Depends: <comma-separated list of packages>
Depends: libfaad2-0,libmp4-0,libfaac0,alsamixergui,toolame,lame,libmp3lame0,libdvdnav4,libdvdread3,libdvdcss2,w32codecs,ffmpeg
Depends: libfaad2-0,libmp4-0,libfaac0,alsamixergui,toolame,lame,libmp3lame0,libdvdnav4,libdvdread3,libdvdcss2,w32codecs,ffmpeg
Recommends: debian-multimedia-keyring
Recommends: deb-multimedia-keyring
# Suggests: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
Riga 134: Riga 229:
# Extra-Files: <comma-separated list of additional files for the doc directory>
# Extra-Files: <comma-separated list of additional files for the doc directory>
Description: installa codec per DVD e mp3
Description: installa codec per DVD e mp3
Questo metapacchetto installa le librerie per la riproduzione di DVD e mp3. Ricordiamo di aggiungere i repository debian-multimedia (deb http://www.debian-multimedia.org lenny main) all'interno del proprio /etc/apt/sources.list
Questo metapacchetto installa le librerie per la riproduzione di DVD e mp3.  
Ricordiamo di aggiungere i repository deb-multimedia (deb http://www.deb-multimedia.org lenny main) all'interno del proprio /etc/apt/sources.list
</pre>
</pre>


Creiamo il pacchetto debian:
Creiamo il [[pacchetto]] Debian:


<pre>$ equivs-build controller</pre>
<pre>$ equivs-build controller</pre>


Se tutto sarà andato a buon fine (occhio alla sintassi!) otterremo il pacchetto ''codec-dvd-mp3_0.1_all.deb'' nella directory da dove abbiamo lanciato i comandi. Per dare un'ennesima verifica al pacchetto, daremo il comando:
Se tutto sarà andato a buon fine (occhio alla sintassi!) otterremo il pacchetto <code>codec-dvd-mp3_0.1_all.deb</code> nella directory da dove abbiamo lanciato i comandi. Per eseguire un'ennesima verifica del pacchetto utilizziamo il comando:


<pre>$ dpkg --info codec-dvd-mp3_0.1_all.deb</pre>
<pre>$ dpkg --info codec-dvd-mp3_0.1_all.deb</pre>
Riga 148: Riga 244:


<pre>
<pre>
Package: codec-dvd-mp3
Package: codec-dvd-mp3
Version: 0.1
Version: 0.1
Architecture: all
Architecture: all
Maintainer: Debianizzati <info@debianizzati.org>
Maintainer: Debianizzati <info@debianizzati.org>
Installed-Size: 36
Installed-Size: 36
Depends: libfaad2-0, libmp4-0, libfaac0, alsamixergui, toolame, lame, libmp3lame0, libdvdnav4, libdvdread3, libdvdcss2, w32codecs, ffmpeg
Depends: libfaad2-0, libmp4-0, libfaac0, alsamixergui, toolame, lame, libmp3lame0, libdvdnav4, libdvdread3, libdvdcss2, w32codecs, ffmpeg
Recommends: debian-multimedia-keyring
Recommends: deb-multimedia-keyring
Section: misc
Section: misc
Priority: optional
Priority: optional
Description: installa codec per DVD e mp3
Description: installa codec per DVD e mp3
  Questo metapacchetto installa le librerie per la riproduzione di DVD e mp3. Ricordiamo di aggiungere i repository debian-multimedia (deb http://www.debian-multimedia.org lenny main) all'interno del proprio /etc/apt/sources.list
Questo metapacchetto installa le librerie per la riproduzione di DVD e mp3.  
</pre>
Ricordiamo di aggiungere i repository deb-multimedia (deb http://www.deb-multimedia.org lenny main) all'interno del proprio /etc/apt/sources.list</pre>
 
Si ricordi che <code>dpkg</code> non si occupa di risolvere le dipendenze, quindi installare un pacchetto con dipendenze non soddisfatte ne aggiungerebbe uno con stato ''broken'' al sistema, che andrebbe corretto in seguito (per esempio con <code>apt-get --fix-broken</code>). È però consigliato utilizzare [[gdebi]], che si avvale subito di [[APT]] per cercare di risolvere le dipendenze del pacchetto prima di procedere alla sua installazione, evitando di installare pacchetti ''broken'' sul sistema.
 
{{Autori
|Autore=[[Utente:Brunitika|Brunitika]] 16:49, 8 apr 2009 (CEST)
|Estesa_da=
|Verificata_da=
: [[Utente:HAL 9000|HAL 9000]] 11:05, 7 mag 2015 (CEST)
|Numero_revisori=1
}}


Sarebbe bello ora installare il nostro pacchetto con ''dpkg'', ma dovremmo sapere che non è possibile. Questo perchè ''dpkg'' non sa risolvere le dipendenze come ''apt-get''. Dovremmo allora inserire il nostro pacchetto in un repository (esistente o creandolo anche in locale -> [[Creare_un_Repository_Debian]]) oppure forzare le dipendenze all'installazione (opzione ''--force-depends'' da aggiungere al classico ''dpkg -i'') e installare le dipendenze manualmente con un manager come ''aptitude''.
----
[[Utente:Brunitika|Brunitika]] 16:49, 8 apr 2009 (CEST)
----
[[Categoria:Apt]]
[[Categoria:Apt]]

Versione attuale delle 09:33, 22 mag 2016

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

Cosa sono i metapacchetti

Esiste un tipo particolare di pacchetto detto metapacchetto che in realtà non contiene alcun eseguibile o sorgente, ma serve semplicemente per installare tutto l'insieme di pacchetti (spesso a loro volta metapacchetti) che lo costituisce.
Un esempio è il pacchetto "kde-full" che permette di installare l'intero ambiente KDE in un colpo solo. Scarichiamo il pacchetto con apt-get:

$ apt-get download kde-full

e controlliamo la sua dimensione:

$ ls -l kde-full*
-rw-r--r-- 1 pippo pippo 11732 apr 19  2013 kde-full_77+deb7u1_all.deb

Già le dimensioni lasciano presagire qualcosa: come può un pacchetto come "kde-full" occupare solo poco meno di 12 KB? Vediamo cosa contiene con dpkg:

$ dpkg --contents kde-full_77+deb7u1_all.deb 
drwxr-xr-x root/root         0 2013-04-19 01:18 ./
drwxr-xr-x root/root         0 2013-04-19 01:18 ./usr/
drwxr-xr-x root/root         0 2013-04-19 01:18 ./usr/share/
drwxr-xr-x root/root         0 2013-04-19 01:18 ./usr/share/doc/
drwxr-xr-x root/root         0 2013-04-19 01:18 ./usr/share/doc/kde-full/
-rw-r--r-- root/root      1038 2013-03-25 19:44 ./usr/share/doc/kde-full/copyright
-rw-r--r-- root/root      9582 2013-04-19 01:18 ./usr/share/doc/kde-full/changelog.gz

L'archivio data.tar.gz contiene solo due file.
Diamo un'occhiata al file control:

$ dpkg --info kde-full_77+deb7u1_all.deb 
 nuovo pacchetto debian, versione 2.0.
 dimensione 11732 byte: archivio di controllo=888 byte.
    1332 byte,    23 righe      control              
     137 byte,     2 righe      md5sums              
 Package: kde-full
 Source: meta-kde
 Version: 5:77+deb7u1
 Architecture: all
 Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
 Installed-Size: 35
 Depends: kde-plasma-desktop (>= 5:77+deb7u1), kde-plasma-netbook (>= 5:77+deb7u1), kdeadmin (>= 4:4.8.4), kdeartwork (>= 4:4.8.4), kdegraphics (>= 4:4.8.4),
          kdeedu (>= 4:4.8.4), kdegames (>= 4:4.8.4), kdemultimedia (>= 4:4.8.4), kdenetwork (>= 4:4.8.4), kdeutils (>= 4:4.8.4), kdepim (>= 4:4.4.11),
          kdeplasma-addons (>= 4:4.8.4)
 Recommends: kde-standard (>= 5:77+deb7u1), kdeaccessibility (>= 4:4.8.4), kdesdk (>= 4:4.8.4), kdetoys (>= 4:4.8.4), kdewebdev (>= 4:4.8.4)
 Suggests: kde-l10n (>= 4:4.8.4), calligra (>= 1:2.4.2), xorg
 Breaks: kde-minimal (<< 5:57)
 Provides: kde-software-compilation
 Section: metapackages
 Priority: optional
 Homepage: http://www.kde.org
 Description: ...

In realtà, vediamo che a costituire il cuore del pacchetto sono le sue dipendenze (a loro volta metapacchetti). Questo permette di installare KDE attraverso l'installazione di un solo pacchetto. Senza i metapacchetti bisognerebbe installare uno per uno i pacchetti che costituiscono KDE.

L'output precedente indica chiaramente che il pacchetto "kde-full" è in realtà un metapacchetto:

 Section: metapackages

Lista dei metapacchetti

Si può ottenere una lista completa dei metapacchetti elencando i pacchetti che contengono la parola metapackage nei tag, nelle descrizioni oppure che appartengono alla sezione "metapackages"; servirà il pacchetto "debtags" e l'uso di aptitude:

$ aptitude search '(~Gmetapackage|~dmetapackage|~smetapackages)' | less

Se si vuole avere invece una lista dei metapacchetti installati sul sistema:

$ aptitude search '~i(~Gmetapackage|~dmetapackage|~smetapackages)'
Warning.png ATTENZIONE
La ricerca della parola "metapackage" nelle descrizioni potrebbe fornire dei "falsi positivi". Per evitare problemi, indirizzarsi su una ricerca basata solo sui tag o sulla sezione del pacchetto:
$ aptitude search '~i(~Gmetapackage|~smetapackages)'
oppure leggere con attenzione la descrizione del pacchetto:
$ apt-cache show nomepacchetto


A questi si aggiungono le eccezioni comprendenti i metapacchetti che riguardano l'installazione del kernel; questi sono nella forma: linux-image-*

$ aptitude search '~nlinux-image-*'

che sono dei metapacchetti che dipendono sempre dall'ultimo kernel Linux disponibile per l'architettura specificata. In tal modo, installando il pacchetto adatto al proprio sistema, il kernel verrà automaticamente aggiornato non appena è disponibile una nuova versione (si passerà ad esempio dal 4.0 alla 4.2). Viceversa, se non si installa il metapacchetto, il kernel non verrà mai aggiornato ad una versione superiore poiché i kernel Debian hanno la versione come parte integrante del nome del pacchetto e quindi una nuova versione viene vista come un nuovo pacchetto e non come un aggiornamento, come giusto che sia.
In mancanza del relativo metapacchetto:

  • restano comunque possibili i normali aggiornamenti automatici correlati alla versione minore del kernel installato (ad esempio dalla 4.0.1 alla 4.0.2);
  • se si vuol passare ad un kernel con major revision superiore (ad esempio se si vuole installare il kernel 4.2 quando sul proprio sistema è installato il kernel 4.0 o inferiore), sarà necessario installare esplicitamente il pacchetto per il nuovo kernel.

Installazione/Rimozione

Capito cosa sono i metapacchetti, ci accorgeremo subito di un problema: se per l'installazione di una suite, come ad esempio GNOME, l'installazione di un solo metapacchetto ci permette l'installazione di tutti i pacchetti necessari, essendo quest'ultimi tutte dipendenze del metapacchetto, se si andrà a rimuovere un pacchetto della suite in questione, il metapacchetto precedentemente installato avrà una dipendenza non soddisfatta. Questo farà sì che ad esempio Aptitude rimuoverà tutti i pacchetti della suite in quanto risultanti come dipendenze di un pacchetto che non è più installato (il metapacchetto appunto); altri comandi, come ad esempio:

# apt-get autoremove

porteranno allo stesso risultato, sempre per via di dipendenze installate per un pacchetto che non esiste più.

Info.png NOTA BENE:
questo comportamento dei pacchetti è in realtà un sistema molto ben architettato per "pulire" il sistema da pacchetti "inutili" (o meglio, per meglio dire, non più utili). Ad esempio: se ho installato il pacchetto Y per soddisfare una dipendenza del pacchetto X, eliminato X il pacchetto Y non mi servirà più, essendo stato installato unicamente per far funzionare X. Immaginando di aver appena eliminato il pacchetto X, Aptitude andrà automaticamente ad eliminare il pacchetto Y "ricordandosi" di averlo installato come dipendenza del pacchetto X. apt-get autoremove "vedrà" il pacchetto Y come installato da dipendenza e lo eliminerà portando allo stesso risultato.


Installare un metapacchetto

In questo caso non occorre nessuna attenzione particolare: installeremo il metapacchetto come qualsiasi altro pacchetto con il nostro gestore preferito di APT (apt-get, aptitude, synaptic, etc.), il quale si "porterà dietro" tutti i pacchetti del caso (come sue dipendenze).

Rimuovere un metapacchetto

Il problema di quest'azione è riassunto all'inizio di questo capitolo.

Rimuovere l'intera suite

Se vogliamo semplicemente eliminare tutta la suite del metapacchetto andremo semplicemente a rimuoverlo con il nostro gestore preferito. Nel caso di aptitude, provvederà lui stesso ad eliminare le dipendenze (dunque i pacchetti della suite); nel caso di apt-get, dopo il classico

# apt-get remove nomemetapacchetto

dovremo eseguire ancora:

# apt-get autoremove

proprio per rimuovere le dipendenze installate per il metapacchetto.

Rimuovere uno o più pacchetti della suite

In questo caso, come già detto in precedenza, la rimozione di uno o più pacchetti della suite, porterà alla rimozione del metapacchetto principale (essendo esso stesso senza una o più dipendenze soddisfatte). A questo punto, senza il metapacchetto che faceva da "scheletro" alla suite, i pacchetti di quest'ultima verranno eliminati da aptitude o da apt-get autoremove.
Per eliminare dunque dei pacchetti da una suite utilizzeremo apt-get e aptitude in modo combinato. Facciamo un esempio:

  • come suite prenderemo GNOME. I metapacchetti che la installano sono gnome e gnome-desktop-environment
  • andremo ad eliminare il pacchetto evolution della suite, senza eliminare quest'ultima.

Inizieremo innanzitutto ad aggiornare il sistema per prevenire sopraggiunte modifiche nelle dipendenze tra pacchetti:

# apt-get update

e poi:

# apt-get upgrade

oppure:

# apt-get dist-upgrade

Quindi rimuoviamo il pacchetto che ci interessa:

# apt-get remove evolution

Lanciato il comando, verremo avvertiti che saranno eliminati cinque pacchetti: gnome, gnome-desktop-environment, evolution, evolution-exchange, evolution-plugins, tra i quali noteremo i due metapacchetti della suite in questione. Lo stesso apt-get ci suggerirà poi di utilizzare apt-get autoremove per eliminare le dipendenze non soddisfatte (che sono però in questo caso tutti i pacchetti della suite). Per mantenere questi pacchetti daremo il comando:

# aptitude keep-all

che andrà ad eliminare la loro eliminazione (scusate il gioco di parole). L'opzione keep-all di aptitude cancella tutte le azioni impostate per ogni pacchetto; qualsiasi azione d'installazione, rimozione o aggiornamento verrà rimossa dallo stato di tutti i pacchetti interessati.

Un risultato identico si ottiene con apt-mark:

# apt-mark manual pacchetto1 pacchetto2 pacchetto3 ...

che marcherà il pacchetto (o i pacchetti) come "manual" al posto di "auto". Questo eviterà che "autoremove" lo consideri come pacchetto da disinstallare.
"apt-mark", a differenza di "aptitude keep-all", necessita che il nome dei pacchetti sia specificato esplicitamente.

A questo punto, avremo la nostra suite perfettamente funzionante con le "modifiche" apportate.

Creare un metapacchetto

Come noto i metapacchetti sono molto utili per installare suite di programmi con un solo comando (installando il metapacchetto appunto). Con il pacchetto equivs tutto è molto semplice; incominceremo con l'installarlo:

# apt-get install equivs

A questo punto lanceremo il comando:

$ equivs-control controller

il quale creerà un file controller per il nostro metapacchetto (il nome è arbitrario, potete scegliere quello che volete). Il suo aspetto è il seguente (dopo averlo aperto in un editor qualsiasi):

### Commented entries have reasonable defaults.
### Uncomment to edit them.
Section: misc
Priority: optional
Standards-Version: 3.6.2

Package: <package name; defaults to equivs-dummy>
# Version: <enter version here; defaults to 1.0>
# Maintainer: Your Name <yourname@example.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
Description: <short description; defaults to some wise words> 
 long description and info
 .
 second paragraph

Andremo poi ad inserire i campi illustrati dopo aver decommentato le righe che vogliamo definire. Il campo più importante è sicuramente Depends, che ha il ruolo fondamentale del metapacchetto, senza dimenticarci di dare il nome al metapacchetto. Gli altri campi sono più o meno facoltativi (inserire la versione, il mantenitore e una piccola descrizione sarebbe comunque auspicato).

Infine daremo il comando:

$ equivs-build controller

che creerà il metapacchetto .deb che potremo poi installare come qualsiasi pacchetto.

Warning.png ATTENZIONE
È possibile anche creare un metapacchetto con il nome e la versione di una dipendenza da soddisfare, ingannando così il sistema, che penserà che una data dipendenza è già soddisfatta e non cercherà quindi di installarla. Questo uso è però pericoloso, se non si è più che certi di quello che si sta facendo, e nel caso peggiore può rendere inusabile tanto il programma quanto l'intero sistema.



Esempio pratico

Prendiamo ad esempio questa guida: Installare e configurare i codec per DVD e Mp3. Sarebbe ora interessante creare un metapacchetto che installi i pacchetti necessari con un solo comando. Iniziamo dunque a creare un controller:

$ equivs-control controller

Editiamo poi il file controller nel modo seguente (sulla base della guida citata):

### Commented entries have reasonable defaults.
### Uncomment to edit them.
Section: misc
Priority: optional
Standards-Version: 3.6.2

Package: codec-dvd-mp3
Version: 0.1
Maintainer: Debianizzati <info@debianizzati.org>
# Pre-Depends: <comma-separated list of packages>
Depends: libfaad2-0,libmp4-0,libfaac0,alsamixergui,toolame,lame,libmp3lame0,libdvdnav4,libdvdread3,libdvdcss2,w32codecs,ffmpeg
Recommends: deb-multimedia-keyring
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
Description: installa codec per DVD e mp3
Questo metapacchetto installa le librerie per la riproduzione di DVD e mp3. 
Ricordiamo di aggiungere i repository deb-multimedia (deb http://www.deb-multimedia.org lenny main) all'interno del proprio /etc/apt/sources.list

Creiamo il pacchetto Debian:

$ equivs-build controller

Se tutto sarà andato a buon fine (occhio alla sintassi!) otterremo il pacchetto codec-dvd-mp3_0.1_all.deb nella directory da dove abbiamo lanciato i comandi. Per eseguire un'ennesima verifica del pacchetto utilizziamo il comando:

$ dpkg --info codec-dvd-mp3_0.1_all.deb

ottenendo il seguente output:

Package: codec-dvd-mp3
Version: 0.1
Architecture: all
Maintainer: Debianizzati <info@debianizzati.org>
Installed-Size: 36
Depends: libfaad2-0, libmp4-0, libfaac0, alsamixergui, toolame, lame, libmp3lame0, libdvdnav4, libdvdread3, libdvdcss2, w32codecs, ffmpeg
Recommends: deb-multimedia-keyring
Section: misc
Priority: optional
Description: installa codec per DVD e mp3
Questo metapacchetto installa le librerie per la riproduzione di DVD e mp3. 
Ricordiamo di aggiungere i repository deb-multimedia (deb http://www.deb-multimedia.org lenny main) all'interno del proprio /etc/apt/sources.list

Si ricordi che dpkg non si occupa di risolvere le dipendenze, quindi installare un pacchetto con dipendenze non soddisfatte ne aggiungerebbe uno con stato broken al sistema, che andrebbe corretto in seguito (per esempio con apt-get --fix-broken). È però consigliato utilizzare gdebi, che si avvale subito di APT per cercare di risolvere le dipendenze del pacchetto prima di procedere alla sua installazione, evitando di installare pacchetti broken sul sistema.




Guida scritta da: Brunitika 16:49, 8 apr 2009 (CEST) Swirl-auth40.png Debianized 40%
Estesa da:
Verificata da:
HAL 9000 11:05, 7 mag 2015 (CEST)

Verificare ed estendere la guida | Cos'è una guida Debianized