¿Hay algún método para obtener un porcentaje en un DD en Linux?

41

Así que aquí está lo que está pasando.

Comencé una copia de seguridad de una unidad en mi servidor a través de un USB en vivo de Linux. Comencé a copiar la primera unidad con el ddcomando vanilla; justo sudo dd if=/dev/sda of=/dev/sdc1y luego recordé que esto solo deja la consola en blanco hasta que termina.

De todos modos, necesitaba ejecutar una copia de seguridad diferente en la misma unidad, así que comencé con esa y también sudo dd if=/dev/sdb of=/dev/sdc3 status=progressobtuve una línea de texto que muestra la velocidad de transferencia actual, así como el progreso en bytes.

Esperaba un método que muestre un porcentaje de la copia de seguridad en lugar de hacer el cálculo de cuántos bytes se respaldan de 1.8TB. ¿Hay una manera más fácil de hacer esto que status = progreso?

Hastur
fuente

Respuestas:

68

Ver respuestas de esta pregunta [ 1 ]

pv

Por ejemplo, puede usar pv antes de comenzar

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

Salida [ 2 ] :

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

Notas:
Especialmente para archivos grandes, es posible que desee ver man ddy establecer las opciones necesarias para acelerar todo en su hardware, por ejemplo, bs=100Mpara configurar el búfer, oflag=syncpara contar los bytes efectivos escritos, tal vez direct...
La opción -ssolo toma parámetros enteros 1.8T-->1844G.
Como puede observar en las primeras líneas, no necesita ddnada.


kill -USR1 pid

Si ya lanzó el ddcomando, una vez que haya individualizado su PID ( Ctrl- Z+ bgy lo haya leído, o pgrep ^dd...) puede enviar una señal USR1(o SIGUSR1, o SIGINFOver más abajo) y leer la salida.
Si el PID del programa es 1234 con

kill -USR1 1234

dd responderá en el terminal de su STDERR con algo similar a

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

Advertencia: en OpenBSD puede que tenga que comprobar de antemano el comportamiento de kill[ 3 ] : use en su lugar
kill -SIGINFO 1234.
Existe la sigaction nombrada SIGINFO. El SIGUSR1uno, en este caso, debería terminar el programa ( dd) ...
En Ubuntu use -SIGUSR1( 10).

Hastur
fuente
99
es casi seguro que usar 'bs' en el comando dd lo acelera enormemente. Como dd if = / dev / blah of = / tmp / blah bs = 100M para transferir bloques de 100M a la vez
Sirex
1
@Sirex Por supuesto, debe configurar la bs para optimizar la velocidad de transferencia en relación con su hardware ... En la respuesta solo se repite la línea de comandos del OP. :-)
Hastur
3
@Criggie: tal vez porque ddya había terminado todas las write()llamadas al sistema fsynco closeestaba bloqueado esperando que las escrituras lleguen al disco. Con una memoria USB lenta, los umbrales predeterminados del búfer de E / S de Linux para determinar el tamaño de los búferes de escritura sucios pueden conducir a un comportamiento cualitativamente diferente que con archivos grandes en discos rápidos, porque los búferes son tan grandes como lo que está copiando y Todavía toma un tiempo notable.
Peter Cordes
55
Gran respuesta. Sin embargo, quiero señalar que en OpenBSD la señal de muerte correcta es SIGINFO, no SIGUSR1. Usar -USR1 en OpenBSD simplemente matará dd. Por lo tanto, antes de probar esto en un nuevo entorno, en una transferencia que no desea interrumpir, puede familiarizarse con la forma en que actúa el entorno (en una prueba más segura).
TOOGAM
1
el consejo de señales ddes realmente gran información, especialmente para los servidores en los que no se puede / no quiero instalarpv
Mike
38

Mi herramienta de referencia para este tipo de cosas es progress:

Esta herramienta puede describirse como un comando Tiny , Dirty, Linux-and-OSX-Only C que busca los comandos básicos de coreutils (cp, mv, dd, tar, gzip / gunzip, cat, etc.) que se ejecutan actualmente en su sistema y muestra el porcentaje de datos copiados. También puede mostrar el tiempo estimado y el rendimiento , y proporciona un modo "superior" (monitoreo).

Captura de pantalla "<code> progreso </code> en acción"

Simplemente busca /proccomandos interesantes y luego mira directorios fdy fdinfobusca archivos abiertos y busca posiciones, e informa el estado del archivo más grande.

Es muy ligero y compatible con prácticamente cualquier comando.

Lo encuentro particularmente útil porque:

  • comparado con pven tubería o dcfldd, no tengo que recordar ejecutar un comando diferente cuando comienzo la operación, puedo monitorear cosas después del hecho;
  • en comparación con kill -USR1, funciona en prácticamente cualquier comando, no tengo que verificar siempre la página de manual para asegurarme de que no estoy matando accidentalmente la copia; Además, es bueno que, cuando se invoca sin parámetros, muestra el progreso de cualquier comando común de "transferencia de datos" que se esté ejecutando actualmente, por lo que ni siquiera tengo que buscar el PID;
  • comparado con pv -d, nuevamente no necesito buscar el PID.
Matteo Italia
fuente
1
Nota: puede monitorear más que solo los procesos de coreutils. Simplemente especifique el nombre del comando con --command <command-name>.
jpaugh 01 de
1
Esto es increíble!
Floris
25

Ejecute dd, luego, en un shell separado, invoque el siguiente comando:

pv -d $(pidof dd) # root may be required

Esto hará que pv obtenga estadísticas sobre todos los descriptores de archivo abiertos del ddproceso. Le mostrará a ambos dónde se ubican el búfer de lectura y escritura.

sleblanc
fuente
2
¿Funciona después del hecho? ¡¡Asombroso!!
jpaugh
3
Eso es genial. ¡Evita la sobrecarga de ancho de banda de memoria + cambio de contexto de realmente canalizar todos los datos a través de 3 procesos! @jpaugh: Supongo que solo busca las /proc/$PID/fdinfoposiciones de los archivos y /proc/$PID/fdpara ver qué archivos (y, por lo tanto, los tamaños). Entonces, sí, es genial, y es una buena idea para una característica, pero no lo llamaría "sorprendente" porque hay API de Linux que le permiten sondear las posiciones de archivo de otro proceso.
Peter Cordes
@PeterCordes No me di cuenta de que la posición del archivo estaba expuesta por el núcleo. (He pasado mi vida cuidadosamente preparando pvtuberías por adelantado). Por supuesto, asumí lo mismo una vez que vi que esto funciona.
jpaugh
9

Hay una alternativa a dd: dcfldd.

dcfldd es una versión mejorada de GNU dd con características útiles para análisis forense y seguridad.

Salida de estado: dcfldd puede actualizar al usuario sobre su progreso en términos de la cantidad de datos transferidos y cuánto tiempo llevará la operación.

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd

Antonin Décimo
fuente
Es un nombre de comando más largo ... claramente, es inferior. (+1)
jpaugh
6

Como porcentaje, tendría que hacer algunas matemáticas, pero puede obtener el progreso de un dd en forma legible para humanos, incluso después de comenzar, haciendo kill -USR1 $(pidof dd)

El proceso dd actual se mostrará similar a:

11117279 bytes (11 MB, 11 MiB) copiados, 13.715 s, 811 kB / s

Sirex
fuente
44
Eso es básicamente lo mismo que status=progressda
rakslice
1
En realidad estaba a punto de decir que eso es exactamente lo mismo que status = progreso da.