[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 178.   Archiviazione e compressione

L'archiviazione e la compressione sono le fasi attraverso le quali si realizzano delle copie di sicurezza, oppure si preparano i dati prima di una trasmissione. La tabella 178.1 elenca i programmi a cui si accenna in questo capitolo.

Tabella 178.1. Riepilogo dei programmi più comuni per l'archiviazione e la compressione di file e directory.

Programma Descrizione
cpio Archivia e recupera.
tar Archivia e recupera.
gzip Comprime e decomprime.
bzip2 Comprime e decomprime.
upx Comprime e decomprime i file eseguibili.
unp Programma frontale che si avvale di altri programmi per facilitare l'estrazione di file compressi.
ucat Programma frontale che si avvale di altri programmi per facilitare la lettura di file compressi.

178.1   Archiviazione

L'archiviazione è quel procedimento con cui si impacchettano file o rami di directory in modo da facilitarne la conservazione all'interno di unità di memorizzazione senza file system. Per lo stesso motivo, l'archiviazione è il modo con cui si possono trasferire agevolmente i dati attraverso piattaforme differenti.

L'archiviazione pura e semplice non ottiene alcun risparmio nello spazio utilizzato dai dati. Per questo si utilizza la compressione che permette di ridurre questo utilizzo.

L'archiviazione pura e semplice è ottenuta normalmente attraverso il programma tar o il programma cpio. Questi due sono equivalenti, almeno a livello teorico. In pratica, è l'utilizzatore che sceglie quello che per qualche motivo gli è più simpatico, specializzandosi nell'uso delle sue opzioni particolari.

Questo argomento viene ripreso anche nel capitolo dedicato alle copie di sicurezza (679).

178.1.1   Utilizzo di Cpio

Il programma di servizio cpio (1) copia file da e verso archivi cpio o tar:

cpio -o [opzioni] [< elenco_nomi] [> archivio]
cpio -i [opzioni] [modello] [< archivio]
cpio -p [opzioni] directory_di_destinazione [< elenco_nomi]

L'archivio può essere un file su disco, un nastro magnetico o il flusso di un condotto. Le tre sintassi indicate rappresentano le tre modalità operative del comando.

Si può consultare il documento info cpio, oppure la pagina di manuale cpio(1) per maggiori dettagli sull'uso di questo programma.

Tabella 178.2. Alcune opzioni per il «copy-out».

Opzione Descrizione
-o
--create
Funziona in modalità copy-out.
-A
--append
Aggiunge dati a un archivio esistente che deve essere specificato con l'opzione -O.
-L
--dereference
Quando incontra dei collegamenti simbolici, copia i file a cui questi puntano, invece di copiare semplicemente i collegamenti.
-O nome_archivio
Specifica il nome dell'archivio da creare o incrementare, invece di utilizzare lo standard output.

Tabella 178.3. Alcune opzioni per il «copy-in».

Opzione Descrizione
-i
--extract
Funziona in modalità copy-in.
-d
--make-directories
Crea le directory necessarie.
-E file
--pattern-file=file
Legge il modello che esprime i nomi dei file da estrarre, o l'elenco dei nomi stessi, dal file indicato come argomento dell'opzione.
-f
--nomatching
Copia soltanto i file che non corrispondono al modello indicato.
-I archivio
Permette di specificare il nome dell'archivio da usare, invece di riceverlo dallo standard input.
-t
--list
Elenca il contenuto dell'archivio.

Tabella 178.4. Alcune opzioni per il «copy-pass».

Opzione Descrizione
-p
--pass-through
Funziona in modalità copy-pass.
-d
--make-directories
Crea le directory necessarie.
-l
--link
Se possibile, crea dei collegamenti invece di copiare i file.
-L
--dereference
Quando incontra dei collegamenti simbolici, copia i file a cui questi puntano, invece di copiare semplicemente i collegamenti.

Segue la descrizione di alcuni esempi:

178.1.2   Utilizzo di Tar

Il programma di servizio tar (2) (Tape archive) è un programma di archiviazione nato originariamente per essere usato con i nastri:

tar opzione_di_funzionamento [opzioni] file...

Il primo argomento deve essere una delle opzioni che ne definisce il funzionamento. Alla fine della riga di comando vengono indicati i nomi dei file o delle directory da archiviare. Se non viene specificato diversamente con le opzioni, l'archivio viene emesso attraverso lo standard output.

Il tar tradizionale ammette l'uso di opzioni senza il trattino anteriore (-) consueto. Questa tradizione è stata mantenuta anche nel tar GNU a cui si vuole fare riferimento qui, ma tale forma deve essere usata consapevolmente e con prudenza. Negli esempi viene mostrato in che modo potrebbero essere usate tali opzioni senza trattino.

Per la descrizione completa di questo programma, conviene consultare il documento info tar, oppure la pagina di manuale tar(1).

Tabella 178.5. Opzioni di funzionamento per rappresentare l'operazione da compiere. Di queste, può e deve esserne utilizzata una sola. Di solito, data la loro importanza, queste opzioni appaiono all'inizio degli argomenti di tar.

Opzione Descrizione
A
-A
--catenate
--concatenate
Aggiunge dei file tar a un archivio già esistente.
c
-c
--create
Crea un nuovo archivio.
d
-d
--diff
--compare
Trova le differenze tra l'archivio e i file esistenti effettivamente.
--delete
Cancella dall'archivio i file indicati. Non può essere usato per un archivio su nastro.
r
-r
--append
Aggiunge dati a un archivio già esistente.
t
-t
--list
Elenca il contenuto di un archivio.
u
-u
--update
Aggiunge solo i file più recenti rispetto a quanto già contenuto nell'archivio.
x
-x
--extract
--get
Estrae i file da un archivio.

Tabella 178.6. Altre opzioni.

Opzione Descrizione
--atime-preserve
Fa in modo che la data di accesso dei file che vengono archiviati non venga modificata.
-f file
--file=file
Emette l'archivio nel file o nel dispositivo. Se si tratta di un file normale, questo viene creato.
-h
--dereference
Non copia i collegamenti simbolici, ma i file a cui questi fanno riferimento.
-k
--keep-old-files
In fase di estrazione da un archivio, non sovrascrive i file eventualmente già esistenti.
-l
--one-file-system
Quando viene creato un archivio, resta in un solo file system: quello di partenza.
-L Kibyte
--tape-length=Kibyte
Definisce la dimensione massima dei vari segmenti di copia multivolume.
-m
--modification-time
In fase di estrazione da un archivio, non viene ripristinata la data di modifica dei file.
-M
--multi-volume
Permette di creare, elencare o estrarre, un archivio multivolume.
-N data
--after-date=data
--newer data
Archivia solo i file la cui data è più recente di quella indicata come argomento.
-O
--to-stdout
Estrae i file emettendoli attraverso lo standard output.
-p
--same-permissions
--preserve-permissions
Estrae tutti i permessi associati ai file. Se non viene usata questa opzione, i file ottengono i permessi predefiniti, anche in funzione della maschera dei permessi dell'utente che esegue l'operazione.
-P
--absolute-path
Estrae i file utilizzando i percorsi assoluti, cioè senza eliminare la prima barra (/) che appare nei nomi di percorso (pathname).
--remove-files
In fase di creazione di un nuovo archivio, elimina i file archiviati.
--same-owner
Durante l'estrazione da un archivio, assegna ai file estratti gli utenti e i gruppi proprietari originali.
-v
--verbose
Elenca i file che vengono elaborati.
-W
--verify
Cerca di verificare la validità dell'archivio dopo averlo creato.
-Z
--compress
--uncompress
Filtra l'archivio attraverso il programma di compressione compress.
-z
--gzip
--ungzip
Filtra l'archivio attraverso il programma di compressione gzip.
-j
--bzip2
Filtra l'archivio attraverso il programma di compressione bzip2 (sia per la compressione che per l'estrazione).
--use-compress-program prog
Filtra l'archivio attraverso il programma di compressione indicato nell'argomento. Questo programma di compressione deve riconoscere l'opzione -d, come fa gzip, allo scopo di decomprimere i dati.

