Tutoriel Linux

Compattare un file con xz su Linux senza perdere l’originale

Débutant6 min de lecture

Devi comprimere un’immagine disco, un dump SQL, un’esportazione CSV o un backup grezzo prima di un trasferimento. xz riduce spesso meglio la dimensione rispetto a gzip, ma consuma più CPU e può richiedere molta memoria con i livelli elevati.

Utilizza xz per un singolo file, grande e poco compresso. Evitalo per una foto JPEG, un video MP4, un archivio .zip, un pacchetto .deb o un file il cui nome termina già con .gz, .xz o .zst.

Le fasi di seguito coprono la creazione di un archivio .xz, la conservazione del file sorgente, il test di integrità, la scelta del livello di compressione e la verifica di una copia remota.

Archivio Linux compresso con xz e Tux davanti a un server
Compressione di un archivio Linux con xz prima del trasferimento o dello stoccaggio.

Controllare che xz sia disponibile

La maggior parte delle distribuzioni installa xz di default tramite il pacchetto xz-utils o xz. Controlla il comando prima di integrarlo in una procedura di backup.

xz --version

Su Debian, Ubuntu e Linux Mint, installa il pacchetto se il comando è assente.

sudo apt update
sudo apt install xz-utils

Su Fedora, AlmaLinux o Rocky Linux, installa il pacchetto con dnf.

sudo dnf install xz

Scegliere xz, gzip o zip

xz comprime un file singolo con LZMA2. È adatto per un dump SQL, un’esportazione di testo, un’immagine disco non compressa, un file di log consolidato o un archivio .tar già creato.

  • Scegli xz quando il guadagno in dimensione conta più della velocità.
  • Scegli gzip quando desideri una compressione rapida in uno script, in una pipeline o in una rotazione dei log.
  • Scegli zip quando devi raggruppare più file in un formato facile da aprire su Windows.
  • Scegli tar prima di xz quando devi preservare una struttura Linux con le sue directory, nomi e permessi.

xz da solo non raggruppa più file. Per comprimere una cartella, crea prima un archivio tar, quindi comprimi con xz.

tar -cf progetto.tar progetto/
xz -k progetto.tar

Il comando tar può anche creare direttamente progetto.tar.xz.

tar -cJf progetto.tar.xz progetto/

Controllare il file prima della compressione

Controlla il tipo e la dimensione del file prima di una compressione lunga. Un file già compresso può monopolizzare la CPU per un guadagno quasi nullo.

file backup.sql
ls -lh backup.sql

Se file indica gzip compressed data, XZ compressed data, Zip archive data, JPEG image data o ISO Media, prova prima su un piccolo campione.

Comprimere mantenendo il file sorgente

Senzo opzione, xz backup.sql sostituisce backup.sql con backup.sql.xz. Aggiungi -k per mantenere l’originale durante i controlli.

xz -k backup.sql

Aggiungi -v per visualizzare il progresso, il rapporto e le informazioni utili durante l’esecuzione.

xz -k -v backup.sql

Controlla quindi che entrambi i file esistano e confronta la loro dimensione.

ls -lh backup.sql backup.sql.xz

Non eliminare l’originale solo perché il file .xz esiste. Prova l’archivio e valida il ripristino prima di qualsiasi eliminazione.

Scegliere un livello di compressione

Il livello predefinito di xz è -6. Spesso offre un buon rapporto, ma non è sempre adatto a una macchina poco potente o a un ripristino urgente.

  • Utilizza -1 a -3 quando la velocità conta e il guadagno massimo non è una priorità.
  • Mantieni -6 per un uso generale su una macchina confortevole.
  • Riserva -7 a -9 ai file voluminosi che archivi raramente e che potrai anche decomprimere su una macchina sufficientemente equipaggiata.
xz -3 -k export.csv
xz -6 -k backup.sql
xz -9 -k archive.img

I livelli elevati possono aumentare la memoria necessaria per la compressione e la decompressione. Evita -9 per un archivio che dovrà essere aperto su un piccolo VPS, una macchina vecchia o un sistema di emergenza minimo.

Limitare l’uso della CPU su un server

