Skip to main content
  1. Comandi/

dd - data duplicator (o disk destroyer)

·5 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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
#

ComandoFlagSignificato flagCosa fa
dd if=/dev/sdb of=/dev/sdcClona disco sdb su sdc byte per byte
dd if=/dev/sdb of=backup.img bs=4Mbsblock sizeCrea immagine raw del disco in un file
dd if=immagine.img of=/dev/sdb bs=4MScrive immagine su disco (es. Raspberry Pi)
dd if=/dev/zero of=/dev/sdb bs=4MAzzera il disco con zeri
dd if=/dev/urandom of=/dev/sdb bs=4MSovrascrive con dati casuali (alternativa a shred)
dd if=/dev/sdb of=backup.img bs=4M status=progressstatusprogressMostra 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
sync

Clonazione 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=progress

Acquisizione 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 verificata

Differenza 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 dispositivi

dd — 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 sequenza

Ecco 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 -20

Scenario 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.txt

L'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
#

Warning

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.

Tip

Aggiungi sempre status=progress — senza, dd non mostra niente per minuti o ore e non sai se sta lavorando o e' bloccato.

Collegato a
#

  • system — categoria
  • incidents — categoria
  • mount — monta i dispositivi identificati con lsblk
  • lsblk — trova i nomi dei dispositivi da usare con dd
  • sha256sum — verifica l'integrita' delle copie create con dd

Related