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.