fenix

linux

Tarlz è un'implementazione parallela (multi-thread) e multi-membro (multi-blocco) dell'archiviatore tar e del compressore lzip . Tarlz usa la libreria di compressione lzlib .

Tarlz crea archivi tar utilizzando una variante semplificata e più sicura del formato POSIX PAX con compressione in formato lzip, mantenendo l'allineamento tra i membri tar e i membri lzip.

L'archivio tar.lz multimembro risultante è retrocompatibile con gli strumenti tar standard come GNU tar, che lo trattano come qualsiasi altro archivio tar.lz solido, GNU Tar lo decomprimerà in maniera sequenziale.

Tarlz può aggiungere file alla fine di tali archivi compressi.

Note di funzionamento di tarlz

Introduciamo due postulati fondamentali:

  • Gli archivi solidi non possono essere creati né decodificati in parallelo.

  • Per implementare un archiviatore e compressore parallelo (multi-thread) è necessario che esso funzioni tramite blocchi di dati.

struttura di un file tar allineato con lzip

Tarlz non processa il file in ingresso come “intero” (in maniera sequenziale), ma l'intero file di ingresso, sarà diviso in “N” blocchi o porzioni di dati, in modo tale che, il processore multi core della macchina, possa processare più blocchi contemporaneamente e parallelamente; ogni core processerà indipendentemente dagli altri, i blocchi a lui assegnati, diminuendo in questo modo il tempo computazionale dell'operazione, rispetto ad un approccio sequenziale e solido.

Nello specifico, tarlz costruisce un archivio Tar multi-membro e lo allinea in input a lzip, che a sua volta, costruisce un file compresso multi-membro allineato con il Tar di partenza.


Mantenere l'allineamento tra i membri tar e i membri lzip ha due vantaggi. Aggiunge un livello lzip indicizzato sopra l'archivio tar, rendendo possibile la decodifica dell'archivio in modo sicuro in parallelo. Inoltre riduce al minimo la quantità di dati persi in caso di danneggiamento. L'accesso ai dati è più veloce.

Questa accortezza , comporta maggior robustezza in caso di corruzione dell'archivio, buona parte dell'archivio può essere recuperata, l'accesso non sequenziale a porzioni specifiche di dati interessa solo il blocco corrispondente in archivio e la sua eventuale decompressione.

Tarlz può creare archivi tar con cinque livelli di granularità di compressione:

  • per file (--no-solid),
  • per blocco (--bsolid, predefinito),
  • per directory (--dsolid),
  • solid appendibile (--asolid)
  • solid (--solid).
  • Può anche creare archivi tar non compressi.

Naturalmente, comprimendo ogni file (o ogni directory) individualmente non si può raggiungere un rapporto di compressione elevato quanto quello ottenuto comprimendo in modo uniforme l'intero archivio tar, ma si ottengono i seguenti vantaggi:

  • L'archivio tar.lz multimembro risultante può essere decompresso parallelamente, moltiplicando la velocità di decompressione.

  • Nuovi membri possono essere aggiunti all'archivio (rimuovendo il membro di fine archivio) e i membri indesiderati possono essere eliminati dall'archivio. Proprio come un archivio tar non compresso.

  • È un formato di backup sicuro in stile POSIX. In caso di corruzione, tarlz può estrarre tutti i membri non danneggiati dall'archivio tar.lz, saltando i membri danneggiati, proprio come il tar standard (non compresso). Inoltre, l'opzione '—keep-damaged' può essere usata per recuperare quanti più dati possibili da ogni membro danneggiato, e lziprecover può essere usata per recuperare alcuni dei membri danneggiati.


Uso di tarlz

tarlz si invoca in questo modo:

tarlz [options] [files]

le opzioni sono le seguenti:

