¿Cómo aceleraría un disco completo dd?

64

Estoy haciendo un dden dos unidades idénticas con este comando:

 dd if=/dev/sda of=/dev/sdb bs=4096

Ambos discos duros tienen exactamente el mismo número de modelo y ambos tienen 1 TB de espacio de almacenamiento. /dev/sda utiliza un tamaño de bloque de 4096. /dev/sdaes un disco local y /dev/sdbes un carrito remoto. Podría utilizar los siguientes protocolos:

  • USB2.0 HighSpeed ​​(actualmente el plan)
  • Clon Gigabit Over-The-Network (Realmente no quiero ni siquiera probar esto)
  • USB3.0 (si encuentro mi otro caddy de unidad)
  • eSATA (si encuentro / compro un cable)
  • SATA (si encuentro / compro un cable, me encantan las unidades de CD de las laptops)

¿Hay alguna forma de ejecutar esta copia de la unidad que demore menos de 96 horas? Estoy abierto a usar otras herramientas que no sean dd.

Necesito clonar las siguientes particiones (incluidos los UUID)

  • Partición Fat32 EFI (*)
  • Partición de Windows NTFS (*)
  • Partición HFS + OSX
  • Partición EXT4 Ubuntu (*)
  • Partición de intercambio (*)

* Apoyado por Clonezilla


He intentado Clonezilla (y fue MUCHO más rápido), pero no es compatible con la copia inteligente HFS +, que necesito. ¿Quizás la versión más reciente lo admite?

Cuando hice mi primer clon, hice todas las particiones excepto HFS + y fue muy rápido. (No más de 3 horas en total)

Kaz Wolfe
fuente
1
Probablemente sea mejor usar algo como clonezilla. ddcopia todo , incluido el espacio libre. Las desventajas se vuelven extremadamente evidentes cuando tienes discos grandes que no están completamente llenos.
Boris the Spider
¿Es posible comprar un cable SATA y conectar temporalmente la unidad externa a un puerto SATA en la placa base?
Mark Plotnick
Quizás alguien podría explicar lo siguiente: ¿Qué tal clonar la tabla de particiones (usando clonezilla o dd), usar Clonezilla para clonar todas las particiones excepto HFS +, y usar dd para esa partición? ¿Sería esto factible?
Alexander
@Alexander Así es como hice mi primer clon.
Kaz Wolfe
1
@LuisAlvarado ¡Acabo de comenzar el clon, hombre!
Kaz Wolfe

Respuestas:

71

En mi experiencia, no creo que haya algo más rápido en la línea de comando como dd. Ajustar el bsparámetro puede aumentar la velocidad, por ejemplo, tengo 2 HDD que sé que tienen una velocidad de lectura / escritura mayor de 100 MB / s, así que hago esto:

dd if=/dev/sda of=/dev/sdb bs=100M

También hay pv(debe instalarse primero) que verifica la velocidad más rápida en ambas unidades y luego procede a la clonación. Esto tiene que hacerse, por supuesto, desde la raíz:

pv < /dev/sda > /dev/sdb

Con PV obtuve 156 MB / s

Lo bueno de pvaparte de la velocidad es que muestra el progreso, la velocidad actual, el tiempo desde que comenzó y ETA. En lo que respecta a HFS + no lo sabría, solo estoy tratando de ayudar en la parte de "velocidad". Con pvun bsparámetro muy optimizado , puede hacer una unidad de 4 TB en menos de 7 horas (6 horas y 50 minutos a una velocidad actual de 150 MB / s).

ingrese la descripción de la imagen aquí

Hice un par de pruebas con los tipos de conexión que estaba usando y otras que tenía disponibles. Estaba usando el Asus Z87 Pro y el Intel DZ68DP. Estos fueron mis resultados, pero primero necesitamos saber que las velocidades teóricas para muchas tasas de transferencia (velocidades sin procesar) son solo eso, teoría . Hacer pruebas reales reveló que están entre el 40% y el 80% de esa velocidad bruta. Estas pruebas pueden cambiar según el dispositivo utilizado, el tipo de conexión, la placa base, el tipo de cable de conexión, el tipo de sistema de archivos y más. Con eso en mente, esto es lo que obtuve (solo probé la velocidad de escritura en el dispositivo, la lectura suele ser mayor):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 
Luis Alvarado
fuente
3
envíe la señal USR1 para obtener el progreso de dd. La desventaja de dd es que copia espacio libre.
jfs
1
En mi experiencia, ajustar el bsparámetro puede hacerlo ddtan rápido como cat. También podrías usarlo caten primer lugar.
Gilles 'SO- deja de ser malvado'
3
pvPor sí solo funciona muy, muy bien.
Kaz Wolfe
11
Puede usar dd para hacer el trabajo, pero inserte pv en la cadena para controlar la velocidad de transferencia de esta manera:dd if=/dev/sda1 | pv | dd of=/dev/sdb1
thomasrutter
44
Siempre he usado pventre dds. ¡Nunca supe que podría usarse de forma independiente!
korylprince
12

