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 dd
sale. Después de escribir sync
, comienza a escribir los datos (el LED de la unidad flash comienza a parpadear).
¿Por qué pasó esto?
linux
command-line
dd
jgillich
fuente
fuente
/dev/sdc
es un dispositivo real en su sistema y no está escribiendo en un archivo/dev/sdc
? Haga unls --color /dev
-/dev/sdc
debería ser amarillo si es un dispositivo.Respuestas:
Use esto en su lugar:
Esto llama
fsync()
después de cadawrite()
llamada al sistema. Esto obliga add
no guardar nada en la memoria caché. Consulte esta parte de la página de manual de fsync (man 2 fsync
):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.fuente
conv=fsync
es predeterminado cuando escribes para bloquear dispositivos de modo quedd
no guarde en caché nada? Buscando una buena respuesta a esto: unix.stackexchange.com/questions/312687/…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.fuente
Nota:
unmount
(o expulsar) llama automáticamente losync
que "oculta" esto en el uso normal del sistema de archivos.fuente