Segue la descrizione di alcuni esempi.

178.2   Compressione

La compressione dei dati è una tecnica che consente di risparmiare senza perdere informazioni. L'operazione avviene di norma in modo sequenziale, per cui può essere gestita attraverso dei programmi filtro, che alle volte permettono di rendere trasparente l'operazione. Data la facilità con cui nei sistemi Unix si possono combinare assieme delle tecniche di questo genere, in tali ambienti si tende a preferire l'archiviazione seguita da una compressione complessiva.

178.2.1   Utilizzo di «gzip», «gunzip» e «zcat»

Il programma di servizio gzip (3) viene usato per comprimere o decomprimere ogni file indicato negli argomenti:

gzip [opzioni] [file...]
gunzip [opzioni] [file...]
zcat [opzioni] [file...]

Il programma gzip è in grado di comprimere solo file normali, in modo singolo: per ogni file ne viene generato un altro con l'estensione .gz o un'altra se specificato diversamente con le opzioni. Se non viene indicato alcun file o se si utilizza espressamente un trattino isolato (-), lo standard input viene compresso e il risultato viene emesso attraverso lo standard output.

Il nome gunzip è un collegamento a gzip. Se gzip viene avviato con il nome gunzip si comporta come se fosse stata utilizzata l'opzione -d.