Para copiar una partición al por mayor, use en catlugar dedd . Hace un tiempo ejecuté puntos de referencia , copiando un archivo grande en lugar de una partición, entre dos discos (en el mismo disco, los tiempos relativos son diferentes):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

La conclusión de este punto de referencia es que la elección del tamaño de bloque para los ddasuntos (pero no tanto), y catautomáticamente encuentra la mejor manera de hacer una copia rápida: ddsolo puede ralentizarlo. Con un tamaño de bloque pequeño, ddpierde el tiempo perdiendo pequeñas lecturas y escrituras. Con un tamaño de bloque grande, un disco permanece inactivo mientras que el otro está leyendo o escribiendo. La tasa óptima se logra cuando un disco lee mientras el otro disco escribe.

Para copiar una partición, puede ser más rápido copiar los archivos con cp -a. Esto depende de cuántos archivos haya y cuánto del sistema de archivos sea espacio libre. Copiar archivos tiene una sobrecarga que es más o menos proporcional a la cantidad de archivos, pero por otro lado, el espacio libre desperdicia tiempo.

La velocidad máxima de datos para USB2 es un poco menos de 50 MB / s, lo que equivale a 6–7 horas para transferir 1TB. Esto supone un disco duro que es lo suficientemente rápido como para saturar el bus USB; Creo que las unidades más rápidas de 7200 rpm pueden hacerlo, pero 5900rpm podría no ser tan rápido (¿tal vez son para escrituras lineales?).

Si cualquiera de los discos está en uso en paralelo, esto puede ralentizar considerablemente la copia, ya que los cabezales del disco deberán moverse.

Gilles 'SO- deja de ser malvado'
fuente
Sin embargo, estoy tratando de copiar un disco completo.
Kaz Wolfe
Espero que la diferencia sea del mismo orden, pero ejecute un punto de referencia en su sistema para obtener datos más confiables.
Gilles 'SO- deja de ser malvado'
Se catpuede utilizar para dd if=ubuntu.iso of=/dev/usb? ddLa velocidad para hacer esto a USB2 o USB3 es frustrantemente lenta.
Oxwivi
1
@Oxwivi Sí, cat ubuntu.iso >/dev/usbes exactamente equivalente. No hay magia dd, es solo una herramienta para copiar su entrada a su salida.
Gilles 'SO- deja de ser malvado'
El comando cat dado anteriormente no funcionó en una Mac. Intenté sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1recuperar "-bash: / dev / disk1: Permiso denegado"
No,
12

El problema es su tipo de conexión y el tamaño del bloque. Para obtener los resultados más rápidos, el tamaño de su bloque debe ser la mitad de la velocidad de escritura más baja que normalmente recibe. Esto le dará un margen seguro, pero aún permitirá un gran número; por supuesto, también necesitas tener suficiente ram para guardar los datos.

Usb 2.0 es de 12 megabits por segundo (Mbps), Usb 2.0 de alta velocidad es de 480 Mbps. Esta es, por supuesto, la velocidad bruta; con 8 bits en un byte y sobrecarga de trama, la velocidad utilizable en MB / s suele ser un decimal. Así, por ejemplo, 480 sin formato, se convierte en 48 MB utilizables. Tenga en cuenta que este es el mejor matemático, en el mundo real será un poco más bajo. Para las conexiones de alta velocidad usb 2.0, debe esperar una velocidad máxima de escritura de alrededor de 30-35 MB, siempre que el dispositivo de almacenamiento real pueda igualar o superar las velocidades de conexión.

Compañero
fuente
66
Unidad de nitpicking: USB2.0 High Speed ​​es 480 Mbit / s = 60 MByte / s, velocidad bruta. La velocidad utilizable no es un lugar decimal, sino más bien un 80% de la velocidad bruta. Sin embargo, la regla general "la velocidad real en MByte / s es 1/10 de la velocidad bruta en Mbit / s" es válida.
jpa
5

Estoy de acuerdo en que la velocidad bruta de un ddcomando bien sintonizado ('pv') o 'cat' es difícil de superar, pero si hay algún problema con la copia (sector defectuoso, falla de energía, error del usuario, etc.), entonces debe comenzar terminado.

Me gustaría sugerir ddrescue , una herramienta FOSS que tiene toda la velocidad de dd pero que evitará errores en el disco y se reanudará en un momento posterior si hay una falla.

dan_linder
fuente
2

