Comando dd: Imagens de Disco e Uso Seguro

Comando dd: Imagens de Disco e Uso Seguro

O Que Voce Vai Aprender

  • Como clonar um disco ou particao em um arquivo de imagem com dd
  • Como gravar um ISO baixado em um pendrive USB para criar midia de boot
  • Como evitar apagar o dispositivo errado com um of= equivocado

Resumo Rapido (o fluxo seguro)

  1. Identifique o dispositivo alvo com lsblk (confira pelo tamanho e estado de montagem)
  2. sudo dd if=<entrada> of=<saida> bs=4M status=progress conv=fsync
  3. Execute sync depois para esvaziar os buffers de escrita

Premissas (ambiente)

  • SO: Ubuntu / qualquer distribuicao Linux comum
  • dd vem com GNU coreutils. Nenhuma instalacao extra necessaria
  • Operacoes em dispositivos requerem sudo (root)

Qual e a Sintaxe Basica do dd?

Conclusao: A forma base e dd if=entrada of=saida bs=tamanho_bloco. Argumentos usam a forma chave=valor, nao flags com hifen como a maioria dos comandos.

dd simplesmente le de uma entrada (if) e escreve em uma saida (of). Cada argumento e escrito como chave=valor.

$ dd if=input.img of=/dev/sdb bs=4M status=progress

Operandos principais:

  • if= (input file): origem. Padrao e a entrada padrao
  • of= (output file): destino. Padrao e a saida padrao
  • bs= (block size): bytes lidos/escritos de uma vez (ex. 4M = 4 MiB)
  • count=: numero de blocos a copiar (para clonar apenas o inicio)
  • status=progress: quantidade de transferencia e velocidade em tempo real
  • conv=fsync: garantir que os dados sejam escritos na midia fisica ao finalizar

bs afeta diretamente a velocidade. O padrao de 512 bytes e lento. Para discos ou midias USB, bs=4M e uma escolha segura.

Como Identificar o Drive Correto? (Mais Importante)

Conclusao: Use lsblk para conferir capacidade e ponto de montagem, depois confirme o nome do dispositivo alvo. Sempre note a diferenca entre /dev/sda (disco inteiro) e /dev/sda1 (uma particao).

A maioria dos desastres com dd vem de escolher o nome de dispositivo errado. Sempre verifique primeiro.

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 238.5G  0 disk
+-sda1   8:1    0   512M  0 part /boot/efi
+-sda2   8:2    0   238G  0 part /
sdb      8:16   1  28.7G  0 disk
+-sdb1   8:17   1  28.7G  0 part /media/user/USB

Como ler:

  • sda: 238.5G, montado em / -> disco do sistema. Nunca escreva nele
  • sdb: 28.7G com RM (removivel) definido como 1 -> o pendrive USB que voce inseriu
  • sdb sem numero no final e o disco inteiro; sdb1 e uma particao dentro dele

Execute lsblk uma vez antes e uma vez depois de inserir o USB, depois mire no dispositivo que apareceu recentemente. Confira tambem a coluna SIZE.

Como Gravar uma Imagem ISO em um USB?

Conclusao: Desmonte o USB alvo, depois execute sudo dd if=xxx.iso of=/dev/sdX bs=4M status=progress. Aponte of= para o disco inteiro sem numero de particao.

A forma padrao de criar um USB bootavel para Ubuntu e similares.

1. Desmontar

Um alvo montado durante a gravacao causa falhas ou corrupcao.

$ sudo umount /dev/sdb1

2. Gravar com dd

$ sudo dd if=ubuntu-24.04.iso of=/dev/sdb bs=4M status=progress conv=fsync
1538000000 bytes (1.5 GB, 1.4 GiB) copied, 142 s, 10.8 MB/s
367+1 records in
367+1 records out

3. Sincronizar antes de remover

O kernel pode ainda reter dados em buffer apos dd retornar. Esvazie com sync.

$ sync

conv=fsync e um sync final se sobrepoem em proposito, mas usar ambos previne a falha de "comando terminou mas a escrita ainda esta em andamento".

Como Clonar um Disco Inteiro para um Arquivo de Imagem?

Conclusao: Coloque o dispositivo em if= e um arquivo de imagem em of= para fazer backup de tudo. Passe por gzip para reduzir discos com muito espaco vazio.

Faca backup de um disco ou particao em um unico arquivo.

$ sudo dd if=/dev/sdb of=usb-backup.img bs=4M status=progress

Comprima enquanto salva (util quando grande parte do disco esta vazia):

$ sudo dd if=/dev/sdb bs=4M status=progress | gzip > usb-backup.img.gz

Um arquivo de imagem consome a mesma capacidade que o dispositivo de origem (um USB de 28 GB gera um arquivo de 28 GB). Verifique o espaco livre do destino com df -h primeiro.

Como Restaurar uma Imagem de Volta para um Disco?

Conclusao: Basta trocar if= e of=. Passe imagens comprimidas por gunzip durante a restauracao. Verifique o destino mais uma vez.

# Imagem sem compressao
$ sudo dd if=usb-backup.img of=/dev/sdb bs=4M status=progress conv=fsync

# Imagem comprimida
$ gunzip -c usb-backup.img.gz | sudo dd of=/dev/sdb bs=4M status=progress conv=fsync

Como Acelerar ou Monitorar o Progresso?

Conclusao: Um bs maior (4M a 64M) e mais rapido. Monitore o progresso com status=progress; em sistemas mais antigos sem esse recurso, envie kill -USR1 de outro terminal.

Ajustando o tamanho do bloco

$ sudo dd if=/dev/sdb of=backup.img bs=64M status=progress

Um bs pequeno significa mais chamadas de sistema e transferencias mais lentas. Grande demais apenas desperdiça memoria, entao 4M a 64M e a faixa pratica.

Verificando o progresso sem status=progress

Envie um sinal para um dd em execucao de outro terminal para imprimir a quantidade atual de transferencia.

$ sudo kill -USR1 $(pgrep -x dd)

GNU coreutils 8.24 e posteriores suportam status=progress. Prefira-o, e trate kill -USR1 como fallback para ambientes mais antigos.

Quais Sao os Desastres Comuns do dd?

Conclusao: Quase todo acidente se resume a um of= errado, if/of trocados, ou escrita em dispositivo montado. Uma verificacao pre-execucao previne os tres.

Desastre Causa Prevencao
Destruiu o disco do sistema Nome de dispositivo of= errado Confira tamanho e montagem com lsblk primeiro
Backup saiu vazio Trocou if= e of= Diga em voz alta "leitura = if, escrita = of"
Gravou mas nao da boot Gravou em uma particao (sdb1) Grave o ISO no disco inteiro (sdb)
Conteudo corrompido ao finalizar Removeu USB antes de esvaziar buffers Sempre use conv=fsync + sync

Template seguro para copiar e colar

# 1. Verificar dispositivos (sempre primeiro)
lsblk

# 2. Gravar ISO em USB (assume que esta desmontado)
sudo dd if=image.iso of=/dev/sdX bs=4M status=progress conv=fsync

# 3. Sincronizar apos finalizar
sync

Substitua /dev/sdX pelo nome real do dispositivo que voce confirmou em lsblk.

Proximas Leituras