¿Por qué dd a veces no espera hasta que se escriben los datos?

20

A veces, cuando escribo imágenes en una unidad flash, esto sucede:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

Básicamente, Linux almacena en caché todo, no escribe nada y ddsale. Después de escribir sync, comienza a escribir los datos (el LED de la unidad flash comienza a parpadear).

¿Por qué pasó esto?

jgillich
fuente
3
¿Está seguro de que /dev/sdces un dispositivo real en su sistema y no está escribiendo en un archivo /dev/sdc? Haga un ls --color /dev- /dev/sdcdebería ser amarillo si es un dispositivo.
LawrenceC

Respuestas:

21

Use esto en su lugar:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

Esto llama fsync()después de cada write()llamada al sistema. Esto obliga a ddno guardar nada en la memoria caché. Consulte esta parte de la página de manual de fsync ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

Este es el comportamiento predeterminado de los núcleos. Los núcleos de Linux administran las memorias caché de escritura y lectura de esta manera: cuando write()se emite la llamada al sistema, los datos se escriben rápidamente en la memoria caché y se envía un estado de escritura completa al proceso. Cuando se necesita el búfer o cuando hay tiempo libre en el bus, los datos se escriben desde el caché al disco duro.

caos
fuente
1
Me gusta que su respuesta y la mía cubran enfoques casi completamente diferentes. Niza, +1.
ChrisInEdmonton
1
@ChrisInEdmonton dito +1
caos
Todas las respuestas son buenas en esta pregunta.
Francisco Tapia
@chaos Solo para aclarar: este es el comportamiento predeterminado del núcleo . -¿Quieres decir que conv=fsynces predeterminado cuando escribes para bloquear dispositivos de modo que ddno guarde en caché nada? Buscando una buena respuesta a esto: unix.stackexchange.com/questions/312687/…
Jonathan Komar
10

Esto sucede porque Linux, y la mayoría de los otros sistemas operativos, almacenan en caché tanto las lecturas como las escrituras. En la mayoría de los casos, esto hace que su sistema operativo sea más receptivo.

Si desea asegurarse de que se hayan escrito los datos almacenados en caché, debe usarlos sync, como ya sabe. Linux expone una cantidad significativa de configuraciones que también puede ajustar. Este artículo ofrece una buena descripción general de algunas configuraciones. Puede establecer vm.dirty_background_bytes en 0, por ejemplo, para asegurarse de que el kernel inicie los hilos de descarga inmediatamente.

ChrisInEdmonton
fuente
7

sync (8) - Página del manual de Linux :

El núcleo mantiene los datos en la memoria para evitar realizar lecturas y escrituras de disco (relativamente lentas). Esto mejora el rendimiento, pero si la computadora falla, los datos pueden perderse o el sistema de archivos puede dañarse como resultado. sync asegura que todo en la memoria se escriba en el disco.

Nota: unmount(o expulsar) llama automáticamente lo syncque "oculta" esto en el uso normal del sistema de archivos.

Steven
fuente