Forçar o dd a não armazenar em cache ou a não ler em cache

22

Estou trabalhando em um sistema incorporado com a versão do dd do busybox. Estou tentando testar uma exclusão na unidade de algum utilitário externo, no entanto, o dd não lê o disco novamente após a exclusão, mas me mostra os dados em cache.

Eu reduzi para dd como quando faço um dd inicial, vejo os dados, reinicio meu sistema para liberar o cache, apagou e, em seguida, executei o dd novamente, com todos os zeros.

No entanto, se eu dd nas configurações de fábrica, apague a unidade e dd novamente sem reiniciar, não mostrará todos os zeros até a reinicialização.

Eu li na página de manual do GNU que o dd suporta o iflag opt, com um sinalizador nocache, mas o busybox não suporta essa opção, então isso está fora de questão.

Minha pergunta é como forçar o dd a ler do disco novamente, e não do cache?

ardente
fonte
2
Nitpicking em potencial, mas ... o dd não o armazena em cache. O sistema de kernel / disco funciona. É por isso que o comando de Frostschutz (que não é enviado para o dd) funciona.
Hennes 12/07
Eu preciso disso para manter a unidade acordada em vez de esperar para girar.
neverMind9

Respostas:

11

Você poderia tentar

sync
echo 3 > /proc/sys/vm/drop_caches

que descarta todos os tipos de caches.

Para mais detalhes veja /usr/src/linux/Documentation/sysctl/vm.txtno drop_caches.

(Nota: a pergunta era sobre o busybox dd, que até o momento ainda não é compatível iflag=direct.)

frostschutz
fonte
1
Apenas uma observação: isso só funciona com Linux. Além disso, o /procsistema de arquivos está desativado em algumas configurações incorporadas do Linux.
@EvanTeitelman Certo, parece funcionar aqui, então vou votar e aceitar esta resposta.
ardent
2
Gostaria de saber se isso tem um efeito único ou está em andamento. De acordo com isso , o efeito é único.
Craig McQueen
Isso eliminará os caches, mas não fará nada para impedir que ddeles sejam descartados no processo ao transferir grande quantidade de dados.
Jan Hudec 19/02
9

Com base na resposta de @ sendmoreinfo:

dd if=/dev/device iflag=direct bs=1M

Não afeta o cache de leitura.

Ole Tange
fonte
Isso funciona, mas também não armazena em cache o que está sendo lido?
neverMind9
1
Corrigir. Esse é o objetivo.
precisa
8

A E / S direta (modo aberto O_DIRECT) deve funcionar, mas seu kernel e / ou ddtalvez não o suporte.

sendmoreinfo
fonte
4
Esta é a resposta correta: dd se = / dev / device iflag = direct bs = 1M; isso não afeta o cache de leitura.
precisa
1
@OleTange: Por que você não publica isso como sua própria resposta? Este é o hit # 1 no google por "DD não cache", ea resposta correta real está em um comentário para alguma resposta não aceita ...
mic_e
5

Um pequeno floreio para o iflag = resposta direta; forneça também uma barra de progresso:

dd iflag=direct if=~/source.iso | pv | dd oflag=direct of=/dev/sdb bs=8M

Sem o iflag / oflag, o pv informa que está terminado e, em seguida, parece que está pendurado; mas o dd para o dispositivo ainda está funcionando no cache.

awltux
fonte