OPTIONS: DESCRIPTION:
--help display this help and exit
-V, --version output version information and exit
-A, --concatenate append archives to the end of an archive
-B, --data-size=<bytes> set target size of input data blocks [2x8=16 MiB]
-c, --create create a new archive
-C, --directory=<dir> change to directory <dir>
-d, --diff find differences between archive and file system
--ignore-ids ignore differences in owner and group IDs
--delete delete files/directories from an archive
--exclude=<pattern> exclude files matching a shell pattern
-f, --file=<archive> use archive file <archive>
-h, --dereference follow symlinks; archive the files they point to
n, --threads=<n> set number of (de)compression threads [2]
-q, --quiet suppress all messages
-r, --append append files to the end of an archive
-t, --list list the contents of an archive
-v, --verbose verbosely list files processed
-x, --extrac extract files/directories from an archive
-0 .. -9 set compression level [default 6]
--uncompressed don't compress the archive created
--asolid create solidly compressed appendable archive
--bsolid create per block compressed archive (default)
--dsolid create per directory compressed archive
--no-solid create per file compressed archive
--solid create solidly compressed archive
--anonymous equivalent to '—owner=root —group=root'
--owner= use name/ID for files added
--group= use name/ID for files added
--keep-damaged don't delete partially extracted files
--missing-crc exit with error status if missing extended CRC
--out-slots= number of 1 MiB output packets buffered [64]

Exit status: 0 for a normal exit, 1 for environmental problems (file not found, invalid flags, I/O errors, etc), 2 to indicate a corrupt or invalid input file, 3 for an internal consistency error (eg, bug) which caused tarlz to panic.


Alcuni esempi di tarlz

Esempio 1: crea un archivio compresso multiplo:

Archive.tar.lz contenente file A ,B ,C.

tarlz -cf archive.tar.lz a b c

Esempio 2: Incorpora il file “d” e il file “e” alla fine dell'archivio multi-membro “Archive.tar.lz” .

tarlz -rf archive.tar.lz d e

Esempio 3: creare un archivio (solid appendibile) Archive.tar.lz contenente i file a,b,C . Quindi aggiungi i file “d” ed “e” alla fine dell'archivio.

tarlz --asolid -cf archive.tar.lz a b c
tarlz --asolid -rf archive.tar.lz d e

Esempio 4: creare un archivio (solid appendibile) contenente le directory “dir1”, “dir2”, “dir3” con un membro lzip separato per directory. Quindi aggiungi i file a,b,c,d,e all'archivio, tutti contenuti in un unico membro lzip. L'archivio risultante Archive.tar.lz contiene 5 membri LZIP (incluso il membro di fine archivio).

tarlz --dsolid -cf archive.tar.lz dir1 dir2 dir3
tarlz --asolid -rf archive.tar.lz a b c d e

Esempio 5: creare un archivio solido “archive.tar.lz” contenente i file a,b,c. Nota bene, non si possono aggiungere altri file successivamente all'archivio.

tarlz --solid -cf archive.tar.lz a b c

Esempio 6: estrai tutti i file dall'archivio Archive.tar.lz .

tarlz -xf archive.tar.lz 

Esempio 7: estrazione dei file “a” e “c” con l'intero albero delle sotto directory “dir1” dall'archivio “Archive.tar.lz” .

tarlz -xf archive.tar.lz a c dir1

Esempio 8: copia il contenuto della directory “sourcedir” alla directory “destdir” .

tarlz -C sourcedir --uncompressed -cf - . | tarlz -C destdir -xf -

