dd, busque com um tamanho de bloco, escreva com outro tamanho de bloco

6

Informações básicas:

  • Copiando alguns arquivos .bin para um cartão SD (para ser lido por um dispositivo incorporado, sem sistema de arquivos)
  • O comissionamento do cartão exige que alguns segmentos sejam apagados (ou seja, zerados) e que outros tenham arquivos binários copiados para eles
  • Chamando dd de um script python usando o módulo de subprocesso (como as operações dd envolvidas são acionadas por um tipo de script de configuração que precisa ser analisado e validado primeiro, eu também faço o usuário confirmar a operação, pois eles podem acabar com um disco importante que é confundido com o cartão SD)

Problema:

As gravações no cartão SD são lentas com bs = 512. Para grandes extensões, bs = 8M é muito mais rápido.

É possível de alguma forma 'bs = 512 seek = {n_small_blocks}' e depois mudar para 'bs = 8M' para a escrita atual (uma vez que eu tenha procurado a posição correta)?

Eu encontrei o seguinte recurso: link

Mas não está claro para mim por que duas invocações são necessárias e como elas estão trabalhando juntas para cumprir o que o guia afirma que elas farão.

UPDATE

Encontrei a resposta aqui:

link

Veja minha solução completa abaixo

    
por user373884 17.09.2014 / 19:22

1 resposta

5

Solução:

dd if='input_file.bin'           \
   of='/dev/sd{X}'               \
   bs={desired write block size} \
   seek={start offset in bytes}  \
   count={write size in bytes}   \
   oflag=seek_bytes              \
   iflag=count_bytes

Da página do manual:

count_bytes
    treat 'count=N' as a byte count (iflag only)

...

seek_bytes
    treat 'seek=N' as a byte count (oflag only)

Isto parece retardar um pouco a transferência, mas pelo menos a coloca em MB / s, em vez de kB / s. Além disso, certifique-se de verificar a página do manual em seu sistema, pois parece que os disponíveis na web (por exemplo, googling 'man dd') não incluem essas opções.

    
por 17.09.2014 / 19:56

Tags