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?
command-line
bash
Kir Ivlev
fuente
fuente
sync
?sync
podría esperar.dd
También tiene algunas opciones de sincronización, por ejemploconv=fsync
. Dicho esto, nunca tuve que usarlo con/dev/sd*
unidades yo mismo. Si utilizó literalmente,/dev/sdx
creo que ha de haber sido tenías un archivo de 959MB en inútiles/dev
(disco RAM) ahora ...Respuestas:
A pesar de la creencia popular,
dd
es un comando perfectamente ordinario, no es más bajo quecat
ocp
. 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 comandosync
vacía todos los búferes de salida a los discos. Cuando elsync
comando regresa, los datos se han escrito completamente.La mayoría de las veces, no necesita llamar
sync
, porque desmontar un sistema de archivos hace el mismo trabajo. Cuando elumount
comando 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 usartee
. 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 .fuente
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.sync
comando, pero hacen el mismo trabajo bajo el capó.conv=fdatasync
, eldd
comando no espera para terminar hasta que los datos se escriban en el disco, como lo solicitó el OP. Además, elsync
comando programa una operación de sincronización, pero vuelve inmediatamente; no espera volver hasta que los datos se escriban en el disco.dd
, no esperará a que la memoria caché se vacíe sinconv=fdatasync
etc., pero en Linux no antiguo es incorrecto porsync
no esperar. Puedes ver que coreutils estásync(8)
haciendo lasync(2)
llamada al sistema . Lasync(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).Prueba esto:
El
conv=fdatasync
le dicedd
que use las opciones especiales para asegurarse de que los datos se escriban en el dispositivo físico.fuente