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

5

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

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

Como isso é diferente de, digamos:

cat myimage.img > /dev/sdb

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

Johannes Ernst
fonte

Respostas:

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 do 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 apenas se sobrepõem a este caso simples que você pergunta.


Dito isto, acho que há pelo menos duas questões que fazem 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 vai bater "permissão negada" a menos que você esteja logado como raiz . Executando uma concha como raiz é arriscado e deve ser evitado.

Você pode tentar

sudo cat myimage.img > /dev/sdb

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

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

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

Uma pequena dica pelo caminho: se você se encontrar em uma situação onde 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 mais uma 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

Neste caso, há também 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 alterar a abordagem.

De volta a cat e dd. Na minha opinião (e na minha prática) dificilmente há a necessidade de concatenar várias imagens para 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 de destino dos arquivos de texto para que eles 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=… - Um buffer grande não esgotará meu HDD;
  • count=… - ler um fragmento, como o MBR;
  • conv=sparse - reduzir o tamanho da imagem em algumas circunstâncias.

Tem mais. Este comando:

kill -s USR1 $(pidof dd)

faz 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 Eu considero dd para ser a ferramenta natural para trabalhar com imagens cruas. Não vejo sentido em mudar a ferramenta para cat só porque não há diferença em algum caso especial. Eu gostaria de pensar que as instruções costumam usar dd porque seus autores pensam como eu. Há alguma elegância na capacidade de escolher conscientemente a ferramenta certa , especialmente quando há mais que parecem igualmente adequados.


No final eu admito que usei pv myimage.img | sudo tee /dev/sdb > /dev/null. Eu abandonei meu 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 dá nada.

Kamil Maciorowski
fonte