Il nome zcat è un collegamento a gzip. Se gzip viene avviato con il nome zcat si comporta come se fossero state utilizzate simultaneamente le opzioni -d e -c. In alcuni sistemi, invece di zcat potrebbe essere presente il collegamento gzcat.

Si può consultare il documento info gzip, oppure la pagina di manuale gzip(1) per maggiori dettagli sull'uso di questo programma.

Tabella 178.7. Alcune opzioni.

Opzione Descrizione
-c
--stdout
--to-stdout
Emette il risultato attraverso lo standard output. Il programma utilizza automaticamente questa opzione quando viene eseguito con il nome zcat.
-d
--decompress
--uncompress
Decomprime un file compresso. Il programma utilizza automaticamente questa opzione quando viene eseguito con il nome gunzip.
-r
--recursive
Se tra i nomi indicati nella riga di comando appaiono delle directory, vengono compressi o decompressi tutti i file in esse contenuti.
-t
--test
Controlla l'integrità dei file compressi.
-1
-2
-3
-4
-5
-6
-7
-8
-9
Permette di definire il livello di compressione: -1 rappresenta la compressione minima, che in compenso richiede meno elaborazione; -9 rappresenta la compressione massima, a scapito del tempo di elaborazione. Se non viene specificata questa opzione, si utilizza un livello intermedio, corrispondente a -6.

Segue la descrizione di alcuni esempi:

178.2.2   Utilizzo di «bzip2» e «bunzip2»

Il programma di servizio bzip2 (4) è un programma di compressione funzionalmente analogo a gzip, nel senso che viene creato un file compresso per ogni file indicato negli argomenti:

bzip2 [opzioni] [file...]
bunzip2 [opzioni] [file...]

Il programma bzip2, come gzip, è in grado di comprimere solo file normali, in modo singolo, dove per ogni file ne viene generato un altro con l'estensione .bz2. Se non viene indicato alcun file o se si utilizza espressamente un solo trattino isolato (-), lo standard input viene compresso e il risultato viene emesso attraverso lo standard output.

Il programma bzip2 utilizza un algoritmo di compressione differente, rispetto a gzip, con un carico di elaborazione maggiore, che diventa efficace solo in presenza di file di grandi dimensioni. In generale, per garantire la massima portabilità di un archivio compresso, conviene utilizzare gzip, salvo quando le dimensioni dell'archivio sono tali da rendere realmente conveniente l'utilizzo di bzip2.

La sintassi di bzip2 è molto simile a quella di gzip, anche se non è del tutto identica. Prima di decidere di utilizzare bzip2 per archiviare i propri dati, conviene leggere la documentazione originale: il documento info bzip2, oppure la pagina di manuale bzip2(1), in modo da poter valutare correttamente.

Il nome bunzip2 è un collegamento a bzip2, il quale, se avviato con questo nome, utilizza implicitamente l'opzione -d per decomprimere i file indicati alla fine della riga di comando.

Tabella 178.8. Alcune opzioni.

