Como acelerar um dd de disco completo?

64

Estou fazendo um ddem duas unidades idênticas com este comando:

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

Ambos os discos rígidos são exatamente o mesmo número de modelo e ambos têm 1 TB de espaço de armazenamento. /dev/sda usa um tamanho de bloco de 4096. /dev/sdaé uma unidade local e /dev/sdbé um transportador remoto. Talvez eu consiga usar os seguintes protocolos:

  • USB2.0 HighSpeed ​​(atualmente o plano)
  • Clone Gigabit Over-The-Network (Realmente não quero nem tentar isso)
  • USB3.0 (se eu encontrar meu outro caddy de unidade)
  • eSATA (se eu encontrar / comprar um cabo)
  • SATA (se eu encontrar / comprar um cabo, tenho que amar unidades de CD de laptop)

Existe uma maneira de executar essa cópia da unidade que leva menos de 96 horas? Estou aberto a usar outras ferramentas além de dd.

Preciso clonar as seguintes partições (incluindo UUIDs)

  • Partição EFI Fat32 (*)
  • Partição Windows NTFS (*)
  • Partição HFS + OSX
  • Partição EXT4 Ubuntu (*)
  • Partição de troca (*)

* Apoiado por Clonezilla


Eu tentei o Clonezilla (e foi MUITO mais rápido), mas ele não suporta cópias inteligentes HFS +, o que eu preciso. Talvez a versão mais recente suporte isso?

Quando fiz meu primeiro clone, fiz todas as partições, exceto o HFS +, e foi muito rápido. (Não mais de 3 horas no total)

Kaz Wolfe
fonte
11
Você provavelmente está melhor usando algo como clonezilla. ddcopia tudo , incluindo espaço livre. As desvantagens se tornam extremamente aparentes quando você tem discos grandes que não estão completamente cheios.
Boris the Spider
É possível comprar um cabo SATA e conectar temporariamente a unidade externa a uma porta SATA na placa-mãe?
21868 Mark Plotnick
Talvez alguém possa elaborar o seguinte: Que tal clonar a tabela de partições (usando o clonezilla ou o dd), usando o Clonezilla para clonar todas as partições, exceto o HFS +, e usar o dd para essa partição? Isso seria viável?
Alexander
@ Alexander Foi assim que fiz meu primeiro clone.
Kaz Wolfe
11
@LuisAlvarado Acabei de iniciar o clone, cara!
Kaz Wolfe

Respostas:

71

Na minha experiência, não acho que exista algo mais rápido na linha de comando dd. Ajustar o bsparâmetro pode aumentar a velocidade, por exemplo, eu tenho 2 HDDs que sei que possuem uma velocidade de leitura / gravação maior que 100 MB / s, então faço isso:

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

Também há pv(Precisa ser instalado primeiro) que verifica a velocidade mais rápida em ambas as unidades e depois prossegue na clonagem. Isso deve ser feito, é claro, a partir da raiz:

pv < /dev/sda > /dev/sdb

Com PV eu tenho 156 MB / s

O lado bom da pvparte da velocidade é que ela mostra o progresso, a velocidade atual, o tempo desde o início e o ETA. Em relação ao HFS + eu não saberia, estou apenas tentando ajudar na parte "velocidade". Com pvou um bsparâmetro muito otimizado , você pode executar uma unidade de 4 TB em menos de 7 horas (6 horas e 50 minutos a uma velocidade atual de 150 MB / s).

insira a descrição da imagem aqui

Fiz alguns testes com os tipos de conexão que você estava usando e outros que eu tinha disponível. Eu estava usando o Asus Z87 Pro e o Intel DZ68DP. Esses foram meus resultados, mas primeiro precisamos saber que as velocidades teóricas para muitas taxas de transferência (velocidades brutas) são exatamente isso, teoria . Fazer testes reais revelou que eles estão entre 40% e 80% dessa velocidade bruta. Esses testes podem mudar dependendo do dispositivo usado, tipo de conexão, placa-mãe, tipo de cabo de conexão, tipo de sistema de arquivos e mais. Com isso em mente, é isso que recebi (só testei a velocidade de gravação no dispositivo, a leitura geralmente é maior):

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
fonte
3
envie o sinal USR1 para obter o progresso do dd. A desvantagem do dd é que ele copia o espaço livre.
jfs
11
Na minha experiência, o ajuste do bsparâmetro pode ser ddtão rápido quanto cat. Você também pode usar catem primeiro lugar.
Gilles 'SO- stop be evil'
3
pvpor si só funciona muito, muito bem.
Kaz Wolfe
11
Você pode usar o dd para fazer o trabalho, mas inserir PV na cadeia para monitorar a taxa de transferência da seguinte forma:dd if=/dev/sda1 | pv | dd of=/dev/sdb1
thomasrutter
4
Eu sempre usei pventre dds. Nunca soube que poderia ser usado sozinho!
korylprince
12

