Cosa fa#
Copia dati a basso livello direttamente tra dispositivi o file, blocco per blocco, ignorando il filesystem. Non capisce file o directory — vede solo stream di byte. Questo lo rende potentissimo per clonare dischi, scrivere immagini su USB/SD e acquisire copie forensi, e pericolosissimo se usato con if e of invertiti.
Sintassi#
dd if=sorgente of=destinazione [bs=dimensione_blocco] [count=numero_blocchi]
if = input file — da dove legge
of = output file — dove scrive
bs = block size — dimensione blocco (default 512 byte, usare 4M o 64M per velocita')
count = quanti blocchi copiare (ometti per copiare tutto)Comandi essenziali#
| Comando | Flag | Significato flag | Cosa fa |
|---|---|---|---|
dd if=/dev/sdb of=/dev/sdc | — | — | Clona disco sdb su sdc byte per byte |
dd if=/dev/sdb of=backup.img bs=4M | bs | block size | Crea immagine raw del disco in un file |
dd if=immagine.img of=/dev/sdb bs=4M | — | — | Scrive immagine su disco (es. Raspberry Pi) |
dd if=/dev/zero of=/dev/sdb bs=4M | — | — | Azzera il disco con zeri |
dd if=/dev/urandom of=/dev/sdb bs=4M | — | — | Sovrascrive con dati casuali (alternativa a shred) |
dd if=/dev/sdb of=backup.img bs=4M status=progress | status | progress | Mostra avanzamento in tempo reale |
Caso d'uso principale — Raspberry Pi e SD card#
# Scrivere un'immagine OS su una SD card o USB
# (quello che hai fatto con Raspberry Pi dal Mac)
# 1. Trova il nome del dispositivo SD
lsblk
# NAME SIZE TYPE
# sdb 32G disk ← la tua SD card
# 2. Smonta se montata automaticamente
sudo umount /dev/sdb1
# 3. Scrivi l'immagine
sudo dd if=raspbian.img of=/dev/sdb bs=4M status=progress
# bs=4M = blocchi da 4MB per velocita' ottimale
# status=progress = mostra quanti byte sono stati scritti
# 4. Forza la scrittura dei buffer su disco
syncClonazione disco — backup raw#
# Clona un disco intero su un altro disco identico
sudo dd if=/dev/sda of=/dev/sdb bs=64M status=progress
# Copia TUTTO — incluse partizioni, MBR, spazio vuoto
# Crea un'immagine del disco in un file
sudo dd if=/dev/sda of=/backup/disco.img bs=64M status=progress
# Ripristina l'immagine su un disco
sudo dd if=/backup/disco.img of=/dev/sda bs=64M status=progressAcquisizione forense#
# Acquisizione forense di un disco — copia esatta per analisi
sudo dd if=/dev/sdb of=/evidence/disk.img bs=512 conv=noerror,sync status=progress
# conv=noerror → continua anche in caso di settori danneggiati
# conv=sync → riempie i blocchi con errori con zeri (mantiene l'offset)
# Verifica l'integrita' dell'immagine acquisita
sha256sum /dev/sdb > hash_originale.txt
sha256sum /evidence/disk.img > hash_immagine.txt
diff hash_originale.txt hash_immagine.txt
# Se non ci sono differenze → copia forense verificataDifferenza tra dd e cp#
dd cp
──────────────────────── ─────────────────────────
lavora a livello di blocchi lavora a livello di file
ignora il filesystem usa il filesystem
copia anche lo spazio vuoto copia solo i file
copia MBR e tabella partizioni non copia metadati del disco
piu' lento su file singoli ottimizzato per file
pericoloso se scrivi sul wrong sicuro — non tocca i dispositividd — blocco per blocco vs default:
Di default i comandi come cp lavorano a livello di filesystem — chiedono al kernel "dammi il file chiamato X" e il kernel gestisce tutto: trova l'inode, legge i blocchi giusti, ricostruisce il file. Non sai e non ti importa dove stanno fisicamente i dati sul disco.
dd invece legge il dispositivo direttamente, a sequenze di byte consecutive chiamate blocchi, senza passare dal filesystem:
cp file.txt copia.txt
→ kernel → filesystem → trova inode → legge i blocchi → scrive
dd if=/dev/sda of=disco.img
→ legge byte 0, 1, 2, 3... fino alla fine del disco
→ nessun filesystem, nessun inode, solo byte grezzi in sequenzaEcco perché dd copia anche lo spazio vuoto, le partizioni, il MBR — tutto quello che il filesystem normalmente nasconde.
Combinazioni utili#
# Testa la velocita' di scrittura del disco
dd if=/dev/zero of=/tmp/test bs=1M count=1024 status=progress
rm /tmp/test
# Crea un file vuoto di dimensione specifica (per test)
dd if=/dev/zero of=file_vuoto.bin bs=1M count=100
# crea un file da 100MB pieno di zeri
# Leggi i primi 512 byte di un disco (MBR)
sudo dd if=/dev/sda bs=512 count=1 | xxd | head -20Scenario Reale#
Durante un incident response, un analista deve acquisire una copia forense di un disco sospetto senza modificarlo. Usa:
# Monta il disco in sola lettura
sudo mount -o ro /dev/sdb /mnt/evidence
# Acquisisce copia forense
sudo dd if=/dev/sdb of=/storage/evidence.img bs=4M conv=noerror,sync status=progress
# Calcola hash per catena di custodia
sha256sum /dev/sdb >> /storage/chain_of_custody.txt
sha256sum /storage/evidence.img >> /storage/chain_of_custody.txtL'hash identico sui due file prova che la copia e' integra — fondamentale in un processo legale.
Dove l'ho usato#
- Raspberry Pi — scrittura immagini OS su SD card dal Mac
Note personali#
dd e' chiamato "disk destroyer" per un motivo — se inverti if e of per sbaglio, sovrascrivi il disco sorgente invece della destinazione. Controlla sempre due volte prima di premere invio. In particolare: of=/dev/sda su un sistema in esecuzione e' catastrofico.
Aggiungi sempre status=progress — senza, dd non mostra niente per minuti o ore e non sai se sta lavorando o e' bloccato.


