No he usado dd
tanto, pero hasta ahora no me ha fallado. En este momento, he estado en dd
funcionamiento 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 dd
desde 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, dd
funcionó perfectamente después de todo. La próxima vez, sin embargo, voy a analizarlo pv
y rastrearlo strace
. Gracias a todos por toda su ayuda.
fuente
dd ... bs=16M
es mi sugerencia, dada su RAM, tamaño de disco y velocidad.dd
en 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
dd
una determinada señal utilizando elkill
comando para que emita su estado actual. La señal estáINFO
en sistemas BSD (incluido OSX) yUSR1
en Linux. En tu caso:Puede encontrar la identificación del proceso (
$PID
arriba) con elps
comando; 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-T
en el shell que ejecuta dd para enviarle laINFO
señal.Como ejemplo en Linux, puede hacer que todos los
dd
procesos activos muestren un estado como este:Después de mostrar su estado,
dd
continuará haciendo frente.fuente
pkill -USR1 -x dd
INFO
señal. Linux no tiene un SIGINFO y utiliza en suUSR1
lugar.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
load
es el uso de la CPU?^T
en 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
pv
parece solo el boleto.Una forma más general es usar una
iotop
pantalla que muestre la cantidad actual de lectura / escritura de disco por programa.EDITAR:
iotop -o
muestra solo los programas que realizan actualmente operaciones de E / S (gracias Jason C por este comentario).fuente
iotop -o
ocultará 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
strace
a dicho proceso en ejecución (con la-p $PID
opció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é otrodd
y le envié una de las señales sugeridas, y ... lo mató.Para la próxima vez, puede usarlo
pv
desde 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
dd
si lo desea), esto le mostrará una barra de progreso, velocidad promedio, velocidad actual y ETA.La
iflag=fullblock
opció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
dd
ypv
está 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 endd
lugar depv
acceder a ese dispositivo. Incluso puede pegar undd
extremo en ambos extremos si lo desea, o no hacerlo si no le importa:fuente
A partir de
coreutils
v8.24,dd
tiene soporte nativo para mostrar el progreso. Solo agrega la opciónstatus=progress
.Ejemplo:
Fuente
fuente
ddrescue
te 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
dd
proceso 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
iostat
para estimar la tasa de escritura promedio (MB / s) en el dispositivo de destino, por ejemplo:iostat -d -w30 ada0
Sustituya el nombre del dispositivo de destino por
ada0
aquí 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
ps
para determinar cuánto tiempodd
ha estado funcionando:ps -xo etime,command | grep dd
Convierta 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.boot
Sustituya 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
dd
ha 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
dd
se ejecuta, ejecuto esto en otra terminal como root:Imprime el
dd
estado cada 1 segundo en la ventana de terminal original donde sedd
está ejecutando, y se cierra cuando finaliza el comando.fuente
Puede usar lo
progress
que, en particular, muestra el progreso de una carreradd
. Utiliza/proc/$pid/fd
y/proc/$pid/fdinfo
que también puede monitorear a mano.fuente
La
wchar
línea (caracteres escritos)/proc/$pid/io
puede brindarle información precisa sobre eldd
proceso. Mientras cambie, ¡dd
todavía está funcionando!Aquí hay un pequeño script PHP ordenado, que puede guardar y luego ejecutar
php filename.php
durantedd
para mostrar los bytes escritos. La ventaja agradable de ver/proc/$pid/io
máskill -USR1 $(pidof dd)
es que usted no tiene que cambiar entre terminales, que no es siempre una opción.fuente