Esempio 9: comprimere l'archivio Posix esistente “Archive.tar” e scrivi l'output in “Archive.tar.lz . Comprimere ogni membro individualmente per Disponibilità massima. (Se un membro nell'archivio compresso viene danneggiato, gli altri membri possono ancora essere estratti).

tarlz -z --no-solid archive.tar

Esempio 10: comprimere l'archivio “Archive.tar” e scrivi l'output come “foo.tar.lz”.

tarlz -z -o foo.tar.lz archive.tar

Esempio 11: concatenare e comprimere due archivi “archive1.tar” e “archive2.tar” e scrivere l'output come “foo.tar.lz” .

tarlz -A archive1.tar archive2.tar | tarlz -z -o foo.tar.lz

riferimenti e bibliografia

https://lzip.nongnu.org/

https://lzip.nongnu.org/manual/lzip_manual.html

https://lzip.nongnu.org/tarlz.html

https://lzip.nongnu.org/lzlib.html

https://lzip.nongnu.org/lziprecover.html

https://www.nongnu.org/zutils/zutils.html

https://en.wikipedia.org/wiki/Lzip


https://noblogo.org/fenix/lzip-questo-sconosciuto-compressore-dati

https://noblogo.org/fenix/lzip-guida-rapida-parte-1


modificato il 29 Gennaio 2025


#unolinux #lzip #LZMA #tarlz #compressione #compressionedati #opensurce #archivio #tutorial #guidainformatica #linux

gzip è una delle utility di compressione dati più usata, sopratutto per la sua retro-compatibilità per lo scambio dati in vecchi sistemi operativi, server e reti http, sistemi embedded dove richiede poche risorse, sia in cpu che di memoria. In ambiti dove sono richiesti tempi di compressione e decompressione rapidi e facilmente implementabili. Esistono chip hardware che comprimono o decomprimono in tale formato (gzip, deflate). Il programma è utilizzato come libreria in molteplici software, git, browser-web, gimp, ecc.

Il progetto, nasce nel 1992, ad opera dei programmatori Jean-Loup Gailly e Mark Adler, che si erano prefissati il compito di sviluppare un’alternativa convincente a compress, programma scritto per Unix, che utilizava allora un algoritmo coperto da brevetto (LZW).

Il programma gzip, che è la forma abbreviata di “GNU zip”, si basa sul algoritmo Deflate, (pkzip, zip) utilizzabile liberamente e che consiste in una variazione del processo di compressione dei dati LZ77 (Lempel-Ziv 77), e sulla codifica di Huffman. Proprio con l’aiuto di queste tecniche gzip scansiona i file in cerca di stringhe di dati ricorrenti. Nel caso in cui il programma incontri determinate sequenze ricorrenti, queste vengono sostituite attraverso un dizionario a finestra scorrevole, sulla prima stringa che compare, dove la lunghezza di una tale sequenza è solitamente limitata a 32 Kbyte, per poi essere processate con la codifica di Huffman. Se una sequenza non si presenta nei 32 kbyte precedenti, allora il file verrà salvato senza compressione dati. Il procedimento è limitato ai singoli file, perciò per cartelle di file è necessario un programma di archiviazione esterno al fine di creare dei cosiddetti archivi compressi, con estensioni .tar.gz o .tgz.

Il programma gzip è stato originariamente sviluppato per la piattaforma GNU Linux, ma oggi è utilizzabile su quasi ogni piattaforma, fin quanto la licenza GPL scelta per il progetto venga rispettata. Ad esempio sui sistemi Linux, questo strumento per la compressione dei dati è solitamente installato automaticamente o in alternativa è contenuto nel sistema di gestione dei pacchetti, pronto per essere installato.

Oltre alle varie edizioni per i sistemi operativi più datati, esistono anche versioni per macOS e Windows, scaricabili sulla pagina ufficiale di gzip. Inoltre la compressione di gzip è utilizzata da anni da programmi per la gestione dei server web come ad esempio Apache, anche se questa funzione non viene sempre utilizzata, e dai browser moderni, che sono in grado di interpretare i file compressi e di decomprimerli durante il rende-ring dei siti web.

Il programma gzip mostra il meglio di sé nell'ambito dello sviluppo web: una volta attivato il processo, il server web inizia automaticamente la compressione degli elementi caricati nello spazio web così come degli elementi dinamici del sito web. In questo modo il tempo di caricamento del sito web sarà considerevolmente inferiore per il visitatore. Dovendo quindi gli utenti caricare solamente i pacchetti dati compressi, le stesse pagine web sono notevolmente più rapide da ricostruire.

In questa mini guida impareremo assieme ad utilizzare questo pratico strumento.


Usare il comando gzip su terminale Linux

Per utilizzare il comando gzip, dovrai seguire la sintassi indicata:

gzip [opzioni] file

L’immissione di opzioni non è in alcun modo obbligatoria. Lasciando il campo vuoto, gzip farà riferimento alle impostazioni standard, comprimendo il file di partenza con un nuovo file con estensione gz, e rimuovendo il file d'origine.

Comprimere un file utilizzando il comando gzip

Per comprimere un file utilizzando il comando gzip, tutto ciò che devi fare è aggiungere il percorso del file al comando gzip:

gzip filename

Ad esempio, qui, ho compresso un file di testo:

gzip esempio.txt

dopo la compressione e l'eliminazione automatica del file origine (esempio.txt) avremo un file chiamato:

esempio.txt.gz

se vogliamo mantenere il file originale (vogliamo prevenire la cancellazione automatica utilizziamo l'opzione -k) in questo modo:

gzip -k esempio.txt

se diamo un ls per visualizzare il contenuto della directory cartella corrente avremo entrambi i file:

    esempio.txt
    esempio.txt.gz

Per decomprimere pacchetti compressi in precedenza, si può fare affidamento sia sul programma gunzip sia sul corrispettivo comando di gzip -d

gzip -d esempio.txt.gz

oppure se vogliamo mantenere entrambi i file:

gzip -k -d esempio.txt

La seguente tabella fornisce i comandi gzip più importanti:

Opzione Descrizione
-1 … -9 Definisce il grado di compressione (1-9), dove il valore 1 corrisponde al tipo di compressione più basso e veloce, mentre il valore 9 equivale a quello migliore ma che richiede un maggior tempo; il valore standard preimpostato è 5
-r Ricerca ricorsivamente la cartella (incluse tutte le sottocartelle) e comprime o decomprime tutti i file contenuti al suo interno
-f Forza la compressione gzip e sovrascrive, in caso sia necessario, i file già presenti con lo stesso nome
-d Decomprime i file selezionati nella cartella attuale
-k Impedisce la cancellazione del file originale
-l Mostra le informazioni dei file, come ad esempio il grado di compressione
-c Crea un file compresso per uno standard output, di solito lo schermo di un PC, connesso alla riga di comando
-q Disattiva completamente le comunicazioni da parte del programma gzip
-t Testa l’integrità del file compresso
-h Elenca tutte le opzioni disponibili

per maggiori informazioni consultare il manuale del programma con il comando:

man gzip

Come comprimere con gzip una directory in Linux

Come accennato precedentemente gzip opera unicamente su un singolo file per volta, quindi in parole spicce è impossibilitato a comprimere intere directory di file in un unico file compresso, per fare ciò si usa prima archiviare con tar la directory/cartella da comprimere, per poi comprimerla in un secondo momento con gzip.

gzip archivio.tar

avremo un file chiamato:

archivio.tar.gz

questo approccio potrebbe risultare scomodo (comandi archivio tar + comandi gizp), perché effettivamente andremo a scrivere una miriade di comandi, fortunatamente è possibile fare questa operazione direttamente con un unico comando tar simile a questo:

tar -zcvf nome_archivio cartella_da_comprimere

le opzioni del comando tar utilizzato in precedenza hanno il seguente significato:

z dice a tar che deve usare gzip per comprimere il file c dice a tar di creare archivio di file non compresso v modalità dettagliata, mostra quali file vengono elaborati f l'output file x estrae i file dall'archivio

vediamo un esempio, supponiamo che ho una cartella chiamata “documenti” contenente file vari, vorrei comprimerla con gz in un archivio compresso tar.gz chiamato archivio_documenti:

tar -zcvf archivio_documenti.tar.gz documenti

per estrarlo:

tar -zxvf archivio_documenti.tar.gz

se il file presenta estensione “tar.gz” tar è in grado di riconoscerlo come “archivio compresso gzip” e si può omettere il parametro 'z' in fase di estrazione:

tar -xvf archivio_documenti.tar.gz

con GNU TAR è anche possibile passare parametri opzionali al “compressore”, supponiamo ad esempio di voler comprimere e archiviare la solita cartella documenti, questa volta contenente ad esempio solo file di testo semplice (hanno un alto rapporto di compressione) e di voler utilizzare un grado di compressione di gzip di tipo -9 “migliore” a discapito del tempo, avremo un comando simile a questo:

tar -c -I 'gzip -9' -vf archivio_documenti.tar.gz documenti

le opzioni del comando tar utilizzato in precedenza hanno il seguente significato:

-c dice a tar di creare archivio di file non compresso -I indica il programma di compressione e i parametri da usare -v modalità dettagliata, mostra quali file vengono elaborati -f l'output file

per ulteriori combinazioni di comandi fare riferimento al manuale di GNU TAR.

man tar


#linux #gzip #compressionedati #archivio #unolinux #guidainformatica #tutorial