L’opzione -T fissa il numero di thread. -T0 utilizza tutti i core disponibili, il che può rallentare un database, un server web o contenitori attivi.

xz -6 -T2 -k backup.sql

Su una macchina di produzione, inizia con -T1 o -T2. Monitora il carico, quindi aumenta solo se il server rimane reattivo.

uptime
top

Per una compressione programmata, eseguila al di fuori delle ore di punta e controlla lo spazio libero prima di iniziare. L’opzione -k mantiene due file e richiede più spazio su disco.

df -h .

Testare l’integrità dell’archivio

Testa sempre l’archivio con xz -t prima di eliminare l’originale o di convalidare un backup. Il comando legge e decompattura i dati in memoria senza creare un file di output.

xz -t backup.sql.xz
echo $?

Un codice di ritorno 0 indica che il test xz è riuscito. Un altro codice segnala un errore e impone di conservare il file sorgente.

Successivamente, visualizza le metadati dell’archivio per controllare la dimensione non compressa, la dimensione compressa, il rapporto e il tipo di controllo di integrità.

xz -l backup.sql.xz

xz -t verifica che l’archivio possa essere letto. Non prova che una copia remota sia identica al file locale.

Controllare un trasferimento con SHA-256

Calcola un’impronta SHA-256 prima del trasferimento, copia l’archivio, quindi ricalcola l’impronta sulla destinazione. Le due righe devono visualizzare lo stesso valore.

sha256sum backup.sql.xz
scp backup.sql.xz admin@server:/srv/archives/
ssh admin@server 'sha256sum /srv/archives/backup.sql.xz'

Conserva l’impronta con l’archivio se viene inviata su un disco esterno, uno storage oggetto o un altro server.

sha256sum backup.sql.xz > backup.sql.xz.sha256

Per controllare in seguito dalla stessa cartella, utilizza il file .sha256.

sha256sum -c backup.sql.xz.sha256

Decomprimere senza perdere l’archivio

unxz backup.sql.xz elimina l’archivio dopo l’estrazione. Aggiungi -k per mantenere il file .xz finché non hai controllato il contenuto ripristinato.

unxz -k backup.sql.xz
ls -lh backup.sql backup.sql.xz

Il comando equivalente con xz è utile negli script che già chiamano questo binario.

xz -d -k backup.sql.xz

Se il file di output esiste già, xz si rifiuta di sovrascriverlo senza -f. Non forzare l’estrazione prima di aver confrontato il percorso, la data, la dimensione e il reale bisogno di sostituzione.

ls -lh backup.sql backup.sql.xz
stat backup.sql

Per un ripristino prudente, decomprimi in una cartella separata e confronta il file ottenuto prima di sostituire un file di produzione.

mkdir -p /tmp/test-xz
cp backup.sql.xz /tmp/test-xz/
cd /tmp/test-xz
unxz -k backup.sql.xz
ls -lh backup.sql

Leggere un archivio senza creare un file

Per ispezionare rapidamente un file di testo compresso, invia il contenuto decompresso verso l’output standard con xzcat. Questo metodo evita di scrivere un file temporaneo voluminoso.

xzcat backup.sql.xz | head -20

Per cercare una stringa in un file di testo compresso, utilizza xzgrep invece di decomprimere l’intero archivio.

xzgrep -n "CREATE TABLE" backup.sql.xz

Non utilizzare questi comandi su un dump confidenziale se il tuo terminale registra l’output o se lavori in una sessione condivisa.

Procedura raccomandata per un backup

  • Controlla il tipo del file con file e la sua dimensione con ls -lh.
  • Controlla lo spazio disponibile con df -h . prima di usare -k.
  • Comprimi con xz -k -v e un livello adatto alla macchina.
  • Limita i thread con -T1 o -T2 su un server attivo.
  • Testa l’archivio con xz -t e richiedi un codice di ritorno 0.
  • Calcola un’impronta sha256sum prima e dopo ogni trasferimento.
  • Testa l’estrazione in una cartella separata prima di sostituire un file importante.

xz è utile quando lo spazio su disco o la larghezza di banda costa più del tempo della CPU. Non sostituisce una strategia di backup, un’impronta conservata con l’archivio e un test di ripristino eseguito prima di un incidente.