Comando dd in Linux: copiare dati a blocchi e verificare le immagini
dd copia dati da un file o dispositivo a un altro, scegliendo dimensione dei blocchi, intervalli e conversioni. È utile per immagini e copie a livello di byte, ma un percorso of= sbagliato può sovrascrivere immediatamente dati importanti: verifica sempre sorgente e destinazione prima di eseguirlo.
Gli esempi usano GNU Coreutils. Controlla dd --help e man dd sul sistema di destinazione, perché estensioni e suffissi possono variare. Per gli esempi con file crea una cartella nuova con mkdir dd-demo && cd dd-demo e continua soltanto se entrambi i comandi riescono. Usa nomi dimostrativi nuovi; i comandi con /dev/sdb e /dev/sdc sono invece esempi di operazioni su dispositivi reali e richiedono i controlli specifici descritti sotto.
Cos'è il comando dd?
dd legge blocchi di input e scrive blocchi di output; può cambiare gli offset, cioè le posizioni iniziali, e applicare conversioni. Gli operandi principali hanno la forma nome=valore, senza spazi intorno a =. Se ometti if= legge dallo standard input; se ometti of= scrive sullo standard output. Non aggiunge automaticamente un filesystem né conserva i metadati del file sorgente come farebbe una copia con opzioni dedicate.
Sintassi di base
dd [OPERAND]...
OPERAND è un segnaposto: sostituiscilo con operandi come if=source.img e of=copy.img. Racchiudi tra virgolette i percorsi con spazi, per esempio if="immagine disco.img". Per un normale file di output già esistente, GNU dd normalmente tronca il file prima della copia: la parte finale precedente non rimane. conv=notrunc modifica questa regola; con seek= va considerato anche l’offset di output.
Uso di base di dd
Copiare un file in un altro
if indica l’input e of l’output. Nella cartella dimostrativa prepara un piccolo file con printf 'ABC' > source.img. Il comando seguente copia tutti i tre byte, anche se bs=4M consente blocchi fino a 4 MiB. Non aggiunge zeri all’ultimo blocco incompleto senza una conversione che lo richieda. Per le normali copie di file e directory è generalmente più semplice usare cp.
dd if=source.img of=copy.img bs=4M status=progress
Creare un file di dimensione fissa riempito di zeri
/dev/zero fornisce byte zero. Con GNU dd, 1M vale 1.048.576 byte: count=100 produce quindi un file da 100 MiB, ossia 104.857.600 byte, se tutte le scritture riescono. Il comando scrive davvero i dati e può richiedere tempo e spazio; l’allocazione fisica resta dipendente dal filesystem, per esempio da compressione o deduplicazione. Per la sola lunghezza logica e le regioni sparse valuta invece truncate.
dd if=/dev/zero of=test.bin bs=1M count=100 status=progress
Creare un’immagine del disco
Nell’esempio /dev/sdb rappresenta il disco da leggere e /backup/disk-sdb.img un nuovo file su un altro supporto con spazio sufficiente per l’intera capacità del disco, comprese le aree non usate dal filesystem. Non usare questi nomi senza verificarli sul tuo sistema. Preferisci una sorgente non montata e non modificata; una copia grezza di un filesystem in uso può essere incoerente. Uno snapshot deve essere preparato con gli strumenti del volume e, quando necessario, coordinato con le applicazioni. Verifica anche che il percorso di backup sia realmente montato sul supporto previsto.
sudo dd if=/dev/sdb of=/backup/disk-sdb.img bs=16M status=progress conv=fsync
Verificare una copia con un piccolo file
Prima di lavorare con un dispositivo, esegui questa prova con file normali. Il blocco crea una sottocartella nuova e si ferma se la preparazione o la copia falliscono; le parentesi non cambiano la directory della shell principale. Se la cartella esiste già, scegli un altro nome dopo averne controllato il contenuto.
(
mkdir dd-check || exit 1
cd dd-check || exit 1
printf 'ABC' > source.bin || exit 1
dd if=source.bin of=copy.bin bs=1 status=none || exit 1
cmp -s source.bin copy.bin
echo $?
)
L’output atteso è 0: cmp -s ha trovato contenuti identici. Per cmp, 1 indica una differenza e un valore maggiore di 1 un errore. status=none sopprime i messaggi informativi di dd, ma non gli errori. Questa prova controlla soltanto i byte di due piccoli file: non verifica un dispositivo, il suo stato di montaggio o l’affidabilità di un backup.
Operandi e opzioni principali
| Opzione | Scopo |
|---|---|
if=FILE |
Legge dal file o dispositivo indicato, invece che dallo standard input. |
of=FILE |
Scrive sul file o dispositivo indicato. Un normale file esistente viene di regola troncato; controlla sempre il percorso. |
bs=SIZE |
Imposta sia ibs sia obs, cioè le dimensioni dei blocchi di input e output. Il suffisso GNU M indica MiB, non MB decimali. |
count=N |
Copia al massimo N blocchi di input. Letture brevi ed eventuale fine dell’input possono ridurre i byte effettivamente copiati. |
skip=N |
Salta N blocchi della dimensione ibs nell’input. Con bs viene usata la stessa dimensione per input e output. |
seek=N |
Avanza di N blocchi della dimensione obs nell’output prima di scrivere. Per conservare la coda esistente serve valutare conv=notrunc. |
status=progress |
Mostra volume trasferito e velocità sullo standard error. Gli aggiornamenti possono tardare durante l’attesa dell’I/O. |
conv=noerror,sync |
noerror continua dopo errori di lettura; sync completa i blocchi di input corti con byte zero. Può modificare lunghezza e contenuto della copia. |
conv=fsync |
Richiede la sincronizzazione finale dei dati e dei metadati di output. Non sostituisce il controllo degli errori o del contenuto. |
iflag=fullblock |
Accumula letture brevi fino a riempire il blocco o raggiungere la fine dell’input; utile con pipe e count. |
conv=sync significa riempimento dei blocchi, non scaricamento della cache: non va confuso con conv=fsync o con il comando sync. Senza iflag=fullblock, count= può contare singole letture brevi, frequenti nelle pipe, anziché blocchi completi. Anche con fullblock, la fine dell’input può lasciare incompleto l’ultimo blocco. GNU permette quantità in byte con il suffisso B su count, skip e seek; verifica il supporto nella versione installata.
Esempi pratici
Controllare il dispositivo prima di ripristinare un’immagine
Il ripristino scrive sulla destinazione e può distruggerne i dati e la tabella delle partizioni. Le prime due righe seguenti sono controlli di sola lettura; la terza esegue la sovrascrittura e va eseguita solo dopo aver verificato modello, numero di serie, capacità e direzione della copia. /dev/sdc è un esempio, non l’identità del tuo disco. Controlla che né il dispositivo né le sue partizioni siano montati, usati come swap o da altri volumi; se necessario opera da un ambiente di manutenzione. Conserva prima un backup indipendente della destinazione e assicurati che l’immagine non si trovi sul disco da sovrascrivere. Un’immagine dell’intero disco richiede normalmente un dispositivo intero di capacità almeno pari, non una sua partizione; segui comunque le istruzioni del formato dell’immagine.
lsblk -o NAME,SIZE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS
findmnt
sudo dd if=/backup/disk.img of=/dev/sdc bs=16M status=progress conv=fsync
Estrarre un intervallo da un'immagine
Con bs=1M, skip=100 parte dall’offset 104.857.600 e count=20 copia fino a 20 MiB, ossia 20.971.520 byte. Per ottenere esattamente quella quantità da un file normale, l’immagine deve avere almeno 120 MiB. Se termina prima, la copia può essere più corta anche senza un errore: verifica la dimensione del risultato. segment.bin deve essere un nuovo file sacrificabile; non è automaticamente un’immagine montabile.
dd if=disk.img of=segment.bin bs=1M skip=100 count=20 status=progress
Verificare l'output copiato
Per i file dell’esempio iniziale i due valori SHA-256 devono coincidere e stat deve mostrare 3 source.img e 3 copy.img. Un hash uguale confronta i contenuti letti; la sola dimensione uguale non basta. Leggi gli errori e controlla lo stato di uscita subito dopo ogni comando: il successo di un comando successivo non dimostra quello del precedente. sync senza argomenti chiede al sistema di sincronizzare le scritture pendenti, anche di altri file; non esegue un confronto. Prima di scollegare un dispositivo attendi il completamento e segui la procedura di smontaggio o rimozione prevista dal sistema.
sha256sum source.img copy.img
stat -c '%s %n' source.img copy.img
sync
dd e comandi correlati
| Comando o metodo | Ruolo principale | Quando usarlo |
|---|---|---|
dd |
Copia e conversione orientata ai blocchi | Immagini e copie di intervalli con offset precisi |
cp |
Copia di file a livello di filesystem | File e directory ordinarie |
rsync |
Sincronizzazione incrementale e remota | Backup ripetuti e copie in rete |
GNU ddrescue |
Recupero delle parti leggibili e registrazione del lavoro in un mapfile | Supporti con errori di lettura e tentativi riprendibili; senza garanzia di recupero completo |
Avvertenze importanti
Invertire if e of può distruggere la sorgente
Ricontrolla la direzione if= → of= e l’identità del dispositivo immediatamente prima dell’esecuzione. Sorgente e destinazione devono essere distinte: un altro nome può riferirsi agli stessi dati tramite un collegamento fisico o simbolico. Non contare su una richiesta di conferma. Su un dispositivo più grande dell’immagine, dd non ridimensiona automaticamente partizioni o filesystem e non cancella necessariamente la regione oltre i byte scritti; il ripristino non equivale a una cancellazione sicura del disco.
Una dimensione del blocco maggiore non è sempre migliore
La scelta dipende da dispositivo, tipo di accesso e carico di lavoro. Blocchi molto grandi possono sprecare memoria e rendere meno fine la gestione degli errori: bs=16M negli esempi non è un valore ottimale universale. Se un confronto di prestazioni è necessario, usa dati sacrificabili e condizioni equivalenti; la sola velocità stampata da dd non descrive tutte le cache o la durata effettiva dell’operazione.
Utilizzare uno strumento specifico per il recupero su supporti difettosi
conv=noerror,sync non ripara i settori illeggibili: continua la lettura e può inserire zeri, producendo un’immagine incompleta o alterata. GNU ddrescue è progettato per leggere prima le parti recuperabili e registrare gli intervalli in un mapfile. Per riprendere il lavoro conserva il mapfile corretto insieme alla destinazione: non riutilizzare quello di un recupero diverso. Riduci le scritture sul supporto guasto e lavora, quando possibile, sulla copia recuperata. Per dati insostituibili valuta un servizio specializzato prima di sollecitare ulteriormente un dispositivo in guasto.
FAQ
Cosa significano if e of?
if= seleziona l’input da leggere e of= l’output da scrivere. Se li ometti si usano rispettivamente standard input e standard output. Un output già esistente può essere sovrascritto senza conferma.
Come si visualizza l’avanzamento?
In GNU dd aggiungi status=progress. Le statistiche vanno sullo standard error e mostrano byte e velocità, non una percentuale garantita. Una copia molto breve può terminare prima di mostrare un aggiornamento intermedio; l’attesa dell’I/O può ritardarlo.
Un’immagine dell’intero disco va scritta su una partizione?
Normalmente serve il dispositivo intero, perché l’immagine contiene anche la struttura delle partizioni. Un’immagine di sola partizione ha invece un ambito diverso. Segui le istruzioni dell’immagine e controlla capacità, identità e assenza di utilizzo della destinazione prima della scrittura.
dd può recuperare un disco con errori di lettura?
Può leggere le parti accessibili con opzioni appropriate, ma non ricostruisce i byte illeggibili. GNU ddrescue offre mapfile e ripresa del recupero ed è generalmente più adatto; nessuno dei due garantisce il recupero completo.




