[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


248. Accorgimenti per una distribuzione Debian

In generale, la distribuzione GNU/Linux Debian non ha bisogno di accorgimenti particolari. In questo capitolo vengono annotate poche cose; in particolare sul modo di gestire una raccolta degli archivi Debian, e sulla possibilità di realizzare una copia personalizzata della distribuzione.

248.1 Raccogliere gli aggiornamenti

La distribuzione Debian, data la sua natura collaborativa, è molto dinamica, e tra una versione e l'altra, vengono prodotti una grande quantità di pacchetti aggiornati. Data la dimensione che ha raggiunto ormai la distribuzione, è improbabile che si riesca ad avere sempre una copia completa della distribuzione; piuttosto è facile trovare nelle riviste dei CD-ROM con questo o quel gruppo di applicativi, più o meno aggiornati. Volendo realizzare una propria copia locale della distribuzione (su disco fisso, o su dischi rimovibili), occorre realizzare qualche script per gestire un po' meglio la cosa.

248.1.1 Composizione del nome degli archivi Debian

Il nome degli archivi Debian è organizzato secondo la struttura seguente:

<nome-del-pacchetto>_<versione-e-revisione>.deb

Per essere precisi, questo è il nome normale, da utilizzare quando si conosce a quale architettura è destinato, in base alla directory in cui si trova a essere conservato.

Alle volte, per qualche ragione, il nome degli archivi che si trovano in circolazione non è conforme a questo modello; tuttavia, con l'aiuto delle informazioni contenute negli archivi stessi, è possibile riprodurre il nome standard. I comandi seguenti, che utilizzano `dpkg', permettono di ottenere le informazioni necessarie a ricostruire il nome di un archivio Debian:

dpkg --field <archivio> package

restituisce il nome del pacchetto;

dpkg --field <archivio> version

Restituisce la stringa che rappresenta la versione e la revisione del pacchetto.

Quello che segue è l'esempio di uno script in grado di scandire gli archivi contenuti nella directory corrente, allo scopo di modificarne il nome se questo non corrisponde al modello standard. La scansione viene fatta in due fasi, per verificare alla fine quali archivi non sono stati corretti.

#!/bin/bash
#=======================================================================
# debian-nomi
#
# Interviene nella directory *corrente* correggendo i nomi degli
# archivi che sembrano non essere coerenti. Si utilizza in particolare:
#
#       dpkg --field <archivio> package
#       dpkg --field <archivio> version
#
#=======================================================================

#-----------------------------------------------------------------------
# Inizializza le variabili di ambiente che servono per accumulare
# i valori per il confronto.
#-----------------------------------------------------------------------
ARCHIVIO=""
PACCHETTO=""
VERSIONE=""
NOME_CORRETTO=""

#----------------------------------------------------------------------
# Inizia il ciclo di scansione degli archivi Debian che si trovano
# nella directory corrente.
# Prima fase silenziosa.
#----------------------------------------------------------------------
for ARCHIVIO in *.deb
do
    #------------------------------------------------------------------
    # Se il nome è «*.deb», non ci sono file del genere.
    #------------------------------------------------------------------
    if [ "$ARCHIVIO" = "*.deb" ]
    then
	#--------------------------------------------------------------
	# Non si fa nulla.
	#--------------------------------------------------------------
	exit
    fi

    #------------------------------------------------------------------
    # Estrae il nome del pacchetto.
    #------------------------------------------------------------------
    PACCHETTO=`dpkg --field $ARCHIVIO package`

    #------------------------------------------------------------------
    # Estrae la versione del pacchetto.
    #------------------------------------------------------------------
    VERSIONE=`dpkg --field $ARCHIVIO version`

    #------------------------------------------------------------------
    # Compone il nome teorico.
    #------------------------------------------------------------------
    NOME_CORRETTO="${PACCHETTO}_${VERSIONE}.deb"

    #------------------------------------------------------------------
    # Confronta con il nome dell'archivio.
    #------------------------------------------------------------------
    if [ "$NOME_CORRETTO" != "$ARCHIVIO" ]
    then
	#--------------------------------------------------------------
	# I nomi sono differenti.
	# Modifica il nome solo se è possibile.
	#--------------------------------------------------------------
	echo "n" | mv -i "$ARCHIVIO" "$NOME_CORRETTO" 2> /dev/null
    fi
done

#----------------------------------------------------------------------
# Inizia il ciclo di scansione degli archivi Debian che si trovano
# nella directory corrente.
# Seconda fase di verifica.
#----------------------------------------------------------------------
for ARCHIVIO in *.deb
do
    #------------------------------------------------------------------
    # Estrae il nome del pacchetto.
    #------------------------------------------------------------------
    PACCHETTO=`dpkg --field $ARCHIVIO package`

    #------------------------------------------------------------------
    # Estrae la versione del pacchetto.
    #------------------------------------------------------------------
    VERSIONE=`dpkg --field $ARCHIVIO version`

    #------------------------------------------------------------------
    # Compone il nome teorico.
    #------------------------------------------------------------------
    NOME_CORRETTO="${PACCHETTO}_${VERSIONE}.deb"

    #------------------------------------------------------------------
    # Confronta con il nome dell'archivio.
    #------------------------------------------------------------------
    if [ "$NOME_CORRETTO" != "$ARCHIVIO" ]
    then
	#--------------------------------------------------------------
	# A quanto pare, il nome di questo archivio non è stato
	# corretto.
	#--------------------------------------------------------------
	echo "Non è stato possibile correggere il nome dell'archivio"
	echo "$ARCHIVIO, che dovrebbe chiamarsi $NOME_CORRETTO."
	echo
    fi
done

#=======================================================================

248.1.2 Eliminazione delle versioni precedenti

La versione di un pacchetto è composta da due parti: la versione vera e propria, e la revisione. Si tratta di due stringhe unite da un trattino:

<versione>-<revisione>

In generale, non è facile confrontare questi valori, e per fortuna viene in aiuto `dpkg' che è in grado di affermare quale sia più recente. In pratica, si utilizza uno dei comandi seguenti,

dpkg --compare-versions <versione1> gt <versione2>

dpkg --compare-versions <versione1> lt <versione2>

dpkg --compare-versions <versione1> eq <versione2>

per determinare se una versione è maggiore, minore o uguale all'altra. Lo script seguente serve a scandire gli archivi Debian contenuti nella directory corrente, allo scopo di eliminare quelli che contengono uno stesso pacchetto ma di una versione precedente a quanto già disponibile. Durante la scansione, si presume che i nomi degli archivi siano composti nel modo corretto, in modo tale che gli archivi di uno stesso pacchetto si trovino di seguito, nella sequenza alfabetica.

#!/bin/bash
#=======================================================================
# debian-doppi
#
# Interviene nella directory *corrente* eliminando i file doppi,
# più vecchi. Il confronto viene fatto utilizzando:
#
#       dpkg --field <archivio> package
#       dpkg --field <archivio> version
#	dpkg --compare-versions <versione1> eq <versione0>
#	dpkg --compare-versions <versione1> gt <versione0>
#	dpkg --compare-versions <versione1> lt <versione0>
#
#=======================================================================

#-----------------------------------------------------------------------
# Inizializza le variabili di ambiente che servono per accumulare
# i valori per il confronto.
#-----------------------------------------------------------------------
ARCHIVIO0=""
ARCHIVIO1=""
PACCHETTO0=""
PACCHETTO1=""
VERSIONE0=""
VERSIONE1=""

#----------------------------------------------------------------------
# Inizia il ciclo di scansione degli archivi Debian che si trovano
# nella directory corrente.
#----------------------------------------------------------------------
for ARCHIVIO1 in *.deb
do
    #------------------------------------------------------------------
    # Se il nome è «*.deb», non ci sono file del genere.
    #------------------------------------------------------------------
    if [ "$ARCHIVIO1" = "*.deb" ]
    then
	#--------------------------------------------------------------
	# Non si fa nulla.
	#--------------------------------------------------------------
	exit
    fi

    #------------------------------------------------------------------
    # Estrae il nome del pacchetto.
    #------------------------------------------------------------------
    PACCHETTO1=`dpkg --field $ARCHIVIO1 package`

    #------------------------------------------------------------------
    # Estrae la versione del pacchetto.
    #------------------------------------------------------------------
    VERSIONE1=`dpkg --field $ARCHIVIO1 version`

    #------------------------------------------------------------------
    # Confronta con il pacchetto precedente.
    #------------------------------------------------------------------
    if [ "$PACCHETTO1" == "$PACCHETTO0" ]
    then
	if dpkg --compare-versions "$VERSIONE1" eq "$VERSIONE0"
	then
	    #----------------------------------------------------------
	    # Si tratta di un'anomalia in cui si deve intervenire a
	    # mano.
	    #----------------------------------------------------------
	    echo "Gli archivi seguenti hanno la stessa versione:"
	    echo "    $ARCHIVIO0"
	    echo "    $ARCHIVIO1"
	    echo

	    #----------------------------------------------------------
	    # In questo caso, non occorre spostare i valori nelle
	    # variabili.
	    #----------------------------------------------------------
	    
	elif dpkg --compare-versions "$VERSIONE1" gt "$VERSIONE0"
	then
	    #----------------------------------------------------------
	    # Si elimina l'archivio del pacchetto più vecchio.
	    #----------------------------------------------------------
	    rm -f "$ARCHIVIO0"
	    echo "Eliminato $ARCHIVIO0"

	    #----------------------------------------------------------
	    # Sposta i valori nelle variabili.
	    #----------------------------------------------------------
	    ARCHIVIO0="$ARCHIVIO1"
	    PACCHETTO0="$PACCHETTO1"
	    VERSIONE0="$VERSIONE1"

	elif dpkg --compare-versions "$VERSIONE1" lt "$VERSIONE0"
	then
	    #----------------------------------------------------------
	    # Si elimina l'archivio del pacchetto più vecchio.
	    #----------------------------------------------------------
	    rm -f "$ARCHIVIO1"
	    echo "Eliminato $ARCHIVIO1"

	    #----------------------------------------------------------
	    # In questo caso, non occorre spostare i valori nelle
	    # variabili.
	    #----------------------------------------------------------

	else
	    #----------------------------------------------------------
	    # Questo caso non dovrebbe verificarsi.
	    #----------------------------------------------------------
	    echo "C'è un errore nel confronto degli archivi seguenti:"
	    echo "    $ARCHIVIO0"
	    echo "    $ARCHIVIO1"
	    echo

	    #----------------------------------------------------------
	    # In questo caso, non occorre spostare i valori nelle
	    # variabili.
	    #----------------------------------------------------------
	fi

    else
	#--------------------------------------------------------------
	# Dal momento che i pacchetti sono differenti, si devono
	# salvare le variabili prima di procedere.
	#--------------------------------------------------------------
	ARCHIVIO0="$ARCHIVIO1"
	PACCHETTO0="$PACCHETTO1"
	VERSIONE0="$VERSIONE1"
    fi
done

#=======================================================================

248.2 Realizzazione di una copia personale della distribuzione

Per comprendere come realizzare una copia locale della distribuzione GNU/Linux Debian, occorre andare per gradi, partendo dal caso in cui questa è disponibile completamente in un supporto unico, per poi arrivare a comprendere le differenze che si devono introdurre per ottenere una versione distribuita su più supporti.

248.2.1 Distribuzione completa su un supporto unico

Si suppone che l'utente `tizio' voglia predisporre una copia locale della distribuzione Debian, a partire dalla directory `/home/tizio/DEBIAN/'. La struttura minima che dovrebbe articolarsi a partire da questa directory dovrebbe essere quella che si vede nella figura 248.1.

debian/
  |
  +-- dists/
  |     |
  |     +-- stable --> ../<codename>
  |     |
  |     `-- <codename>/
  |           |
  |           +-- main/
  |           |     |
  |           |     +-- disks-<arch>/
  |           |     |     |
  |           |     |     `-- current/
  |           |     |
  |           |     `-- binary-<arch>/
  |           |           |
  |           |           +-- Packages
  |           |           |
  |           |           +-- Packages.gz
  |           |           |
  |           |           +-- admin/
  |           |           |
  |           |           +-- base/
  |           |           |
  |           |           +-- comm/
  |           |           :
  |           |           :
  |           |           
  |           +-- contrib/
  |           |     |
  |           |     `-- binary-<arch>/
  |           |           |
  |           |           +-- Packages
  |           |           |
  |           |           +-- Packages.gz
  |           |           :
  |           |           :
  |           |           
  |           +-- non-free/
  |           |     :      
  |           |     :      
  |           |           
  |           +-- non-US/
  |           |     :      
  |           |     :      
  |           |           
  |           `-- local/
  |                 :      
  |                 :      
  |
  `-- indices/
        |
	`-- override.gz

Figura 248.1: Struttura minima di una distribuzione GNU/Linux Debian organizzata in modo da utilizzare un supporto unico.

In breve, viene descritto il senso di questa struttura.

Il problema nella riproduzione di una distribuzione Debian sta nella creazione dei file `Packages' (e di conseguenza anche `Packages.gz'). Per arrivare a questo risultato, occorre definire una stringa che serva a individuare la distribuzione, per esempio

