Introduzione all'APT System

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

Introduzione

Il sistema APT (Advanced Package Manager) è, semplificando, un insieme di strumenti atti a permettere l'installazione e la successiva gestione di moltissimi programmi. Volendo essere più precisi l'apt-system creato dagli sviluppatori di Debian è un insieme di script che si appoggiano al comando dpkg allo scopo di snellire/agevolare la gestione di pacchetti e dipendenze nei sistemi Debian GNU/Linux. Notoriamente chi prende confidenza con Debian difficilmente sarà tentato di cambiare distribuzione, e questo anche grazie a questo splendido set di tool.
Esistono due strade per installare un programma sul proprio computer:

  • tramite APT;
  • scaricando e compilando manualmente i sorgenti dei vari programmi.

La prima soluzione è infinitamente più comoda e rapida, mentre la seconda in genere viene intrapresa solo se si hanno particolari necessità o se un certo programma non è disponibile tramite APT. Come anticipato esistono diversi strumenti per gestire il sistema APT:

  • Apt-Get e dpkg, strumenti a riga di comando brevemente descritti nella sezione successiva.
  • Aptitude, è il più potente strumento grafico a caratteri per la gestione dei pacchetti
  • Synaptic, disponibile in ambienti grafici come GNOME, KDE, ecc. è tra gli strumenti più semplice da usare, consigliato a tutti ed in particolar modo agli utenti alle prime armi.
  • Wajig

Apt-get e altri strumenti

Lungi dall'essere completa, questa brevissima panoramica ha lo scopo di fornire un piccolo vademecum per mantenere in forma il nostro sistema operativo senza far ricorso a tool grafici che, nella maggior parte dei casi, non hanno la necessaria "precisione". Vediamo brevemente i principali comandi (ovviamente dovete essere root):

Installazione, Rimozione, Aggiornamento

