Guia de Uso do Comando dd

dd (Data Dumper) é uma ferramenta de cópia e conversão de dados de baixo nível em sistemas do tipo Unix, projetada para operações a nível de byte em dispositivos ou arquivos brutos. Embora o nome derive de "disk dump", sua funcionalidade vai muito além disso.

Principais finalidades incluem:

  1. Extrair ou recortar porções específicas de aqruivos grandes
  2. Criar imagens de mídia inicializável (como pen drives USB de boot)
  3. Fazer backup e restaurar partições ou discos
  4. Pular cabeçalhos de arquivo para ler diretamente a carga útil (como fluxos de áudio/vídeo)
  5. Realizar conversões de formato de dados binários (como ordem de bytes, codificação)
  6. Simular comportamentos de leitura/escrita com baixa latência e alta precisão

I. Operações Comuns

Objetivo Modelo de Comando Recomendado
Extrair os primeiros N MB dd if=arquivo_entrada of=arquivo_saida bs=1M count=N status=progress
Pular cabeçalho dd if=origem of=destino bs=188 skip=X count=Y status=progress
Gravar em dispositivo sudo dd if=imagem of=/dev/sdX bs=4M status=progress sync
Criar arquivo vazio dd if=/dev/zero of=arquivo bs=1M seek=100 count=1 status=progress

II. Estrutura Básica da Sintaxe

dd [opções] [origem] [destino]
Opção Significado
if=arquivo Especifica o arquivo ou dispositivo de entrada (Input File). Se omitido, assume a entrada padrão.
of=arquivo Especifica o arquivo ou dispositivo de saída (Output File). Se omitido, assume a saída padrão.
bs=tamanho Define o tamanho do bloco de leitura/escrita em bytes. Valores comuns: 512, 1K, 4K, 1M.
count=quantidade Limita o número de blocos a serem lidos. O total copiado = bs × count.
skip=valor Pula os primeiros skip blocos no arquivo de entrada antes de começar a leitura.
seek=valor Pula os primeiros seek blocos no arquivo de saída antes de começar a escrita.
status=progress Exibe uma barra de progresso em tempo real (recomendado para operações longas).

Combinação recomendada: if=... of=... bs=1M status=progress — eficiente e com feedback visual.

III. Cenários Típicos de Aplicação e Exemplos

Caso 1: Extrair um trecho de dados de um fluxo de mídia (ex: arquivo .ts)

Cenário: Você tem um arquivo de fluxo de mídia de 12 minutos em formato .ts e precisa extrair os primeiros 100 MB para teste.

dd if=video_fluxo_h264.ts \
     of=trecho_extraido.bin \
     bs=1M \
     count=100 \
     status=progress

Explicação:

  • bs=1M: Lê e escreve em blocos de 1 megabyte para melhor desempenho.
  • count=100: Lê 100 blocos → totalizando aproximadamente 100 MB.
  • status=progress: Mostra a porcentagem de progresso e bytes já transferidos.
  • O arquivo de saída trecho_extraido.bin contém dados binários brutos, útil para aálise posterior (ex: desempacotamento com FFmpeg).

Útil para: análise de mídia, depuração de taxa de bits, teste de resiliência de decodificadores.

Caso 2: Copiar um bloco de dados com tamanho fixo exato (ex: primeiros 629.145.572 bytes)

dd if=dados_origem.bin \
     of=resultado_final.bin \
     bs=1 \
     count=629145572 \
     status=progress

Explicação:

  • Usar bs=1 indica leitura/escrita byte a byte, garantindo controle preciso.
  • count=629145572: Copia exatamente 629.145.572 bytes (~600 MB).
  • Este método é comumente empregado para:
    • Extrair um pacote de encapsulamento completo (ex: cabeçalho MPEG-TS).
    • Gerar amostras de teste com tamanho fixo.
    • Uso combinado com mapeamento de memória ou visualizadores hexadecimais (ex: hexdump).

Nota: Com bs=1, o desempenho é reduzido. Use apenas quando for necessário controle byte a byte.

Caso 3: Pular cabeçalho de arquivo e extrair a carga útil

Cenário: Certos arquivos .ts contêm cabeçalhos redundantes (como informações de configuração de programa). É necessário pular os primeiros 100 pacotes TS de 188 bytes.

dd if=entrada.ts \
     of=apenas_carga_util.ts \
     bs=188 \
     skip=100 \
     count=1000 \
     status=progress

Explicação:

  • bs=188: Tamanho da unidade básica do encapsulamento MPEG-TS.
  • skip=100: Pula os primeiros 100 pacotes (total de 18.800 bytes).
  • count=1000: Lê os próximos 1000 pacotes.
  • O arquivo de saída contém apenas a parte dos dados do usuário, útil para testes de decodificação.

Valor prático: Evita que pacotes inválidos atrapalhem a lógica de decodificação, aumentando a eficiência da análise.

