Cómo dd un disco remoto usando SSH en la máquina local y guardar en un disco local

85

¿Cómo puedo crear una copia de seguridad de un disco remoto utilizando SSH en mi máquina local y guardarlo en un disco local?


He intentado lo siguiente:

ssh [email protected] "sudo dd if=/dev/sdX " | \
  dd of=/home/username/Documents/filename.image`

Sin embargo, recibo el siguiente error:

sin tty presente y sin programa askpass especificado

Qu0rk
fuente

Respuestas:

114

Si su intención es hacer una copia de seguridad del HDD A de una computadora remota a través de SSH en un solo archivo que está en el HDD de su computadora local, puede hacer una de las siguientes acciones.

Ejemplos

correr desde una computadora remota

$ dd if=/dev/sda | gzip -1 - | ssh user@local dd of=image.gz

correr desde la computadora local

$ ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz

Ejemplo en vivo

$ ssh skinner "dd if=/dev/sda5 | gzip -1 -" | dd of=image.gz
208782+0 records in
208782+0 records out
106896384 bytes (107 MB) copied, 22.7608 seconds, 4.7 MB/s
116749+1 records in
116749+1 records out
59775805 bytes (60 MB) copied, 23.9154 s, 2.5 MB/s

$ ll | grep image.gz
-rw-rw-r--.   1 saml saml  59775805 May 31 01:03 image.gz

¿Métodos para el monitoreo?

  1. Inicie sesión a través sshde otra terminal y ls -lel archivo para ver cuál es su tamaño.
  2. Puede usar pvpara monitorear el progreso de una operación de dd grande, por ejemplo, para el ejemplo remoto anterior, puede hacer:

    $ dd if=/dev/sda | gzip -1 - | pv | ssh user@local dd of=image.gz
    
  3. Envíe una señal "SIGUSR1" dde imprimirá estadísticas. Algo como:

    $ pkill -USR1 dd
    

Referencias

Los métodos mencionados anteriormente para el monitoreo se dejaron originalmente a través de comentarios de @Ryan & @bladt y de mí mismo. Los moví a la respuesta para hacerlos más obvios.

slm
fuente
Intenté esto por un problema similar (copia de seguridad ONEdel disco duro de la computadora remota en TWOel almacenamiento de la computadora remota ), así: <br /> [root @ ONE] # dd if = / dev / sda1 | raíz ssh @ DOS dd of=/root/Public/ONE/sda1.img<br /> 409600 + 0 registros en 409600 + 0 registros 209715200 bytes (210 MB) copiados, 0.894929 s, 234 MB / s El pseudo-terminal no se asignará porque stdin no es una contraseña de raíz raíz @ TWO : El problema es que el /root/Public/ONE/sda1.imgarchivo se creó el ONE, no TWOcomo se esperaba ¿Cómo puedo solucionar esto?
Urhixidur
1
¿Alguien puede darnos un ejemplo de uso pvde la máquina local? Gracias.
TCB13
es mejor usar lbzip2 o pigz en lugar de gzip
Shimon Doodkin
¿por qué necesito "| dd of = image.gz" al final? (no solo "> image.gz") porque dd toma el 100% de una CPU
Shimon Doodkin
66
En cuanto a la supervisión: las versiones más nuevas de dd también tienen la status=progressopción. Por lo tanto, ya no necesita ejecutar pkill -USR1 dddesde otra terminal.
Hasta Schäfer el
12

El error que recibe se debe al uso de sudo de forma remota (se le pedirá la contraseña pero no tiene un tty para ingresarla). Por otro lado, como usuario normal, normalmente no puede usar simplemente ddcomo se sugiere en otra respuesta (no tiene los permisos necesarios para el dispositivo). Puede resolver el problema otorgándose derechos para ejecutar ddcomo sudo sin contraseña. Puede hacer esto editando el archivo sudoers (en el control remoto):

sudo visudo

agregue la siguiente línea:

userfoo ALL=(ALL) NOPASSWD: /bin/dd if=/dev/sdX

Ahora puedes emitir:

ssh userfoo@host "sudo /bin/dd if=/dev/sdX" | dd of=test.dd

y debería funcionar Puede hacer una entrada más genérica en sudoers, lo que le permite ejecutar ddcon cualquier parámetro, pero es más sabio mantener estos permisos gratuitos al mínimo que necesita.

elfantin
fuente
O bien, puede ejecutar 'sudo ls' en el extremo correspondiente (y escribir la contraseña), justo antes de ejecutar el comando 'sudo dd ...'
MikeW
Con las versiones más nuevas de dd, agregar status = progress incluso permite monitorear el progreso de la copia.
sensslen
7

Acabo de utilizar una versión modificada en un cuadro virtual Linux Mint para clonar un disco duro físico en un servidor RedHat antiguo.

Ejecuté lo siguiente como root en el cuadro virtual:

ssh [email protected] "dd if=/dev/cciss/c0d0" | dd of=/dev/sdb
  • 192.168.1.5 es el cuadro físico de Red Hat Enterprise Linux 2.1.
  • / dev / sdb es un nuevo disco virtual, que cuando termine la clonación será la base de una versión virtual del antiguo cuadro físico moribundo.
Fred Nerk
fuente