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:
- Extrair ou recortar porções específicas de aqruivos grandes
- Criar imagens de mídia inicializável (como pen drives USB de boot)
- Fazer backup e restaurar partições ou discos
- Pular cabeçalhos de arquivo para ler diretamente a carga útil (como fluxos de áudio/vídeo)
- Realizar conversões de formato de dados binários (como ordem de bytes, codificação)
- 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.binconté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=1indica 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
lsblkouudevadm infopara 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/eth0deve 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
- Nunca aponte
of=para um dispositivo real (como/dev/sda) sem confirmação. - Priorize caminhos de arquivo em
if=... of=...para evitar operações diretas em dispositivos. - Use
lsblk,fdisk -louudevadm info --name=/dev/sdXparra verificar informações do dispositivo. - Antes de executar uma operação de escrita, use
echo "Tem certeza?"para confirmação manual. - Para operações com dados importantes, faça primeiro um teste em pequena escala (ex:
count=10). - 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