Debian GNU/Linux 2.1 slink personalizzata

inoltre occorre un file override (`debian/indices/override.gz' o un altro nome simile), contenente l'abbinamento tra i pacchetti, la priorità e la classificazione in sezioni, come nell'estratto seguente,

at		important	admin
cron		important	admin
locales		standard	admin
ncurses-term	standard	admin
acct		optional	admin
adjtimex	optional	admin
    ...
adduser		required	base
ae		required	base
amiga-fdisk     required        base
    ...
lilo		important	base
silo            important       base
    ...
newt0.25	optional	base
ppp		optional	base
pppconfig       optional        base
syslinux	optional	base
    ...

e infine occorrono i pacchetti, che si trovano lì dove sono. I file override vanno prelevati da una delle varie riproduzioni speculari, tenendo presente che possono essere aggiornati frequentemente. Di solito, questi file sono suddivisi in base ai raggruppamenti principali in cui si articola una versione: `main', `contrib',... Per semplificare le operazioni, può convenire la realizzazione di un file unico, come è stato mostrato nella struttura di esempio. A questo file si farà riferimento come `override.gz'. *1*

Disponendo di questo materiale, si può utilizzare `dpkg-scanpackages' per rigenerare i file `Packages'. Eventualmente si può vedere la pagina di manuale dpkg-scanpackages(8).

tizio$ cd /home/tizio/DEBIAN/debian

Ci si posiziona nella directory principale della distribuzione.

tizio$ dpkg-scanpackages -m "Debian GNU/Linux 2.1 slink personalizzata" (segue)
  dists/stable/main/binary-i386 indices/override.gz (segue)
  > dists/stable/main/binary-i386/Packages

Si genera il file `Packages' per il gruppo di pacchetti della classificazione `main' (il comando è stato mostrato suddiviso su più righe per motivi tipografici).

tizio$ cat dists/stable/main/binary-i386/Packages (segue)
  | gzip | dists/stable/main/binary-i386/Packages.gz

Si genera il file `Packages.gz', comprimendo `Packages' creato precedentemente.

In seguito, si fa la stessa cosa per i raggruppamenti `contrib', `non-free', `non-US' e `local'.

Anche se alcuni di questi raggruppamenti non vengono utilizzati, nel senso che non si vogliono tenere pacchetti che vi appartengano, è molto importante che siano predisposte le directory vuote, e anche i file `Packages*', per facilitare le operazioni con Dselect e APT.

`dpkg-scanpackages' può generare delle segnalazioni di errore, in particolare quando trova un pacchetto che non è indicato nel file override. In generale questo non provoca conseguenze gravi, tranne la mancanza di qualche informazione per quel pacchetto.

L'esempio seguente è un estratto di uno dei file `Packages', dove si vede la descrizione del pacchetto `wget'. Si deve osservare in particolare che le informazioni dei campi `Priority' e `Section' sono state determinate in base al file override, mentre la descrizione del campo `X-Medium' è stata ottenuta dall'opzione `-m' di `dpkg-scanpackages'.

Package: wget
Version: 1.5.3-1.1
Priority: optional
Section: web
Maintainer: Nicolás Lichtmaier <nick@feedback.net.ar>
Depends: libc6
Architecture: i386
Filename: dists/stable/main/binary-i386/wget_1.5.3-1.1.deb
Size: 221932
MD5sum: 323962a35dabbf88edfe665ad70eb382
Description: utility to retrieve files from the WWW via HTTP and FTP
 Wget [formerly known as Geturl] is a freely available network utility
 to retrieve files from the World Wide Web using HTTP and FTP, the two
 most widely used Internet protocols.  It works non-interactively, thus
 enabling work in the background, after having logged off.
 .
 The recursive retrieval of HTML pages, as well as FTP sites is
 supported -- you can use Wget to make mirrors of archives and home
 pages, or traverse the web like a WWW robot (Wget understands
 /robots.txt).
installed-size: 535
X-Medium: Debian GNU/Linux 2.1 slink personalizzata

Per accedere facilmente a questa distribuzione locale, basta configurare APT attraverso il file `/etc/apt/sources.list':

deb file:/home/tizio/DEBIAN/debian stable main contrib non-free non-US local

Se le dimensioni lo consentono, si può trasferire una copia della gerarchia `/home/tizio/DEBIAN/' in un disco rimovibile, o in un CD-ROM.

248.2.2 Distribuzione suddivisa su diversi supporti

Se si vuole masterizzare un CD-R, o comunque si vuole fare una copia della distribuzione suddividendola in più supporti, le cose si complicano. Per prima cosa si deve iniziare da una copia locale organizzata già nelle suddivisioni che si vogliono ottenere. Supponendo di partire dalla directory `/home/tizio/DEBIAN/', conviene aggiungere altre sottodirectory ulteriori, una per ogni suddivisione che si vuole ottenere: `1/', `2/',...

La struttura della gerarchia che si articola a partire da queste sottodirectory deve essere la stessa, anche quando alcuni gruppi di pacchetti (`main', `contrib', ecc.) risultano senza archivi. La figura 248.2 mostra le varianti rispetto al modello già mostrato.