Para copiar uma partição por atacado, use em catvez dedd . Fiz benchmarks há algum tempo, copiando um arquivo grande em vez de uma partição, entre dois discos (no mesmo disco, os tempos relativos são 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

A conclusão deste benchmark é que a escolha do tamanho do bloco para ddassuntos (mas não tanto) e catautomaticamente encontra a melhor maneira de fazer uma cópia rápida: ddsó pode atrasá-lo. Com um tamanho pequeno de bloco, ddperde tempo perdendo pequenas leituras e gravações. Com um tamanho de bloco grande, um disco permanece ocioso enquanto o outro está lendo ou gravando. A taxa ideal é alcançada quando um disco lê enquanto o outro disco grava.

Para copiar uma partição, pode ser mais rápido copiar os arquivos cp -a. Isso depende de quantos arquivos existem e quanto do sistema de arquivos possui espaço livre. A cópia de arquivos tem uma sobrecarga aproximadamente proporcional ao número de arquivos, mas, por outro lado, a cópia de espaço livre desperdiça tempo.

A taxa máxima de dados para USB2 é um pouco abaixo de 50 MB / s, que dura de 6 a 7 horas para transferir 1 TB. Isso pressupõe um disco rígido rápido o suficiente para saturar o barramento USB; Acho que as unidades mais rápidas de 7200 rpm conseguem, mas 5900rpm podem não ser tão rápidas (talvez sejam para gravações lineares?).

Se qualquer um dos discos estiver sendo usado em paralelo, isso poderá diminuir consideravelmente a cópia, pois as cabeças dos discos precisarão se mover.

Gilles 'SO- parar de ser mau'
fonte
Estou tentando copiar um disco inteiro.
Kaz Wolfe
Espero que a diferença seja da mesma ordem, mas execute uma referência no seu sistema para obter dados mais confiáveis.
Gilles 'SO- stop be evil'
Pode catser usado para dd if=ubuntu.iso of=/dev/usb? ddA velocidade de fazer isso para USB2 ou USB3 é frustrantemente lenta.
precisa saber é o seguinte
11
@ Oxwivi Sim, cat ubuntu.iso >/dev/usbé exatamente equivalente. Não há mágica dd, é apenas uma ferramenta para copiar sua entrada para sua saída.
Gilles 'SO- stop be evil'
O comando cat dado acima não funcionou em um mac. Tentei sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1devolver "-bash: / dev / disk1: permissão negada"
Não
12

O problema é o seu tipo de conexão e o tamanho do bloco. Para obter resultados mais rápidos, o tamanho do seu bloco deve ser metade da velocidade de gravação mais baixa que você normalmente recebe. Isso lhe dará uma margem segura, mas ainda permitirá um grande número; é claro que você também precisa ter memória RAM suficiente para armazenar os dados.

O USB 2.0 é de 12 megabits por segundo (Mbps), o USB 2.0 de alta velocidade é de 480 Mbps. Essa é obviamente a velocidade bruta; com 8 bits em um byte e sobrecarga de estrutura, a velocidade utilizável em MB / s geralmente é uma casa decimal. Assim, por exemplo, 480 raw, torna-se 48MBs utilizável. Lembre-se de que este é o melhor em matemática, no mundo real será um pouco menor. Para conexões de alta velocidade USB 2.0, você deve esperar algo em torno de 30 a 35 MBs de velocidade máxima de gravação, desde que o dispositivo de armazenamento real possa igualar ou superar as velocidades de conexão.

Companheiro
fonte
6
Unidade nitpicking: USB2.0 de alta velocidade é 480 Mbit / s = 60 MByte / s, velocidade bruta. A velocidade utilizável não é uma casa decimal, mas sim cerca de 80% da velocidade bruta. A regra prática "velocidade real em MByte / s é 1/10 da velocidade bruta em Mbit / s" é válida.
jpa
5

Concordo que a velocidade bruta de um ddcomando bem sintonizado ('pv') ou 'cat' é difícil de superar, mas se houver algum problema com a cópia (setor defeituoso, falta de energia, erro do usuário, etc.), é necessário iniciar sobre.

Gostaria de sugerir o ddrescue - uma ferramenta FOSS que tem toda a velocidade do dd, mas que soluciona erros de disco e é retomada posteriormente, se houver uma falha.

dan_linder
fonte
2

Estou mudando o Windows 7 de um HD para SSD e encontrei esta e algumas outras respostas ... Algo que aprendi que pode ajudar outras pessoas. No meu caso, a unidade de origem é maior, caso contrário, eu teria trabalhado no nível do dispositivo / dev / sda -> / dev / sdb.

Win7 e suas 3 partições ... Eu usei o Xbuntu 14.04 live cd em um usb. Retirou o DVD do computador da vitória e colocou o SSD em seu lugar. Instalou o partclone e tentou o seguinte:

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

O Partclone vomitou nos ntfs que precisavam de execução do chkdisk no Windows, portanto, uma solução rápida deixou o partclone satisfeito:

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

Todos os comandos são executados como raiz. A interface do usuário ncurses da Partclone (a opção -N) disse que a transferência foi de 7 GB / min e terminou em 5 GB / min, o que equivale a 83 MB / s. A grande parte é que o partclone não copia o espaço não utilizado, então isso tornou o clone notavelmente rápido.

Gotchyas potenciais adicionais:

  • se a unidade para a qual você está transferindo foi usada anteriormente, pode haver restos de uma GPT. As instalações de fábrica do Windows 7 geralmente são tabelas de partição msdos / mbr. Você precisará remover os fragmentos GPT da unidade de destino. Esse controle de qualidade do Unix e Linux me ajudou com isso. Você deve usar gdiskno dispositivo, x e z e yes para zap dados de GPT e certifique-se de manter o MBR.

  • E não esqueça que, se você não fizer um dd no nível do dispositivo, será necessário copiar o MBR usando
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    onde sdb é a fonte ou a unidade antiga e sda ​​é o destino ou a nova unidade ( origem )

Chris K
fonte
1

Recentemente, criei uma imagem da partição de 100GB (HDD) e a grave no novo disco SSD.

Aqui está uma dica que pode acelerar drasticamente o processo :)

