Eu li meia hora lendo para me preparar para clonar meu disco rígido. Possui várias partições, incluindo uma partição do Windows. Vou comprar um disco rígido externo muito grande para o backup. Eu gostaria de poder usar esse clone para restaurar toda a unidade, caso algo dê errado (estou prestes a fazer uma reorganização do SO). Quero aprender como fazer isso usando o dd, pois gosto de ferramentas de baixo nível que não exigem a instalação de nada.
Encontrei o seguinte código útil nos fóruns do ubuntu (digitados a partir de um shell raiz usando um CD ao vivo):
dd if=/dev/hda of=/dev/hdb & pid=$!
while kill -USR1 $pid; do sleep 1; done
(Eu sei que terei que editar os locais de entrada e saída.) No entanto, tenho duas perguntas. O primeiro é muito noobie: esse comando é dividido em duas linhas. Certamente, quando eu pressionar enter após o ponto de exclamação, ele iniciará o processo?
Segundo, em outros sites, recomenda-se inserir o tamanho do bloco. Como isso:
# dd if=/dev/hda conv=sync,noerror bs=64K of=/mnt/sda1/hda.img
Não sei nada sobre tamanhos de bloco. 64K está certo? Parece que o tamanho do meu bloco é de 512 bytes, a saída do sudo fdisk -ul:
Disk /dev/sda: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders, total 1465149168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xc3ffc3ff
Device Boot Start End Blocks Id System
/dev/sda1 * 63 143364059 71681998+ 7 HPFS/NTFS/exFAT
Partition 1 does not start on physical sector boundary.
/dev/sda2 976867328 1465147391 244140032 7 HPFS/NTFS/exFAT
/dev/sda3 143364094 976867327 416751617 5 Extended
Partition 3 does not start on physical sector boundary.
/dev/sda5 143364096 162895871 9765888 82 Linux swap / Solaris
/dev/sda6 162897920 205864959 21483520 83 Linux
/dev/sda7 205867008 976867327 385500160 83 Linux
Partition table entries are not in disk order
Disk /dev/mapper/cryptswap1: 10.0 GB, 10000269312 bytes
255 heads, 63 sectors/track, 1215 cylinders, total 19531776 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x433bb3a7
Disk /dev/mapper/cryptswap1 doesn't contain a valid partition table
Obrigado.
dd if=/dev/hda of=hdb
? Aqui está uma resposta que mostra alguns detalhes, incluindo tempo de execução para 160 GB: askubuntu.com/questions/435694/...dd
inclui um interruptor de progresso como mencionado aquiRespostas:
Progresso
O comando que você listou
é uma ótima linha dupla para obter o progresso
dd
regularmente. Eu uso um muito semelhante também. Parece bom. Encontrou aqui talvez?Blocos de tamanhos com
dd
: alinhamento e desempenhoVocê pode adicionar um tamanho de bloco no qual as operações ocorrem. Não importa qual é o tamanho do bloco do dispositivo de bloco subjacente para que a operação seja executada igualmente bem, mas por razões de desempenho, você pode escolher um que atenda às suas necessidades.
Primeiro de tudo, há o alinhamento . Caso seu dispositivo de bloco opere com 512 KB (como as unidades flash), seria muito lamentável executar
dd
combs=512
(bytes), pois isso causará 1024 gravações (!) Para cada bloco da perspectiva do dispositivo. Na prática, não será tão ruim assim, pois as gravações são armazenadas em buffer e levadas de uma só vez, mas durante as sincronizações ainda é possível amplificar bastante a quantidade de gravações.Considere também a sobrecarga simples de uso da CPU ao lidar com uma quantidade muito grande de pequenas operações. É apenas mais eficiente consumir megabytes de uma só vez ao copiar grandes quantidades de dados.
Minha prática recomendada é começar com 1 MB, já que é uma boa variedade da maioria das configurações, incluindo tamanhos de faixa RAID, tamanhos de extensão LVM etc. No meu laptop com SSD, costumo ver uma leve melhora usando 10 MB como tamanho de bloco, enquanto eu não vejo mais isso no meu disco rígido físico.
Último bloco
Não se preocupe com o tamanho da unidade / volume não ser múltiplo do tamanho do bloco. O último bloco
dd
copiado será ajustado para corresponder ao último bit de dados nele. Você pode ver se o último bloco tinha um tamanho diferente, observando a saída.O
+0
meio que era uma correspondência exata, o+1
meio que não era. Nada demais.Veja também
fonte
# dd if=/dev/hda conv=sync,noerror bs=1MB of=/mnt/sda1/hda.img & pid=$!
while kill -USR1 $pid; do sleep 1; done
bs=1M
que é uma potência de 2, em vez debs=1MB
ser uma potência de 10. Mas basta executar alguns benchmarks no seu sistema se você puder ver o que é melhor.kill -USR1 $pid
dd agora tenha um relatório de progresso disponível adicionando astatus=progress
opçãoComo outros já disseram, não há tamanho de bloco universalmente correto; o que é ideal para uma situação ou uma peça de hardware pode ser terrivelmente ineficiente para outra. Além disso, dependendo da integridade dos discos, pode ser preferível usar um tamanho de bloco diferente do que é "ideal".
Uma coisa que é bastante confiável no hardware moderno é que o tamanho padrão do bloco de 512 bytes tende a ser quase uma ordem de magnitude mais lenta que uma alternativa mais ideal. Na dúvida, descobri que 64K é um padrão moderno bastante sólido. Embora 64K geralmente não seja o tamanho ideal de bloco, na minha experiência, ele tende a ser muito mais eficiente que o padrão. O 64K também tem um histórico bastante sólido de desempenho confiável: Você pode encontrar uma mensagem na lista de discussão Eug-Lug , por volta de 2002, recomendando um tamanho de bloco de 64K.
Para determinar o tamanho ideal do bloco de saída, escrevi o seguinte script que testa a gravação de um arquivo de teste de 128M com dd em vários tamanhos de bloco, do padrão de 512 bytes a um máximo de 64M. Esteja avisado, este script usa dd internamente, portanto, use com cuidado.
dd_obs_test.sh
:Ver no GitHub
Eu testei esse script apenas em um sistema Debian (Ubuntu) e no OSX Yosemite, portanto, provavelmente será necessário algum ajuste para fazer funcionar outros tipos de Unix.
Por padrão, o comando criará um arquivo de teste nomeado
dd_obs_testfile
no diretório atual. Como alternativa, você pode fornecer um caminho para um arquivo de teste personalizado, fornecendo um caminho após o nome do script:A saída do script é uma lista dos tamanhos de bloco testados e suas respectivas taxas de transferência da seguinte forma:
(Nota: a unidade das taxas de transferência variará de acordo com o sistema operacional)
Para testar o tamanho ideal do bloco de leitura, você pode usar mais ou menos o mesmo processo, mas em vez de ler
/dev/zero
e gravar no disco, você deve ler e gravar no disco/dev/null
. Um script para fazer isso pode ser assim:dd_ibs_test.sh
:Ver no GitHub
Uma diferença importante nesse caso é que o arquivo de teste é um arquivo gravado pelo script. Não aponte este comando para um arquivo existente ou o arquivo existente será substituído por dados aleatórios!
Para meu hardware em particular, descobri que 128K era o tamanho de bloco de entrada mais ideal em um HDD e 32K era o melhor em um SSD.
Embora essa resposta cubra a maioria das minhas descobertas, eu precisei determinar um tamanho ideal de bloco dd o suficiente para escrever um post sobre isso. Você pode encontrar mais detalhes sobre os testes que realizei lá.
Esta publicação do StackOverflow também pode ser útil: dd: Como calcular o tamanho ideal do bloco?
fonte