Comandes LinuxEspai en disc a LinuxFitxers comprimits a LinuxGuies de LinuxLinux

La comanda dd a Linux: com fer còpies i imatges de discos amb seguretat



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=progressMostra el progrés mentre copia
conv=fsyncEscriu les dades al disc físic abans d’acabar
conv=noerror,syncContinua 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= i of= abans de prémer Retorn. dd no 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 sudo quan 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.

Articles relacionats