No he usado ddtanto, pero hasta ahora no me ha fallado. En este momento, he estado en ddfuncionamiento durante más de 12 horas, estoy escribiendo una imagen en el disco de donde vino, y me estoy preocupando un poco, ya que pude dddesde el disco a la imagen en aproximadamente 7 horas.
Estoy ejecutando OSX 10.6.6 en una MacBook con un Core 2 Duo a 2.1 ghz / core con 4 gb de RAM. Estoy leyendo desde un .dmg en un disco duro de 7200 rpm (la unidad de arranque), y estoy escribiendo en una unidad de 7200 rpm conectada a través de un conector SATA a USB. Dejé el tamaño de bloque predeterminado, y la imagen es de aproximadamente 160 gb.
EDITAR: Y, después de 14 horas de puro estrés, ddfuncionó perfectamente después de todo. La próxima vez, sin embargo, voy a analizarlo pvy rastrearlo strace. Gracias a todos por toda su ayuda.
fuente

dd ... bs=16Mes mi sugerencia, dada su RAM, tamaño de disco y velocidad.dden Mac OS X tiene una tendencia a congelarse hasta el punto en que ni siquiera puedo matar el proceso, pero tengo que reiniciar el sistema. Entonces recurro a trabajar en una máquina virtual Linux.Respuestas:
Puede enviar
dduna determinada señal utilizando elkillcomando para que emita su estado actual. La señal estáINFOen sistemas BSD (incluido OSX) yUSR1en Linux. En tu caso:Puede encontrar la identificación del proceso (
$PIDarriba) con elpscomando; o vea las alternativas pgrep y pkill en mac os x para obtener métodos más convenientes.Más simplemente, como señala AntoineG en su respuesta , puede escribir
ctrl-Ten el shell que ejecuta dd para enviarle laINFOseñal.Como ejemplo en Linux, puede hacer que todos los
ddprocesos activos muestren un estado como este:Después de mostrar su estado,
ddcontinuará haciendo frente.fuente
pkill -USR1 -x ddINFOseñal. Linux no tiene un SIGINFO y utiliza en suUSR1lugar.dd if=/dev/zero of=/dev/null. :)Bajo OS X (no probé en Linux), simplemente puede escribir Ctrl+ Ten el terminal en ejecución
dd. Imprimirá el mismo resultado quekill -INFO $PID, más el uso de la CPU:Me enteré leyendo este hilo e intentando abrir una nueva pestaña en mi terminal pero mezclando ⌘+ Tcon Ctrl+ T.
fuente
loades el uso de la CPU?^Ten el terminal.Para
dd, puede enviar una señal . Para otros comandos que leen o escriben en un archivo, puede ver su posición en el archivo conlsof.Si planifica con anticipación, canalice los datos
pv.fuente
pvparece solo el boleto.Una forma más general es usar una
iotoppantalla que muestre la cantidad actual de lectura / escritura de disco por programa.EDITAR:
iotop -omuestra solo los programas que realizan actualmente operaciones de E / S (gracias Jason C por este comentario).fuente
iotop -oocultará los procesos que no están haciendo IO y hará que sea más fácil decir de un vistazo lo que está sucediendo.Por lo general, me adjunto
stracea dicho proceso en ejecución (con la-p $PIDopción) para ver si permanece bloqueado en una llamada al sistema o si todavía está activo.O, si se siente nervioso por enviar una señal al dd en ejecución, inicie otro dd para validar si esto funciona.
fuente
strace? Además, comencé otroddy le envié una de las señales sugeridas, y ... lo mató.Para la próxima vez, puede usarlo
pvdesde el principio (si está disponible a través de su administrador de paquetes, instálelo). Esta es una utilidad con el único propósito de canalizar la entrada a la salida y monitorear el progreso y la velocidad.Luego, para escribir una imagen en una unidad, digamos con un tamaño de bloque de 4 MB:
Además del almacenamiento en búfer inicial (compensado por una sincronización final, que se puede hacer
ddsi lo desea), esto le mostrará una barra de progreso, velocidad promedio, velocidad actual y ETA.La
iflag=fullblockopción obliga a dd a capturar bloques completos de entradapv, de lo contrario estará a merced de la tubería para los tamaños de bloque.Para ir hacia el otro lado, use dd para leer y pv para escribir, aunque debe especificar explícitamente el tamaño si la fuente es un dispositivo de bloque. Para un dispositivo de 4 GB:
También puede determinar el tamaño automáticamente, algo como:
Realmente no importa en qué orden lo haga
ddypvestá completamente relacionado con el rendimiento: si el dispositivo al que está leyendo o desde el que tiene un rendimiento óptimo para ciertos bloques que desea usar enddlugar depvacceder a ese dispositivo. Incluso puede pegar unddextremo en ambos extremos si lo desea, o no hacerlo si no le importa:fuente
A partir de
coreutilsv8.24,ddtiene soporte nativo para mostrar el progreso. Solo agrega la opciónstatus=progress.Ejemplo:
Fuente
fuente
ddrescuete dará estadísticas mientras se está ejecutando.demo: http://www.youtube.com/watch?v=vqq9A01geeA#t=144s
fuente
A veces es posible que no pueda utilizar la señal INFO o USR1 porque el flujo stderr del
ddproceso no es accesible (por ejemplo, porque el terminal en el que se ejecutó ya estaba cerrado). En este caso, una solución consiste en hacer lo siguiente (probado en FreeBSD, puede ser ligeramente diferente en Linux):Se usa
iostatpara estimar la tasa de escritura promedio (MB / s) en el dispositivo de destino, por ejemplo:iostat -d -w30 ada0Sustituya el nombre del dispositivo de destino por
ada0aquí y espere un minuto para que le dé un par de resultados. El parámetro "w" determina cuántos segundos entre muestras. Aumentarlo dará una mejor estimación promedio con menos varianza, pero tendrá que esperar más.Use
pspara determinar cuánto tiempoddha estado funcionando:ps -xo etime,command | grep ddConvierta esto a segundos para obtener el total de segundos de tiempo de ejecución.
Obtenga el tamaño del dispositivo en MB con:
grep ada0 /var/run/dmesg.bootSustituya el nombre del dispositivo de destino por
ada0. Divida el resultado por la tasa de escritura promedio para obtener el tiempo de transferencia total en segundos. Reste el tiempo que ha estado funcionando hasta ahora para obtener el tiempo restante.Esta estrategia solo funciona si
ddha estado escribiendo continuamente a la tasa de escritura promedio actual desde que comenzó. Si otros procesos compiten por la CPU o los recursos de E / S (incluido el bus de E / S), entonces puede reducir la velocidad de transferencia.fuente
Empecé a usar dcfldd (1), que muestra las operaciones dd de una mejor manera.
fuente
Mientras
ddse ejecuta, ejecuto esto en otra terminal como root:Imprime el
ddestado cada 1 segundo en la ventana de terminal original donde seddestá ejecutando, y se cierra cuando finaliza el comando.fuente
Puede usar lo
progressque, en particular, muestra el progreso de una carreradd. Utiliza/proc/$pid/fdy/proc/$pid/fdinfoque también puede monitorear a mano.fuente
La
wcharlínea (caracteres escritos)/proc/$pid/iopuede brindarle información precisa sobre elddproceso. Mientras cambie, ¡ddtodavía está funcionando!Aquí hay un pequeño script PHP ordenado, que puede guardar y luego ejecutar
php filename.phpduranteddpara mostrar los bytes escritos. La ventaja agradable de ver/proc/$pid/iomáskill -USR1 $(pidof dd)es que usted no tiene que cambiar entre terminales, que no es siempre una opción.fuente