espere a que el comando dd escriba completamente en el disco

13

Estoy usando el comando dd para crear un usb de arranque desde el archivo iso:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M

Después de presionar enter, sale momentáneamente y me da:

915+0 records in 915+0 records out 959447040 bytes (959 MB) copied,
0.539375 s, 1.8 GB/s

Entonces es como correr en segundo plano porque puedo ver que la unidad flash está funcionando. Eventualmente dejará de copiar y puedo quitar la unidad con éxito, pero la pregunta es por qué el comando dd no espera a que finalice la copia. ¿Por qué se ejecuta en segundo plano? ¿Y cómo puedo hacer que espere?

Kir Ivlev
fuente
44
¿Lo has intentado sync?
choroba
1
@choroba ¿Tiene sentido ejecutar 'sync' si el sistema ya está escribiendo datos en la unidad flash?
Kir Ivlev
No estoy seguro, byt syncpodría esperar.
choroba
2
ddTambién tiene algunas opciones de sincronización, por ejemplo conv=fsync. Dicho esto, nunca tuve que usarlo con /dev/sd*unidades yo mismo. Si utilizó literalmente, /dev/sdxcreo que ha de haber sido tenías un archivo de 959MB en inútiles /dev(disco RAM) ahora ...
frostschutz
1
@frostschutz utilicé / sdc para mi unidad flash
Kir Ivlev

Respuestas:

21

A pesar de la creencia popular, ddes un comando perfectamente ordinario, no es más bajo que cato cp. Su comando lee de la memoria caché del disco y escribe en los búferes de disco como cualquier otro comando.

Para asegurarse de que los datos estén completamente escritos en el medio físico, debe llamar sync. El comando syncvacía todos los búferes de salida a los discos. Cuando el synccomando regresa, los datos se han escrito completamente.

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M; sync

La mayoría de las veces, no necesita llamar sync, porque desmontar un sistema de archivos hace el mismo trabajo. Cuando el umountcomando regresa, o cuando recibe un mensaje de confirmación después de hacer clic en "Expulsar", las memorias intermedias se han escrito en el disco. Aquí, está escribiendo directamente en el disco sin pasar por un sistema de archivos montado, por lo que debe vaciar explícitamente el búfer.

Tenga en cuenta que en lugar de dd, podría usar tee. Esto tiene dos ventajas: hay menos riesgo de invertir el origen y el destino debido a un error tipográfico, y probablemente sea un poco más rápido .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync
Gilles 'SO- deja de ser malvado'
fuente
1
¿Qué tal los botones / íconos "Expulsar" o "Quitar de forma segura"? ¿No llamarían también a sincronización antes de dar la notificación "Aceptar para eliminar"?
user68186
1
Es probable que desee usar sudo tee /dev/sdx >/dev/null, de lo contrario el proceso de copia aún sería muy lento debido a que los datos se escriben en la salida de la consola.
Lekensteyn
1
@ user68186 No llaman al synccomando, pero hacen el mismo trabajo bajo el capó.
Gilles 'SO- deja de ser malvado'
55
Esta respuesta es incorrecta. Sin conv=fdatasync, el ddcomando no espera para terminar hasta que los datos se escriban en el disco, como lo solicitó el OP. Además, el synccomando programa una operación de sincronización, pero vuelve inmediatamente; no espera volver hasta que los datos se escriban en el disco.
vy32
1
@ vy32 tiene razón dd, no esperará a que la memoria caché se vacíe sin conv=fdatasyncetc., pero en Linux no antiguo es incorrecto por syncno esperar. Puedes ver que coreutils está sync(8)haciendo la sync(2)llamada al sistema . La sync(2)página de manual dice "Antes de la versión 1.3.20 Linux no esperaba a que se completara la E / S antes de regresar". así sync(8)que no volverá hasta que el disco reconozca las escrituras (o se active un error).
Anon
13

Prueba esto:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx conv=fdatasync bs=1m

El conv=fdatasyncle dice ddque use las opciones especiales para asegurarse de que los datos se escriban en el dispositivo físico.

vy32
fuente