La comanda dd copia dades bloc a bloc, byte per byte, d’un lloc a un altre. Com que treballa per sota del sistema de fitxers, pot copiar discos i particions sencers (inclosa la taula de particions i el carregador d’arrencada), crear imatges de disc o gravar una ISO en un llapis USB. És molt potent, però també és una de les comandes més perilloses de Linux: un error d’una lletra a of= pot esborrar el disc equivocat. En aquesta guia veuràs com fer-la servir per a còpies de seguretat, amb les precaucions necessàries.
Sintaxi bàsica
dd if=ORIGEN of=DESTINACIÓ [bs=MIDA] [count=N] [status=progress] [conv=...]
| Opció | Què fa |
|---|---|
if= | Fitxer o dispositiu d’entrada (input file) |
of= | Fitxer o dispositiu de sortida (output file) |
bs= | Mida del bloc de lectura i escriptura (4M, 1M…). Per defecte és de 512 bytes, i això fa la còpia molt lenta |
count= | Nombre de blocs que es copien |
status=progress | Mostra el progrés mentre copia |
conv=fsync | Escriu les dades al disc físic abans d’acabar |
conv=noerror,sync | Continua si troba errors de lectura i omple amb zeros els blocs que no pot llegir |
Abans de començar: identifica bé els discos
Abans de qualsevol dd sobre un dispositiu, comprova quin és cada disc amb lsblk (mida, model, punts de muntatge):
$ lsblk -o NAME,SIZE,MODEL,MOUNTPOINTS
NAME SIZE MODEL MOUNTPOINTS
sda 476,9G Samsung SSD 860
├─sda1 512M /boot/efi
└─sda2 476,4G /
sdb 1,8T Expansion HDD
└─sdb1 1,8T /media/copies
Tres regles:
- Comprova dues vegades
if=iof=abans de prémer Retorn.ddno demana confirmació. - No copiïs un sistema de fitxers muntat i en ús (com la partició
/del sistema en marxa): la còpia pot quedar inconsistent. Per copiar el disc del sistema, arrenca des d’un USB amb un sistema live. - Totes aquestes comandes necessiten
sudoquan treballen amb dispositius.
Còpia de tot el disc a un altre disc
Per clonar un disc sencer a un altre disc connectat al mateix equip:
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress conv=fsync
/dev/sda és el disc d’origen i /dev/sdb el de destinació, que perd tot el seu contingut. El disc de destinació ha de ser igual o més gran que el d’origen.
Crear una imatge del disc en un fitxer
També pots desar el disc sencer en un fitxer d’imatge, per exemple en un disc extern:
sudo dd if=/dev/sda of=/media/copies/disc-sda.img bs=4M status=progress
La imatge ocupa el mateix que el disc sencer, encara que estigui mig buit. Per estalviar espai, comprimeix-la al vol:
sudo dd if=/dev/sda bs=4M status=progress | gzip -c > /media/copies/disc-sda.img.gz
Les parts del disc plenes de zeros es comprimeixen gairebé del tot. Per exemple, una imatge de prova de 100 MiB de zeros queda en 100 KiB:
$ ls -lh prova.img*
-rw-rw-r-- 1 oscar oscar 100M prova.img
-rw-rw-r-- 1 oscar oscar 100K prova.img.gz
Restaurar un disc des d’una imatge
sudo dd if=/media/copies/disc-sda.img of=/dev/sdb bs=4M status=progress conv=fsync
O, si la imatge és comprimida:
gunzip -c /media/copies/disc-sda.img.gz | sudo dd of=/dev/sdb bs=4M status=progress conv=fsync
El contingut de /dev/sdb se substitueix per la còpia del disc original.
Còpia d’una partició
També pots copiar només una partició. Per exemple, la primera partició del disc /dev/sda:
sudo dd if=/dev/sda1 of=/media/copies/particio1.img bs=4M status=progress
Una imatge de partició es pot muntar directament per recuperar-ne fitxers, sense restaurar-la:
sudo mount -o loop,ro /media/copies/particio1.img /mnt
Comprovar que la còpia és bona
Pots comparar la suma de verificació de l’original i de la imatge (l’origen no ha de canviar mentrestant):
$ sha256sum prova.img
20492a4d0d84f8beb1767f6616229f85d44c2827b64bdbfb260ee12fa1109e0e prova.img
$ gunzip -c prova.img.gz | sha256sum
20492a4d0d84f8beb1767f6616229f85d44c2827b64bdbfb260ee12fa1109e0e -
Altres usos de dd
1. Clonar discos o particions
Útil per migrar un sistema a un disc nou:
# Disc sencer (/dev/sda) a un altre disc (/dev/sdb)
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress conv=fsync
# Una partició (/dev/sda1) a una altra partició (/dev/sdb1)
sudo dd if=/dev/sda1 of=/dev/sdb1 bs=4M status=progress conv=fsync
Si el disc nou és més gran, després hauràs d’ampliar la partició i el sistema de fitxers per aprofitar l’espai.
2. Crear un USB d’arrencada
Per gravar una ISO d’instal·lació en un llapis USB (/dev/sdX és el llapis sencer, no una partició com /dev/sdX1):
sudo dd if=imatge.iso of=/dev/sdX bs=4M status=progress conv=fsync
3. Crear fitxers de prova
Per generar fitxers d’una mida concreta, plens de zeros o de dades aleatòries, per exemple per provar la velocitat d’un disc o de la xarxa:
$ dd if=/dev/zero of=fitxer_prova bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.199257 s, 526 MB/s
$ dd if=/dev/urandom of=fitxer_aleatori bs=1M count=10
Si només necessites reservar espai, fallocate -l 1G fitxer és instantani.
4. Convertir dades
dd pot convertir el format de les dades mentre copia. Per exemple, d’ASCII a EBCDIC (la codificació dels mainframes d’IBM) i a l’inrevés:
dd if=fitxer_ascii.txt of=fitxer_ebcdic.txt conv=ebcdic
dd if=fitxer_ebcdic.txt of=fitxer_ascii.txt conv=ascii
A la versió original d’aquest article es deia que bs=4096 copiava d’un dispositiu amb blocs de 4096 bytes a un altre amb blocs de 1024. No és així: bs fixa la mateixa mida per a la lectura i l’escriptura. Si necessites mides diferents, fes servir ibs= (entrada) i obs= (sortida).
5. Recuperar dades d’un disc amb errors
dd pot continuar quan troba sectors que no es poden llegir:
sudo dd if=/dev/sda of=/media/copies/disc-danyat.img bs=4096 conv=noerror,sync status=progress
noerror fa que no s’aturi en un error i sync omple amb zeros el bloc que no ha pogut llegir, perquè la resta de dades quedin al seu lloc. Fes servir blocs petits: si un bloc de 4M té un sol sector dolent, perds tot el bloc.
Per a discos que fallen, però, és molt millor ddrescue (paquet gddrescue a Debian i Ubuntu): primer copia les zones sanes, després torna a provar les dolentes i guarda un registre per poder continuar on ho havia deixat.
sudo ddrescue /dev/sda /media/copies/disc-danyat.img /media/copies/disc-danyat.map
6. Esborrar un disc
Per sobreescriure un disc dur (de plats) amb zeros o dades aleatòries abans de llençar-lo o reutilitzar-lo:
sudo dd if=/dev/zero of=/dev/sdX bs=4M status=progress
sudo dd if=/dev/urandom of=/dev/sdX bs=4M status=progress
Compte: en SSD i memòries flash això no garanteix que les dades desapareguin, perquè el controlador reparteix les escriptures i en reserva cel·les que dd no pot tocar. Per a un SSD, fes servir l’esborrat segur del fabricant (nvme format amb l’opció d’esborrat segur per als NVMe, o el secure erase de l’ATA amb hdparm) o blkdiscard. Si el disc estava xifrat, n’hi ha prou amb destruir la clau.
dd no és un sistema de còpies de seguretat
dd és ideal per tenir una imatge exacta d’un disc en un moment concret (abans d’una migració o d’una actualització arriscada), però per a les còpies del dia a dia té inconvenients: copia també l’espai buit, no és incremental i la còpia s’ha de fer amb el disc desmuntat. Per a còpies periòdiques de fitxers, és millor rsync, tar o eines com BorgBackup o restic.
Recorda: dd pot fer perdre dades si l’utilitzes malament. Revisa sempre les comandes abans d’executar-les, sobretot quan treballes amb dispositius, i fes còpies de seguretat regularment.