dd bs=1
é muito ineficiente, pois faz uma read()
e uma write()
de chamada de sistema por byte. Não faz muito sentido usar dd
em um dispositivo de bloco (a menos que você queira usar sinalizadores especiais como conv=noerror,sync...
para manipular erros ou deslocamentos)
Aqui você pode fazer:
offset=$(($(cat /sys/class/block/sda3/start) * 512)) &&
pv -trabSs "$offset" < myfile > /dev/sda
(ou use head -c "$offset"
se você não se importa com as informações de progresso).
pv
e head
escolherão o tamanho adequado do buffer para otimizar o desempenho.
(observe que, como você está gravando dados no início do disco, substituirá efetivamente a tabela de partições!).
Outra alternativa poderia ser criar um novo dispositivo de bloco que mapeie apenas as seções de /dev/sda
que você deseja substituir
Como:
echo "0 $(cat /sys/class/block/sda3/start) linear /dev/sda 0" |
dmsetup create writable_sda &&
cp myfile /dev/mapper/writable_sda