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 dd
comando vanilla; justo sudo dd if=/dev/sda of=/dev/sdc1
y 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=progress
obtuve 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?
fuente
dd
ya había terminado todas laswrite()
llamadas al sistemafsync
oclose
estaba 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.dd
es realmente gran información, especialmente para los servidores en los que no se puede / no quiero instalarpv
Mi herramienta de referencia para este tipo de cosas es
progress
:Lo encuentro particularmente útil porque:
pv
en tubería odcfldd
, no tengo que recordar ejecutar un comando diferente cuando comienzo la operación, puedo monitorear cosas después del hecho;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;pv -d
, nuevamente no necesito buscar el PID.fuente
--command <command-name>
.Ejecute
dd
, luego, en un shell separado, invoque el siguiente comando:Esto hará que pv obtenga estadísticas sobre todos los descriptores de archivo abiertos del
dd
proceso. Le mostrará a ambos dónde se ubican el búfer de lectura y escritura.fuente
/proc/$PID/fdinfo
posiciones de los archivos y/proc/$PID/fd
para 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.pv
tuberías por adelantado). Por supuesto, asumí lo mismo una vez que vi que esto funciona.Hay una alternativa a
dd
:dcfldd
.http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd
fuente
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
fuente
status=progress
da