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?syncpodría esperar.ddTambié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/sdxcreo 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,
ddes un comando perfectamente ordinario, no es más bajo quecatocp. 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 comandosyncvacía todos los búferes de salida a los discos. Cuando elsynccomando 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 elumountcomando 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.synccomando, pero hacen el mismo trabajo bajo el capó.conv=fdatasync, elddcomando no espera para terminar hasta que los datos se escriban en el disco, como lo solicitó el OP. Además, elsynccomando 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=fdatasyncetc., pero en Linux no antiguo es incorrecto porsyncno 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=fdatasyncle diceddque use las opciones especiales para asegurarse de que los datos se escriban en el dispositivo físico.fuente