Estoy moviendo Windows 7 de un HDD a SSD y encontré esta y algunas otras respuestas ... Algo que aprendí que podría ayudar a otros. En mi caso, la unidad de origen es más grande, de lo contrario, habría trabajado en el nivel de dispositivo / dev / sda -> / dev / sdb.

Win7 y sus 3 particiones ... Usé Xbuntu 14.04 live cd en un usb. Apareció el DVD de la computadora win y colocó el SSD en su lugar. Instalé Partclone y probé esto:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone vomitó en los NTFS que necesitaban ejecutar chkdisk en Windows, por lo que una solución rápida hizo feliz a Partclone:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

Todos los comandos se ejecutan como root. La interfaz de usuario ncurses de Partclone (la opción -N) dice que la transferencia fue de 7GB / min y terminó en 5GB / min, lo que equivale a 83MB / seg. La gran parte es que el clon parcial no copia el espacio no utilizado, por lo que esto hizo que el clon sea notablemente rápido.

Gotchyas potenciales adicionales:

  • si la unidad a la que está transfiriendo se utilizó anteriormente, podría tener restos de un GPT. Las instalaciones de fábrica de Windows 7 suelen ser tablas de partición msdos / mbr. Deberá eliminar los fragmentos GPT de la unidad de destino. Este control de calidad de Unix y Linux me ayudó con esto. Debe usarlo gdisken el dispositivo, use x, luego z y sí para eliminar los datos GPT y asegúrese de MANTENER el MBR.

  • Y no olvide que si no hace un dd de nivel de dispositivo, deberá copiar el MBR usando
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    donde sdb es la fuente o la unidad anterior y sda es el destino o la nueva unidad ( fuente )

Chris K
fuente
1

Recientemente he estado creando una imagen de partición de 100 GB (HDD) y la escribí en el nuevo disco SSD.

Aquí hay un consejo que puede acelerar drásticamente el proceso :)

Dividir el archivo en partes más pequeñas (cuanto más grande es el archivo, más lento funciona)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

Durante el proceso, puede verificar la velocidad usando (en una terminal separada)

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

Luego, cuando tenga un directorio lleno de archivos de resultados (maindisk.img000, maindisk.img001, etc.) use

sudo cat maindisk.img* | sudo dd of=/dev/sda1

para 'quemar' la imagen en la nueva partición de SSD (la partición debe ser del mismo tamaño que la anterior)

Para mí funcionó mucho más rápido de lo habitual (sin dividir). La velocidad promedio de creación de la imagen fue de ~ 13 MB / s. Cuando uso la forma 'normal', comienza con ~ 15 MB / sy luego disminuye a 1 MB / s.

matowc1991
fuente
1
¿Por qué sería más lento escribir un archivo grande en lugar de varios archivos más pequeños? ¿Cuál fue el tipo de sistema de archivos de destino y sus banderas de montaje?
David Foerster
También conv=synces perjudicial para el rendimiento y bastante inútil en este caso de uso.
David Foerster
0

Para cualquiera que encuentre este hilo, es mucho más fácil y rápido usar una herramienta diseñada para la recuperación de datos como ddrescue . Intenta rescatar las partes buenas primero en caso de errores de lectura. También puede interrumpir el rescate en cualquier momento y reanudarlo más tarde en el mismo punto.

Ejecútalo dos veces:

Primera ronda, copie cada bloque sin error de lectura y registre los errores en rescue.log.

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

Segunda ronda, copie solo los bloques defectuosos e intente leer 3 veces desde la fuente antes de darse por vencido.

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

Ahora puede montar la nueva unidad y verificar si el sistema de archivos está dañado.

Más información:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html

goetzc
fuente
0

Recomendaría que la entrada / lectura - archivo / disco esté en SATA para aumentar las velocidades de lectura. La velocidad alta de USB 2.0 también es buena, ya que obtengo velocidades promedio de 33816 kb / s con ddrescue en comparación con cuando la configuración era USB 2.0 a SATA a 2014 kb / s

NateNjugush
fuente
0

Use un tamaño de bloque diferente. Es la cantidad de datos que se ddlee a la vez. Si se lee muy poco, se gasta una mayor cantidad de tiempo en la lógica del programa y si se lee demasiado, se pasa mucho tiempo moviendo los datos grandes.

Para medir la velocidad en diferentes tamaños de bloque, use el siguiente bashscript:

  • establecer $deven el dispositivo
  • arregle cbtotalpara ser al menos 5 veces su velocidad de lectura esperada
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

El resultado puede estar sesgado hacia un tamaño más grande debido a la lectura del disco por delante, por eso es importante establecer lo cbtotalsuficientemente grande.

ivan_pozdeev
fuente