Qual é a diferença entre dd e cat para gravar arquivos de imagem?

5

Ao gravar arquivos de imagem em disco ou em um pendrive, as instruções geralmente usam dd , assim:

dd if=myimage.img of=/dev/sdb

Como isso é diferente de, digamos:

cat myimage.img > /dev/sdb

Entendo que dd tem muito mais opções, como count=... , mas se o objetivo do exercício é gravar um arquivo inteiro em um dispositivo, qual é a vantagem de usar dd ?

    
por Johannes Ernst 24.07.2015 / 05:38

1 resposta

2

Essa pergunta é como "Eu tenho essa ferramenta que pode desenhar retângulos e a outra que pode desenhar losangos; qual é a ferramenta certa para desenhar um quadrado?"

Qualquer quadrado é um caso especial de retângulo e um caso especial de losango, então qualquer uma das duas ferramentas pode ser usada.

O mesmo acontece com dd e cat . O primeiro pode fazer a conversão, pular e buscar, ajustar o tamanho do buffer; mas no caso simples, ele apenas lê um arquivo (ou dispositivo de bloco) e grava dados brutos no outro. O último pode concatenar vários arquivos em um fluxo com algumas modificações textuais opcionais, mas no caso simples, há apenas um arquivo de entrada cujo conteúdo é transmitido (com o suporte ao shell) para o arquivo ou dispositivo de saída.

Ambas as ferramentas são úteis e nenhuma pode ser descartada em favor da outra. Seus escopos se sobrepõem a esse caso simples que você pergunta.

Dito isso, acho que há pelo menos dois problemas que tornam dd a melhor escolha.

1. Bloquear permissões de dispositivos

Para gravar em um arquivo ou dispositivo cat precisa que sua saída seja redirecionada. Seu shell faz o redirecionamento, isto é, abre o arquivo de destino. Ao redirecionar para /dev/sdb , você provavelmente atingirá "permissão negada", a menos que esteja logado como root . Executar um shell como root é arriscado e deve ser evitado.

Você pode tentar

sudo cat myimage.img > /dev/sdb

e falha porque sudo não afeta o redirecionamento de saída feito pelo shell.

Por outro lado, isso é totalmente não problemático:

sudo dd if=myimage.img of=/dev/sdb

Uma pequena dica, a propósito: se você se encontrar em uma situação na qual você deve redirecionar a saída para um arquivo com acesso restrito, então você pode usar este truque:

some_command | sudo tee restricted_file > /dev/null

Isso nos leva a outra maneira de fazer o trabalho. O comando tee passa sua entrada para vários arquivos e para a saída padrão. No caso simples, há um arquivo e a saída padrão é descartada:

sudo tee /dev/sdb < myimage.img > /dev/null

Nesse caso, também há redirecionamento de entrada não afetado por sudo .

2. Para além do caso simples

Imagine um carpinteiro que faz mesas de cozinha. A maioria das tabelas possui superfícies superiores retangulares; os em forma de losango são muito menos comuns. Há uma mesa com tampo quadrado a ser feita. Um quadrado é um losango, também é um retângulo. O carpinteiro utilizará métodos que se aplicam a tabelas raras em forma de losango? ou para tabelas retangulares comuns? Ambos os conjuntos de métodos devem funcionar com a tabela quadrada, mas ele faz retângulos a cada dia de trabalho, portanto, não faz sentido mudar a abordagem.

Voltar para cat e dd . Na minha opinião (e minha prática) dificilmente há a necessidade de concatenar várias imagens, a fim de escrevê-las todas para bloquear o dispositivo. Isso definitivamente seria um trabalho para cat . A ferramenta pode fazer algo mais, mas você não a quer: as opções têm como alvo os arquivos de texto para que possam invalidar seus dados binários quando usados com o arquivo de imagem.

Agora, as opções fornecidas por dd costumam ser úteis quando leio ou escrevo em um dispositivo:

  • conv=noerr - quando a fonte pode estar com defeito;
  • bs=… - buffer grande não esgotará meu disco rígido;
  • count=… - para ler um fragmento, como o MBR;
  • conv=sparse - para reduzir o tamanho da imagem em algumas circunstâncias.

Há mais. Este comando:

kill -s USR1 $(pidof dd)

faz com que dd imprima estatísticas de E / S para erro padrão. Eu não acho que você pode fazer isso com cat .

Estas são as razões que considero dd para ser a ferramenta natural para trabalhar com imagens raw. Não vejo nenhum ponto em mudar a ferramenta para cat só porque não há diferença em algumas caso. Eu gostaria de pensar que as instruções geralmente usam dd porque seus autores pensam como eu. Há alguma elegância na capacidade de escolher conscientemente a ferramenta certa , especialmente quando há mais coisas que parecem igualmente adequadas.

No final, admito que usei pv myimage.img | sudo tee /dev/sdb > /dev/null . Eu abandonei minha ferramenta certa mas pv me deu uma barra de progresso. A menos que você precise concatenar (ou quebrar seus dados binários com a ferramenta de texto) cat não fornece nada.

    
por 18.08.2016 / 01:21