Forzar dd a no guardar en caché o no leer desde caché

22

Estoy trabajando en un sistema integrado con la versión busybox de dd. Estoy tratando de probar un borrado de la unidad desde alguna utilidad externa, sin embargo, dd no lee del disco nuevamente después del borrado, pero me muestra los datos almacenados en caché.

Lo reduje a dd como cuando hago un dd inicial, veo los datos, reinicio mi sistema para vaciar el caché, borré y luego volví a ejecutar dd, apareció con todos los ceros.

Sin embargo, si hago dd en la configuración de fábrica, borro la unidad y hago dd nuevamente sin reiniciar, no me mostrará todos los ceros hasta que se reinicie.

Leí en la página de manual de GNU que dd admite la opción iflag, con un indicador de nocaché, pero busybox no es compatible con esa opción, por lo que está fuera de discusión.

Mi pregunta es ¿cómo puedo obligar a dd a leer desde el disco nuevamente en lugar de hacerlo desde la memoria caché?

ardiente
fuente
2
Nitpicking potencial, pero ... dd no lo almacena en caché. El sistema kernel / disk lo hace. Es por eso que el comando de Frostschutz (que no se envía a dd) funciona.
Hennes
Necesito esto para mantener el disco despierto en lugar de esperar a girar.
neverMind9

Respuestas:

11

Tu podrías intentar

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

que deja caer todo tipo de cachés.

Para más detalles ver /usr/src/linux/Documentation/sysctl/vm.txten drop_caches.

(Nota: la pregunta era sobre busybox dd que hasta la fecha todavía no es compatible iflag=direct).

Frostschutz
fuente
1
Solo una nota: eso solo funciona con Linux. Además, el /procsistema de archivos está deshabilitado en algunas configuraciones integradas de Linux.
@EvanTeitelman Correcto, parece que funciona aquí, así que voy a votar y aceptar esta respuesta.
ardiente
2
Me preguntaba si esto tiene un efecto único, o si está en curso. De acuerdo con esto , el efecto es único.
Craig McQueen
Esto eliminará los cachés, pero no hace nada para evitar que se vuelvan ddbasura en el proceso si transfiere una gran cantidad de datos.
Jan Hudec
9

Basado en la respuesta de @ sendmoreinfo:

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

No afecta la lectura de caché.

Ole Tange
fuente
Eso funciona, pero ¿tampoco guarda en caché lo que se lee?
neverMind9
1
Correcto. Ese es el objetivo.
Ole Tange
8

La E / S directa (modo abierto O_DIRECT) debería funcionar, pero es posible que su núcleo y / o ddno lo admitan.

sendmoreinfo
fuente
44
Esta es la respuesta correcta: dd if = / dev / device iflag = direct bs = 1M; no afecta la lectura de caché.
Ole Tange
1
@OleTange: ¿Por qué no publicas esto como tu propia respuesta? Este es el hit # 1 en Google para "DD sin caché", y la respuesta correcta es real en un comentario a alguna respuesta no aceptada ...
mic_e
5

Una pequeña floritura a la respuesta directa iflag =; proporcionar una barra de progreso también:

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

Sin el iflag / oflag, el pv informa que está terminado y luego parece que está colgado; pero el dd del dispositivo todavía funciona en la memoria caché.

awltux
fuente