dpkg -i nome-pacchetto.deb
installa un pacchetto Debian già scaricato e presente nella directory corrente;
apt-get install [pacchetto1, pacchetto2, pacchettoN, ...]
il comando scarica e installa/aggiorna i pacchetti indicati, risolvendo le dipendenze;
apt-get remove [pacchetto1, pacchetto2, pacchettoN, ...]
è l'esatto opposto del comando precedente, rimuove i pacchetti indicati;
aptitude purge [pacchetto1, pacchetto2, pacchettoN, ...]
rimuove i pacchetti indicati ed elimina anche i file di configurazione;
apt-get update
aggiorna la lista dei pacchetti e le relative informazioni (versione disponibile, descrizione, ecc.);
apt-get upgrade
aggiorna i pacchetti installati sul nostro sistema (se sono disponibili versione più recenti). Non installa nuovi pacchetti;
apt-get dist-upgrade
è simile al precedente, ma aggiorna tutti i pacchetti anche a costo di installare nuovi pacchetti e rimuoverne di presenti, per soddisfare le dipendenze;
apt-get install [pacchetto] -s
simula (stampando l'output) il processo di installazione di un pacchetto. Utili per controllare se il pacchetto che stiamo installando/aggiornando modificherà altri pacchetti da noi installati.

Vedere anche la Guida ad Aptitude.


Ricerca e Informazioni sui pacchetti

apt-cache search [stringa da cercare]
usando questo comando possiamo cercare pacchetti in base al nome, alla descrizione, ecc.;
apt-cache show [nome pacchetto]
questo comando visualizza una breve descrizione del pacchetto da noi richiesto, fornendo versione, uso, dipendenze e altre utili informazioni;
apt-file search nome-file
cerca in quali pacchetti è presente il file nome-file. Vedere anche: Apt-file: ricerca all'interno dei pacchetti.

Gestione delle fonti (o repository)

apt-setup
serve per aggiungere/aggiornare le fonti (o repository) da cui scaricare i pacchetti;
apt-cdrom
aggiunge alle fonti per i pacchetti il contenuto di un CD Debian.

Pacchetti sorgenti e compilazione

apt-get source [pacchetto]
questo è il comando da utilizzare nel caso volessimo installare i sorgenti di un pacchetto. NOTA BENE: i sorgenti così scaricati, una volta compilati, daranno origine ad un pacchetto .deb che andrà a sua volta installato! I sorgenti vengono scaricati nella directory da cui si è lanciato il comando.
apt-get build-dep [pacchetto]
questo è un pacchetto fondamentale, specie se si lavora molto con i sorgenti. Si preoccupa di soddisfare le dipendenze del pacchetto che andremo a compilare dopo aver eseguito apt-get source.
apt-get source [pacchetto] --compile
è il passo finale per la compilazione di un pacchetto deb. Lanciatelo dalla stessa directory in cui avete scaricato i sorgenti da compilare.

Altro

apt-get autoclean
i pacchetti scaricati vengono memorizzati in /var/cache/apt/archive/ che col passare del tempo tende a gonfiarsi notevolmente. Con questo comando è possibile dire all'apt-system di cancellare questi pacchetti. Notare che, se fatta a mano, questa operazione causerà un certo "disorientamento" da parte di apt convinto di avere una copia di eventuali pacchetti in locale.
apt-get clean
elimina tutti i pacchetti dalla cache.
apt-get moo
Have you mooed today ?
E per concludere con le easter-eggs
  • aptitude mooo
  • aptitude -v moo
  • aptitude -vv moo
  • aptitude -vvvvvvvvv moo

I Pacchetti

Nel primo paragrafo si è generalmente parlato di programmi per usare un termine piuttosto noto, ma sfortunatamente improprio in questo contesto. Il sistema APT mette a disposizione dei pacchetti, che non necessariamente coincidono col significato generico di programma, infatti ci sono pacchetti che forniscono solo librerie necessarie a uno o più applicativi, ma di per se non direttamente utilizzabili dall'utente. Si ha dunque una struttura estremamente complessa dove un pacchetto dipende da altri pacchetti e a sua volta può essere un requisito per altri applicativi. Fortunatamente la gestione del sistema è fortemente automatizzata, gli strumenti precedentemente citati sono tutti in grado di fornire una lista di pacchetti necessari (chiamati dipendenze), consigliati e di pacchetti suggeriti, inoltre possono rimuovere un programma conservandone i file di configurazione, oppure eliminarlo totalmente; possono anche mostrare la descrizione di ogni pacchetto o ricercare quale pacchetto contiene una certa parola chiave nella descrizione, possono aggiornare in blocco l'intero sistema usando varie politiche di aggiornamento, possono installare i sorgenti di un pacchetto e gestire le dipendenze necessarie alla compilazione, possono infine molto altro ancora. Premesso questo è bene sapere che esistono fondamentalmente tre tipi di pacchetti, i binari, i sorgenti e i metapacchetti.

Pacchetti binari

I pacchetti binari sono archivi contenenti eseguibili, file di configurazione e documentazione che assieme formano un'applicazione. Sotto Debian, i binari hanno il suffisso .deb (c'è la possibilità anche di usare rpm, ma questa è un'altra storia). Vediamo cosa contiene un archivio .deb:

	# ls
	apache_1.3.33-6_i386.deb
	# ar -tv apache_1.3.33-6_i386.deb
	rw-r--r-- 0/0      4 May 11 11:34 2005 debian-binary
	rw-r--r-- 0/0  13852 May 11 11:34 2005 control.tar.gz
	rw-r--r-- 0/0 369530 May 11 11:34 2005 data.tar.gz

Abbiamo un file e due tarball. Procediamo estraendo questi ultimi.

	# ar -x apache_1.3.33-6_i386.deb
	# ls
	apache_1.3.33-6_i386.deb  control.tar.gz  data.tar.gz  debian-binary
	# cat debian-binary
	2.0

Il file debian-binary stabilisce la versione del formato deb, in questo caso la 2.0. Estraiamo gli archivi control.tar.gz e data.tar.gz.

	# tar xvzf control.tar.gz            
	./
	./config
	./templates
	./postinst
	./preinst
	./prerm
	./postrm
	./conffiles
	./control
	./md5sums
	# tar xvzf data.tar.gz
	./
	./etc/
	./etc/apache/
	./etc/apache/conf.d/
	./etc/init.d/
	./etc/init.d/apache
	./etc/logrotate.d/
	./etc/logrotate.d/apache
	./usr/
	./usr/lib/
	./usr/lib/apache/
	./usr/lib/apache/suexec.disabled
	./usr/lib/cgi-bin/
	./usr/sbin/
	./usr/sbin/apache
	./usr/sbin/apachectl
	./usr/share/
	./usr/share/bug/
	./usr/share/bug/apache/
	./usr/share/bug/apache/presubj
	./usr/share/doc/
	./usr/share/doc/apache/
	./usr/share/doc/apache/examples/
	...

L'archivio control.tar.gz contiene le informazioni riguardanti il pacchetto e le sue dipendenze e degli script che vengono lanciati prima e dopo l'installazione o la rimozione. Il file control contiene il nome del pacchetto, la sua versione, la sezione, la priorità, l'architettura per cui è stato compilato il pacchetto, le dipendenze, il maintainer del pacchetto e la sua descrizione. Diamogli un'occhiata.

	# cat control
	Package: apache
	Version: 1.3.33-6
	Section: web
	Priority: optional
	Architecture: i386
	Depends: libc6 (>= 2.3.2.ds1-21), libdb4.2, libexpat1 (>= 1.95.8), 
	mime-support, apache-common (>= 1.3.33-6), apache-common (<< 1.3.34-0), 
	perl (>= 5.8.4-2), logrotate (>= 3.5.4-1), dpkg (>> 1.9.0), libmagic1, 
	debconf
	Suggests: apache-doc
	Conflicts: apache-modules, libapache-mod-perl (<= 1.17-1), jserv (<= 
	1.1-3)
	Replaces: apache-modules
	Provides: httpd-cgi, httpd
	Installed-Size: 700
	Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org>
	Description: versatile, high-performance HTTP server
	 The most popular server in the world, Apache features a modular
	 design and supports dynamic selection of extension modules at runtime.
	 Some of its strong points are its range of possible customization,
	 dynamic adjustment of the number of server processes, and a whole
	 range of available modules including many authentication mechanisms,
	 server-parsed HTML, server-side includes, access control, CERN httpd
	 metafiles emulation, proxy caching, etc.  Apache also supports multiple
	 virtual homing.
	 .
	 Separate Debian packages are available for PHP, mod_perl, Java
	 Servlet support, Apache-SSL, and other common extensions.  More
	 information is available at http://www.apache.org/.

Un pacchetto può avere priorità required, ossia è necessario al funzionamento del sistema, important, quindi costituisce la base del sistema, standard, cioè i pacchetti comuni presenti su sistemi non troppo minimali, optional, i pacchetti totalmente opzionali, quindi X11, Emacs, e via dicendo, e infine extra, che contiene pacchetti aventi caratteristiche particolari che li distinguono dagli optional. Oltre alle dipendenze vere e proprie (nel caso di sopra le libc, dpkg, debconf, ecc.), abbiamo anche altri pacchetti citati, ossia i suggested packages, quindi quelli che possono funzionare bene assieme al pacchetto che si sta installando, i recommended, che comunemente vengono installati assieme a quest'ultimo, i conflicts e i replaced packages, rispettivamente i pacchetti con cui va in contrasto e che sostituisce, e infine i provided services, i servizi che il pacchetto fornisce (in questo caso, demone http con supporto cgi). Guardiamo ora il file conffiles:

	# cat conffiles
	/etc/init.d/apache
	/etc/logrotate.d/apache

Vengono elencati i file di configurazione che verranno creati. Gli scripts di cui parlavo prima sono postinst, postrm, preinst e prerm, che si occupano come già detto delle operazione pre e post installazione/rimozione.

L'archivio data.tar.gz contiene tutti i file che verranno effettivamente disposti nel filesystem. Diamo per esempio un'occhiata alla directory usr:

	# ls
	apache_1.3.33-6_i386.deb  control.tar.gz  md5sums   prerm
	conffiles                 data.tar.gz     postinst  templates
	config                    debian-binary   postrm    usr
	control                   etc             preinst   var
	# ls usr
	lib  sbin  share
	# ls usr/sbin
	apache  apacheconfig  apachectl

Pacchetti sorgenti

I pacchetti sorgenti sono costituiti da due archivi e un file di testo: un file .dsc che descrive il pacchetto, un archivio .orig.tar.gz che contiene i sorgenti originali del software, e un .diff.gz contenente le patch applicate da Debian al pacchetto.

	# apt-get source irssi-text
	Reading Package Lists... Done
	Building Dependency Tree... Done
	Need to get 1168kB of source archives.
	Get:1 http://ftp.de.debian.org unstable/main irssi-text 0.8.9-3 (dsc) 
	[691B]
	Get:2 http://ftp.de.debian.org unstable/main irssi-text 0.8.9-3 (tar) 
	[1154kB]
	Get:3 http://ftp.de.debian.org unstable/main irssi-text 0.8.9-3 (diff) 
	[13.9kB]
	Fetched 1168kB in 11s (103kB/s)                                                
	dpkg-source: extracting irssi-text in irssi-text-0.8.9
	# ls
	irssi-text-0.8.9            irssi-text_0.8.9-3.dsc
	irssi-text_0.8.9-3.diff.gz  irssi-text_0.8.9.orig.tar.gz

Il file .dsc contiene la versione del software, l'architettura per cui è stato scritto, la dipendenze da soddisfare e gli hash dei due archivi per verificarne l'integrità.

	# cat irssi-text_0.8.9-3.dsc
	-----BEGIN PGP SIGNED MESSAGE-----
	Hash: SHA1

	Format: 1.0
	Source: irssi-text
	Version: 0.8.9-3
	Binary: irssi-text
	Maintainer: David Pashley <david@davidpashley.com>
	Architecture: any
	Standards-Version: 3.6.1
	Build-Depends: libglib2.0-dev, perl (>= 5.8.1), libperl-dev (>= 5.8.1), 
	libncurses5-dev, debhelper (>= 3.0.18), libssl-dev, openssl, 
	autotools-dev
	Files: 
	 1df516a770656ff0bec0ab62f9096bf6 1153560 irssi-text_0.8.9.orig.tar.gz
	 37f128f0dafa596c006090a1036ec9b2 13944 irssi-text_0.8.9-3.diff.gz

	-----BEGIN PGP SIGNATURE-----
	Version: GnuPG v1.2.5 (GNU/Linux)

	iD8DBQFCQU0ffDt5cIjHwfcRAoApAKCL5BUc7i9X3iQIQyapUJboWF9IPACgrWPd
	/t+qP8OkRmh1e6mUH8wz+ic=
	=TYfB
	-----END PGP SIGNATURE-----

I file di control già visti nei pacchetti binari sono anche qui, contenuti nella cartella debian dell'archivio.

	# ls irssi-text-0.8.9
	AUTHORS      README.cygwin    config.sub      findsyntax.pl       ltmain.sh
	COPYING      TODO             configure       install-sh          missing
	ChangeLog    acconfig.h       configure.in    irssi-config.in     mkinstalldirs
	INSTALL      aclocal.m4       curses.m4       irssi-icon.png      scripts
	Makefile.am  autogen.sh       debian          irssi-version.h.in  src
	Makefile.in  colorless.theme  default.theme   irssi.conf          stamp-h.in
	NEWS         config.guess     docs            irssi.spec          stamp.h.in
	README       config.h.in      file2header.sh  irssi.spec.in       syntax.pl
	# ls irssi-text-0.8.9/debian
	botti.1    conffiles  copyright  irssi-text.postinst  prerm  undocumented
	changelog  control    dirs       menu                 rules

Nel caso si stia installando un pacchetto sorgente, è bene non seguire la procedura ./configure;make;make install; perchè il pacchetto non verrà tracciato, non si potrà prenderne informazioni tramite dpkg-query e per la rimozione bisognerà procedere manualmente, con il rischio di 'sporcare' la distro. È meglio usare strumenti quali dpkg-buildpackage e apt-build (per cui rimando alle pagine di man) per avere i vantaggi della compilazione senza 'sporcare' il sistema.

Metapacchetti

Cenni generali

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 (a volte a loro volta metapacchetti) che lo costituisce. Un esempio è il pacchetto kdebase:

	# ls -l
	total 6348
	-rw-r--r--  1 root root 6486276 Jan 26 17:32 kdebase_2.2.2-14.9_i386.deb

Già le dimensioni lasciano presagire qualcosa: come può un pacchetto come kdebase occupare solo poco più di 6 Mb? Spacchettiamolo:

	# ar -x  kdebase_2.2.2-14.9_i386.deb
	# ls
	control.tar.gz  data.tar.gz  debian-binary  kdebase_2.2.2-14.9_i386.deb
	# tar xvzf data.tar.gz
	./
	./usr/
	./usr/share/
	./usr/share/doc/
	./usr/share/doc/kdebase/
	./usr/share/doc/kdebase/README.pam
	./usr/share/doc/kdebase/README.Debian
	./usr/share/doc/kdebase/copyright
	./usr/share/doc/kdebase/README.gz
	./usr/share/doc/kdebase/changelog.Debian.gz
	./usr/share/doc/kde/
	./usr/share/doc/kde/HTML/
	./usr/share/doc/kde/HTML/en/
	./usr/share/doc/kde/HTML/en/kcontrol/
	./usr/share/doc/kde/HTML/en/kdebugdialog/
	./usr/share/doc/kde/HTML/en/kdesu/
	...

L'archivio data.tar.gz contiene solo documentazione e delle librerie. Diamo un'occhiata al control:

	station:/opt# tar xvzf control.tar.gz
	./
	./shlibs
	./postinst
	./preinst
	./prerm
	./postrm
	./conffiles
	./md5sums
	./control
	station:/opt# cat control
	Package: kdebase
	Version: 4:2.2.2-14.9
	Section: x11
	Priority: optional
	Architecture: i386
	Depends: kdelibs3 (>= 4:2.2.2-1), libc6 (>= 2.2.4-4), libfam0, 
	libjpeg62, libkonq3 (>= 4:2.2.2-14.9), libpng2(>=1.0.12), libqt2 (>= 
	3:2.3.1-1), libstdc++2.10-glibc2.2 (>= 1:2.95.4-0.010810), xlibs (>> 
	4.1.0), zlib1g (>= 1:1.1.4), debianutils (>= 1.6), xfree86-common, 
	libpam-modules, kdewallpapers, kdebase-libs (= 4:2.2.2-14.9)
	Recommends: kdebase-doc, konqueror, konsole, kate | kedit | kword, 
	libarts | libarts-alsa, kdebase-audiolibs | kdebase3-audiolibs, kscreensaver
	Suggests: menu (>=1.5-5), kdm | x-display-manager, kde-i18n, 
	libpam-cracklib, xscreensaver, xscreensaver-gl, xearth, xplanet, usbutils
	Provides: x-session-manager
	Installed-Size: 16280
	Maintainer: Christopher L Cheney <ccheney@debian.org>
	Description: KDE core applications
	 This is a suite of all kde core applications :
	 Includes:  kicker, kwin, kdesktop and others...

In realtà, vediamo che a costituire il cuore di KDE sono le sue dipendenze. Senza i metapacchetti bisognerebbe installare uno per uno i pacchetti che costituiscono KDE.

Lista dei metapacchetti

Si può ottenere una lista completa dei metapacchetti semplicemente elencando i pacchetti che contengono la parola metapackage nei tag o nelle descrizioni:

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

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

$ aptitude search '~i(~Gmetapackage|~dmetapackage)'

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 la sotto-architettura specificata. In tal modo, installando il pacchetto adatto al proprio sistema, il kernel verrà automaticamente aggiornato non appena sia disponibile una nuova versione (si passerà ad esempio dal 2.6.15 a 2.6.17). Viceversa, se non si installa il metapacchetto, il kernel non verrà mai aggiornato 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.

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

  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 (aptitude, apt-get, 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 purge nomemetapacchetto

dovremo dare 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 dunque con apt-get:

# apt-get purge evolution

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:

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

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

Link

Per una panoramica completa sulle funzionalità e sull'utilizzo del sistema APT vedere:



Autore: Keltik