Opzione Descrizione
-c
--stdout
Comprime o decomprime emettendo il risultato attraverso lo standard output. La decompressione ammette l'emissione di più file, mentre in caso di compressione, se ne può emettere solo uno.
-d
--decompress
Forza la modalità di decompressione dei dati. Questo è il comportamento predefinito, quando il programma viene eseguito con il nome bunzip2.
-f
--compress
Forza la modalità di compressione dei dati. Serve a imporre la compressione, indipendentemente dal nome utilizzato per avviare bzip2.
-t
--test
Controlla l'integrità dei file compressi.
-1
-2
-3
-4
-5
-6
-7
-8
-9
Permette di definire il livello di compressione: -1 rappresenta la compressione minima, che in compenso richiede blocchi più piccoli (100 Kibyte) e meno elaborazione; -9 rappresenta la compressione massima, a scapito della dimensione dei blocchi che aumenta in modo considerevole (900 Kibyte) e del tempo di elaborazione.

178.2.3   Copie di sicurezza

Quello che segue è l'esempio di uno script molto semplice per l'archiviazione di una serie di file e directory attraverso la coppia tar e gzip.

#!/bin/sh
###
### salva DIRECTORY_DI_DESTINAZIONE  < ELENCO
###
### Archiviazione di tutti i file e directory indicati attraverso lo
### standard input, utilizzando <directory-di-destinazione> come luogo
### di destinazione degli archivi.
###
### Gli archivi vengono generati in formato .tgz, cioè tar+gzip.
###
##
## Variabili.
##
#
# L'elenco dei file e delle directory da archiviare proviene dallo
# standard input.
#
ELENCO_DA_ARCHIVIARE=`cat`
#
# Directory di destinazione.
#
DESTINAZIONE=$1
##
## Funzioni.
##
#
# Visualizza la sintassi corretta per l'utilizzo di questo script.
#
function sintassi () {
    echo ""
    echo "cat elenco | $0 <directory-di-destinazione>"
    echo ""
}
##
## Inizio.
##
#
# Verifica la quantità di argomenti.
#
if [ $# != 1 ]
then
    #
    # La quantità di argomenti è errata. Richiama la funzione
    # «sintassi» e termina l'esecuzione dello script restituendo
    # un valore corrispondente a «falso».
    #
    sintassi
    exit 1
fi
#
# Verifica se esiste la directory di destinazione.
#
if [ -e $DESTINAZIONE ]
then
    #
    # Qualcosa con quel nome esiste già.
    # Si deve verificare che si tratti di una directory.
    #
    if [ ! -d $DESTINAZIONE ]
    then
        #
        # Non si tratta di una directory.
        #
        echo "Non è possibile procedere con l'archiviazione"
        echo "perché $DESTINAZIONE esiste e non è una directory."
        #
        # Lo script termina restituendo un valore corrispondente
        # a «falso».
        #
        exit 1
    fi
else
    #
    # La directory non esiste.
    # Si tenta di crearla.
    #
    if ! mkdir $DESTINAZIONE
    then
        #
        # Non è stato possibile creare la directory
        #
        echo "Non è possibile creare la directory"
        echo "$DESTINAZIONE"
        #
        # Lo script termina restituendo un valore corrispondente
        # a «falso».
        #
        exit 1
    fi
fi
#
# Giunti a questo punto, dovrebbe esistere la directory
# di destinazione.
# Inizia il ciclo di archiviazione.
#
for DA_ARCHIVIARE in $ELENCO_DA_ARCHIVIARE
do
    #
    # Estrae il nome del file o della directory senza il suo
    # percorso.
    #
    BASE_NAME=`basename $DA_ARCHIVIARE`
    #
    # Comprime il file o il contenuto della directory ottenendo un
    # file compresso con lo stesso nome e l'aggiunta
    # dell'estensione «.tgz».
    # Si utilizza «tar» specificando in particolare l'opzione «z»
    # che permette di comprimere automaticamente l'archivio
    # attraverso «gzip»;
    #
    tar czvf $DESTINAZIONE/$BASE_NAME.tgz $DA_ARCHIVIARE
done
#
# L'operazione di archiviazione e' terminata.
#
echo "L'archiviazione e' terminata."
##
## Fine.
##

178.2.4   UPX

UPX, ovvero il programma di servizio upx, (5) consente di comprimere dei programmi eseguibili, in modo da poter poi essere avviati senza bisogno di procedere alla loro espansione. In pratica, si prende un programma, lo si comprime e, all'apparenza, questo continua a funzionare come prima.

Il programma UPX è realizzato per vari tipi eseguibili e il suo comportamento si adatta alle circostanze. In particolare, per quanto riguarda i sistemi GNU/Linux, l'avvio del programma compresso implica una fase di estrazione nella directory temporanea /tmp/ e l'avvio successivo di quanto estratto. Come conseguenza più importante si ha che il processo che viene messo in funzione ha un'apparenza diversa rispetto al solito. A titolo di esempio, si suppone di avere compresso il programma yes e di averlo avviato in questo modo:

yes ciao > /dev/null &[Invio]

Se si osserva con il programma ps, in certi casi potrebbe sembrare ancora tutto normale:

ps x[Invio]

  PID TTY      STAT   TIME COMMAND
...
 7513 tty5     R      0:41 yes ciao
 7529 tty5     R+     0:00 ps x

Ma in altri casi, il processo si mostra attraverso un numero:

ps[Invio]

  PID TTY          TIME CMD
 6173 tty5     00:00:00 sh
 7513 tty5     00:01:36 3
 7545 tty5     00:00:00 ps

pstree[Invio]

init-+-ahc_dv_0
    ...
     |-sh-+-3
     |    `-pstree
    ...

Segue la descrizione del modello sintattico per l'uso di upx:

upx [comando] [altre_opzioni] [file_eseguibile...]

Il modello sintattico indica la presenza di un'opzione iniziale, con lo scopo di dichiarare il tipo di azione da compiere (se viene omessa, si intende la volontà di comprimere i file), seguita eventualmente da altre opzioni, quindi dai file da comprimere. La tabella successiva riepiloga i comandi disponibili; si rammenti che si può usare una sola opzione di questo tipo, ovvero si può indicare un solo comando.

Tabella 178.13. Comandi.

Opzione Descrizione
 
L'assenza dell'opzione di comando implica l'intenzione di comprimere i file secondo la modalità predefinita.
-1|2|3|4|5|6|7|8|9
--best
Specifica il livello di compressione: con -1 si ottiene un livello minimo, mentre con -9 richiede una compressione molto migliore. Utilizzando l'opzione --best si intende richiedere la compressione migliore che sia disponibile.
-d
Decomprime i file compressi in precedenza, riportandoli così al loro stato originale.
-t
Verifica l'integrità dei file che si presume siano stati compressi in precedenza.
-l
Mostra alcune informazioni sullo stato di file che si presume siano stati compressi in precedenza.

Segue la descrizione di alcuni esempi.

178.2.5   Utilizzo di «unp» e di «ucat»

Unp (6) è un pacchetto composto di piccoli programmi frontali per facilitare l'estrazione di file compressi, senza dover ricordare comandi e sintassi differenti, che invece vengono avviati in modo trasparente e appropriato.

unp file... [-- opzioni_specifiche]
ucat file...

Il primo dei due modelli sintattici mostrati fa riferimento al programma unp, con il quale si estraggono i file indicati come argomento; eventualmente, preceduti da due trattini --, si possono aggiungere delle opzioni specifiche per il programma che si ritiene venga usato da unp per l'estrazione, ma ovviamente in questo modo perde di significato l'uso del programma frontale. Il secondo dei due modelli fa riferimento al programma ucat, da intendere come un programma che legge i file indicati, li estrae e li emette attraverso lo standard output. Segue la descrizione di alcuni esempi.

178.3   Altri programmi affini

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) GNU cpio   GNU GPL

2) GNU tar   GNU GPL

3) Gzip   GNU GPL

4) Bzip2   software libero con licenza speciale

5) UPX   GNU GPL con eccezioni e precisazioni

6) Unp   GNU GPL

7) Star   GNU GPL

8) Arc   GNU GPL

9) Arj   GNU GPL

10) Zoo   dominio pubblico

11) InfoZip   software libero con licenza speciale

12) Lzop   GNU GPL

13) PPMd   software libero con licenza speciale

14) Dact   GNU GPL

15) Makeself   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome archiviazione_e_compressione.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!