debian/
  |
  +-- .disk/
  |     |
  |     `-- info
  |
  +-- local/
  |     |
  |     `-- local --> ../stable/local
  |
  +-- dists/
  |     |
  |     +-- stable --> ../<codename>
  |     |
  |     `-- <codename>/
  |           |
  |           +-- main/
  |           |     |
  |           |     +-- disks-<arch>/
  |           |     |     |
  |           |     |     `-- current/
  |           |     |
  |           |     `-- binary-<arch>/
  |           |           |
  |           |           +-- Packages
  |           |           |
  |           |           +-- Packages.gz
  |           |           |
  |           |           +-- Packages.cd
  |           |           |
  |           |           +-- Packages.cd.gz
  |           |           :
  |           |
  |           +-- contrib/
  |           |     :
  |           |           
  |           +-- non-free/
  |           |     :
  |           |           
  |           +-- non-US/
  |           |     :
  |           |           
  |           `-- local/
  |                 :
  |
  `-- indices/
        |
	`-- override.gz

Figura 248.2: Struttura minima di una distribuzione GNU/Linux Debian organizzata in modo da utilizzare più supporti.

Rispetto alla situazione precedente, si aggiunge il file `debian/.disk/info', che deve contenere la stringa di descrizione del supporto, una cosa del tipo

Debian GNU/Linux 2.1 slink personalizzata disco 1

oppure

Debian GNU/Linux 2.1 slink personalizzata disco 2

ecc., mentre nelle directory `debian/dists/stable/*/binary-i386/' appaiono dei file nuovi: `Packages.cd' e `Packages.cd.gz'. Infine, il raggruppamento di pacchetti `local', dovrebbe trovarsi nella directory `debian/dists/local/local/'. Probabilmente, conviene realizzare un collegamento simbolico per portarlo nella collocazione normale.

I supporti distinti, vengono riconosciuti in base alla stringa contenuta nel file `debian/.disk/info', che va scelta opportunamente, e va utilizzata anche per la definizione del campo `X-Medium'.

Si comincia dalla preparazione dei file `Packages' e `Packages.gz', più o meno come è stato fatto nella situazione precedente:

tizio$ cd /home/tizio/DEBIAN/1/debian

tizio$ dpkg-scanpackages -m `cat .disk/info` (segue)
  dists/stable/main/binary-i386 indices/override.gz (segue)
  > dists/stable/main/binary-i386/Packages

tizio$ cat dists/stable/main/binary-i386/Packages (segue)
  | gzip | dists/stable/main/binary-i386/Packages.gz

Come prima, si fa la stessa cosa per gli altri gruppi di pacchetti, e poi si ripete la stessa cosa per la copia contenuta nella directory `/home/tizio/DEBIAN/2/' (si suppone che si tratti di una suddivisione in due soli supporti):

tizio$ cd /home/tizio/DEBIAN/2/debian

tizio$ dpkg-scanpackages -m `cat .disk/info` (segue)
  dists/stable/main/binary-i386 indices/override.gz (segue)
  > dists/stable/main/binary-i386/Packages

tizio$ cat dists/stable/main/binary-i386/Packages (segue)
  | gzip | dists/stable/main/binary-i386/Packages.gz

Alla fine, si devono realizzare i file `Packages.cd', che non sono altro che la somma dei file `Packages' di ogni gruppo:

tizio$ cd /home/tizio/DEBIAN/

tizio$ cat 1/debian/dists/stable/main/binary-i386/Packages (segue)
  2/debian/dists/stable/main/binary-i386/Packages (segue)
  > 1/debian/dists/stable/main/binary-i386/Packages.cd

tizio$ cat 1/debian/dists/stable/main/binary-i386/Packages (segue)
  2/debian/dists/stable/main/binary-i386/Packages (segue)
  > 2/debian/dists/stable/main/binary-i386/Packages.cd

tizio$ cat 1/debian/dists/stable/main/binary-i386/Packages.cd (segue)
  | gzip | 1/debian/dists/stable/main/binary-i386/Packages.cd.gz

tizio$ cat 2/debian/dists/stable/main/binary-i386/Packages.cd (segue)
  | gzip | 2/debian/dists/stable/main/binary-i386/Packages.cd.gz

In pratica, i file `Packages.cd' contengono le informazioni su tutti i pacchetti del proprio gruppo; sia quelli presenti effettivamente nel supporto che quelli che si trovano negli altri. I programmi come Dselect distingueranno il supporto in base al nome che gli è stato attribuito, indicato nel file `debian/.disk/info' e riportato nel campo `X-Medium' dei file `Packages.cd*'.

Per accedere facilmente a questa distribuzione locale, spezzata in due o più parti, basta configurare APT attraverso il file `/etc/apt/sources.list':

deb file:/home/tizio/DEBIAN/1/debian stable main contrib non-free non-US local
deb file:/home/tizio/DEBIAN/2/debian stable main contrib non-free non-US local
# ...

Per copiare le due strutture in dischi separati, basta trasferire una copia delle gerarchie `/home/tizio/DEBIAN/*/'.

248.3 Riferimenti

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


1.) I file override originali della distribuzione `slink' hanno i nomi: `override.slink.gz', `override.slink.contrib.gz', `override.slink.non-free.gz' e `override.slink.non-US.gz'. Per realizzare la propria copia della distribuzione, nulla vieta di fonderli tutti assieme in un file unico, come descritto in questi esempi, dove si fa riferimento a un solo file `override.gz'.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]