Caso 4: Criar uma mídia USB inicializável (gravar imagem no dispositivo)

sudo dd if=imagem_linux.iso \
     of=/dev/sdb \
     bs=4M \
     status=progress \
     sync

Explicação:

  • sudo: É necessário executar com privilégios de administrador, caso contrário não será possível escrever no dispositivo.
  • if=...iso: O arquivo de imagem ISO.
  • of=/dev/sdb: O dispositivo de armazenamento USB alvo (verifique cuidadosamente o nome do dispositivo para evitar gravação acidental).
  • bs=4M: Usa um bloco maior para aumentar a velocidade de gravação.
  • sync: Força a escrita dos dados em cache no dispositivo físico (previne gravações incompletas em caso de interrupção).

⚠️ Aviso Importante:

  • Confirme que /dev/sdb é realmente o nó do dispositivo correto.
  • Uma gravação errada pode danificar o disco rígido principal.
  • Use comandos como lsblk ou udevadm info para verificar o dispositivo.

Caso 5: Fazer backup de uma partição de disco (ex: /dev/sda1)

sudo dd if=/dev/sda1 \
     of=backup_particao.img \
     bs=1M \
     status=progress

Explicação:

  • Faz backup de uma partição inteira para um arquivo local.
  • Útil para recuperação de desastres, migração de sistemas, arquivamento de imagens.
  • Após salvar, o conteúdo pode ser visualizado com mount backup_particao.img.

Sugestão: Combine com compactação para economizar espaço: dd ... | gzip > backup.img.gz.

Caso 6: Preencher um arquivo com zeros (para completar seu tamanho)

dd if=/dev/zero \
     of=arquivo_grande.bin \
     bs=1M \
     seek=100 \
     count=1 \
     status=progress

Explicação:

  • if=/dev/zero: Fornece um fluxo infinito de bytes zero.
  • seek=100: No arquivo de saída, pula os primeiros 100 blocos de 1 MB.
  • count=1: Escreve apenas 1 bloco.
  • Resultado: Gera um arquivo com tamanho de 100 MB + 1 MB = 101 MB, com um "buraco" no meio (arquivo esparso).

Cenário de aplicação: Criação de discos virtuais pré-alocados, teste de desempenho de sistemas de armazenamento.

Caso 7: Ler dados brutos de um dispositivo para análise (ex: captura de interface de rede)

sudo dd if=/dev/eth0 \
     of=dados_pacote.raw \
     bs=1K \
     count=1024 \
     status=progress

⚠️ Nota: Esta operação requer permissões adequadas, e /dev/eth0 deve suportar acesso bruto (geralmente apenas em modos especiais, como o modo promíscuo). Não é recomendado para usuários comuns.

IV. Parâmetros Chave e Observações Importantes

Parâmetro Valor Recomendado Explicação
bs 1M (padrão) A leitura/escrita em blocos grandes melhora significativamente o desempenho; evite usar bs=1 a menos que seja estritamente necessário.
count Definir explicitamente Evita a cópia acidental de um arquivo inteiro grande.
skip / seek Verificação rigorosa Para operações de deslocamento, a posição deve ser calculada com antecedência.
status=progress Altamente recomendado Fornece feedback do progresso em tempo real, facilitando o monitoramento de tarefas longas.
sync Adicionar quando necessário Garante que os dados sejam gravados completamente no meio físico, prevenindo corrupção por falta de energia.

V. Normas de Uso Seguro

  1. Nunca aponte of= para um dispositivo real (como /dev/sda) sem confirmação.
  2. Priorize caminhos de arquivo em if=... of=... para evitar operações diretas em dispositivos.
  3. Use lsblk, fdisk -l ou udevadm info --name=/dev/sdX parra verificar informações do dispositivo.
  4. Antes de executar uma operação de escrita, use echo "Tem certeza?" para confirmação manual.
  5. Para operações com dados importantes, faça primeiro um teste em pequena escala (ex: count=10).
  6. Para operações em disco do sistema ou partição raiz, prepare previamente um ambiente de recuperação.

VI. Técnicas Avançadas e Conhecimentos Complementares

1. Combinação com pipes (processamento eficiente de arquivos grandes)

# Dividir um arquivo grande em blocos
split -b 100M video_grande.ts parte_

# Usar dd para ler o 3º segmento
dd if=parte_aa bs=1M count=100 of=segmento_3.bin

2. Uso combinado com hexdump/xxd para visualizar dados brutos

dd if=video.ts bs=1M count=1 | hexdump -C

3. Gerar dados de teste aleatórios

dd if=/dev/random of=dados_teste.bin bs=1M count=10

4. Verificar se um dispositivo é legível/gravável

dd if=/dev/sdX bs=512 count=1 | head -c 10

Tags: dd unix Linux backup comandos-terminal

Publicado em 7-20 01:06