Divida o arquivo em partes menores (quanto maior o arquivo, mais lento ele funciona)

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

Durante o processo, você pode verificar a velocidade usando (em um terminal separado)

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

Em seguida, quando você tiver um diretório cheio de arquivos de resultados (maindisk.img000, maindisk.img001 e assim por diante ...) use

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

para 'gravar' a imagem no novo partiton do SSD (a partição deve ter o mesmo tamanho da antiga)

Para mim, funcionou muito mais rápido do que o normal (sem dividir). A velocidade média de criação da imagem foi de ~ 13 MB / s. Quando uso o modo 'normal', ele começa com ~ 15 MB / se depois diminui para 1 MB / s.

matowc1991
fonte
11
Por que seria mais lento gravar um arquivo grande em vez de vários arquivos menores? Quais eram o tipo de sistema de arquivos de destino e seus sinalizadores de montagem?
David Foerster
Também conv=syncé prejudicial ao desempenho e bastante inútil nesse caso de uso.
David Foerster
0

Para quem encontra esse segmento, é muito mais fácil e rápido usar apenas uma ferramenta projetada para recuperação de dados como o ddrescue . Ele tenta resgatar as partes boas primeiro em caso de erros de leitura. Além disso, você pode interromper o resgate a qualquer momento e retomar mais tarde no mesmo ponto.

Execute-o duas vezes:

Primeira rodada, copie todos os blocos sem erros de leitura e registre os erros em rescue.log.

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

Segunda rodada, copie apenas os blocos defeituosos e tente 3 vezes a leitura da fonte antes de desistir.

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

Agora você pode montar a nova unidade e verificar se há danos no sistema de arquivos.

Mais informações:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html

goetzc
fonte
0

Eu recomendaria a entrada / leitura - arquivo / disco para estar no SATA para aumentar a velocidade de leitura. A alta velocidade USB 2.0 também é boa, pois estou obtendo velocidades médias de 33816 kb / s com ddrescue em comparação com quando a configuração era USB 2.0 para SATA a 2014 kb / s

NateNjugush
fonte
0

Use um tamanho de bloco diferente. É a quantidade de dados que ddlê por vez. Se a leitura for muito pequena, uma parcela maior de tempo será gasta na lógica do programa e, se for lido muito, será gasto muito tempo movimentando os grandes dados.

Para medir a velocidade em diferentes tamanhos de bloco, use o seguinte bashscript:

  • definido $devpara o dispositivo
  • corrigir cbtotalpara ser pelo menos 5x a velocidade de leitura 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)

O resultado pode ser enviesado para um tamanho maior devido à leitura do disco a seguir - é por isso que é importante definir um cbtotaltamanho suficiente.

ivan_pozdeev
fonte