Forcer dd à ne pas mettre en cache ou à ne pas lire dans le cache

22

Je travaille sur un système embarqué avec la version busybox de dd. J'essaie de tester un effacement du lecteur à partir d'un utilitaire extérieur, mais dd ne lit plus le disque après l'effacement, mais me montre les données mises en cache.

Je l'ai réduit à dd comme lorsque je fais un dd initial, vois les données, redémarre mon système pour vider le cache, fais l'effacement, puis exécute à nouveau dd pour trouver tous les zéros.

Cependant, si je fais dd sur les paramètres d'usine, effacez le lecteur et refaites dd sans redémarrer, il ne me montrera pas tous les zéros jusqu'à un redémarrage.

J'ai lu dans la page de manuel GNU que dd prend en charge l'iflag opt, avec un indicateur nocache, mais busybox ne prend pas en charge cette option, c'est donc hors de question.

Ma question est de savoir comment puis-je forcer dd à relire depuis le disque plutôt que depuis le cache?

ardent
la source
2
Potentiel de piqûre, mais ... dd ne le cache pas. Le système noyau / disque le fait. C'est pourquoi la commande de Frostschutz (qui n'est pas envoyée à dd) fonctionne.
Hennes
J'en ai besoin pour garder le lecteur éveillé au lieu d'attendre de tourner.
neverMind9

Réponses:

11

Tu pourrais essayer

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

qui laisse tomber toutes sortes de caches.

Pour plus de détails voir /usr/src/linux/Documentation/sysctl/vm.txtsur drop_caches.

(Remarque: la question concernait la busybox dd qui, à ce jour, ne prend toujours pas en charge iflag=direct.)

frostschutz
la source
1
Juste une note: cela ne fonctionne qu'avec Linux. De plus, le /procsystème de fichiers est désactivé dans certaines configurations intégrées de Linux.
@EvanTeitelman Oui, cela semble fonctionner ici, donc je vais voter positivement et accepter cette réponse.
ardent
2
Je me demandais si cela avait un effet ponctuel ou se poursuivait. Selon cela , l'effet est unique.
Craig McQueen
Cela supprimera les caches, mais ne fera rien du tout pour empêcher ddde les jeter dans le processus si vous transférez une grande quantité de données.
Jan Hudec
9

D'après la réponse de @ sendmoreinfo:

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

Cela n'affecte pas le cache de lecture.

Ole Tange
la source
Cela fonctionne, mais ne cache-t-il pas non plus ce qui est lu?.
neverMind9
1
Correct. Voilà l'objectif.
Ole Tange
8

Les E / S directes (mode ouvert O_DIRECT) devraient fonctionner, mais votre noyau et / ou ddpeut ne pas les prendre en charge.

sendmoreinfo
la source
4
C'est la bonne réponse: dd if = / dev / device iflag = direct bs = 1M; cela n'affecte pas le cache de lecture.
Ole Tange
1
@OleTange: Pourquoi ne postez-vous pas cela comme votre propre réponse alors? C'est le hit n ° 1 sur google pour "dd no cache", et la réponse correcte est dans un commentaire à une réponse non acceptée ...
mic_e
5

Un petit épanouissement à l'iflag = réponse directe; fournir également une barre de progression:

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

Sans iflag / oflag, le pv signale qu'il est terminé et semble avoir été suspendu; mais le dd de l'appareil fonctionne toujours sur le cache.

awltux
la source