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.