Archiviare e comprimere sono due mestieri distinti, e su Linux li fanno programmi diversi. È la ragione per cui i backup si chiamano archivio.tar.gz e non archivio.zip: prima tar incolla molti file in uno solo, poi gzip comprime quell’unico file. Tenere separati i due passaggi spiega quasi tutte le opzioni che seguono.

tar: una sola operazione, più opzioni

tar accetta una e una sola operazione per invocazione: -c per creare, -x per estrarre, -t per elencare il contenuto senza estrarre nulla. Le opzioni che le accompagnano sempre sono -f, che introduce il nome dell’archivio, e -v, che mostra i file mentre passano.

$ tar -cvf archivio.tar stuff
$ tar -tf archivio.tar
$ tar -xvf archivio.tar -C /tmp

Due abitudini da prendere subito. La prima: -f deve essere l’ultima opzione del gruppo, perché il nome dell’archivio è il suo argomento; tar -cfv archivio.tar dir crea un file chiamato v. La seconda: prima di estrarre un archivio che non hai fatto tu, guardalo con -t, perché il contenuto viene scritto nella directory corrente e potrebbe spargere file ovunque. Con -C scegli dove estrarre.

tar è ricorsivo di suo: gli passi una directory e prende tutto quello che c’è sotto. I percorsi assoluti vengono salvati senza lo slash iniziale (Removing leading / nell’avviso), così l’archivio si estrae in modo relativo.

Comprimere durante l’archiviazione, o dopo

GNU tar sa richiamare il compressore da solo: -z per gzip, -j per bzip2, -J maiuscola per xz. Le estensioni convenzionali sono .tar.gz (o .tgz), .tar.bz2 e .tar.xz.

$ tar -czvf archivio.tar.gz stuff
$ tar -cjvf archivio.tar.bz2 stuff
$ tar -xzvf archivio.tar.gz

⚠️ L’estensione non comprime niente: se scrivi tar -cvf backup.tar.gz dir ottieni un archivio non compresso con un nome bugiardo. È un errore che LPI mette apposta negli esercizi. Le versioni recenti di GNU tar in estrazione riconoscono il formato da sole, quindi tar -xf funziona lo stesso; all’esame però la risposta attesa resta l’opzione esplicita.

I compressori si usano anche da soli, e si comportano tutti allo stesso modo: sostituiscono il file originale con la versione compressa, aggiungendo l’estensione. gzip file produce file.gz e il file di partenza sparisce; -k lo conserva, -1 fino a -9 regolano velocità contro rapporto, -d decomprime. Ogni compressore ha il suo comando inverso, ed è una coppia da sapere a memoria: gzip/gunzip, bzip2/bunzip2, xz/unxz. In ordine di compressione crescente e velocità decrescente: gzip, bzip2, xz.

Quando non sai cosa hai in mano, chiedilo a file, che legge i primi byte invece di fidarsi del nome:

$ file backup.bin
backup.bin: gzip compressed data, from Unix

cpio: la lista dei file arriva dallo standard input

cpio (“copy in, copy out”) fa lo stesso lavoro di tar ma con una differenza che l’esame ama: non accetta i nomi dei file come argomenti, se li legge dallo standard input, tipicamente prodotto da find o da ls.

$ ls | cpio -o > archivio.cpio
$ cpio -id < archivio.cpio
$ cpio -it < archivio.cpio

-o (copy-out) crea l’archivio, -i (copy-in) estrae, -t elenca, -d crea le directory mancanti durante l’estrazione, -v mostra i nomi. Non lo incontri spesso a mano, ma è ovunque nel sistema: il payload dei pacchetti RPM è un archivio cpio, e così l’initramfs che il kernel monta all’avvio.

dd: copiare a blocchi, con una sintassi tutta sua

dd copia dati grezzi da una sorgente a una destinazione e ignora la convenzione GNU delle opzioni: si scrive operando=valore, senza trattini. Gli operandi da ricordare sono if= (input file), of= (output file), bs= (dimensione del blocco), count= (quanti blocchi copiare).

$ dd if=/dev/sda of=backup.dd bs=4096
$ dd if=immagine.iso of=/dev/sdb bs=4M status=progress
$ dd if=vecchio of=nuovo conv=ucase

Poiché lavora sotto il livello del filesystem, dd copia anche partizioni e dischi interi: è lo strumento con cui si scrive una ISO su una chiavetta o si clona un disco. Per lo stesso motivo non chiede conferma e non ha un annulla: uno scambio fra if= e of= sovrascrive il disco sorgente. Controlla il nome del device due volte prima di premere invio.

Di default dd resta muto finché non ha finito; status=progress mostra l’avanzamento. conv= applica trasformazioni, per esempio ucase e lcase per il maiuscolo e il minuscolo, noerror per proseguire sui blocchi illeggibili. Anche questa è sintassi da digitare a memoria, non da riconoscere.