Eu preciso copiar um disco para outro. Eu tentei com o comando abaixo e leva quase um dia para copiar 1 TB de disco no federo.
dd if=/dev/sda of=/dev/sdb
Tentei o mesmo em um sistema Unix (HP-UX) com o comando abaixo e ele é concluído dentro de algumas horas
dd if=/dev/sda of=/dev/rdsk
Qual é a alternativa que eu poderia usar para copiar de disco para disco o mais rápido?
cp /dev/sda /dev/sdb
ou (pv /dev/sda > /dev/sdb
para obter uma barra de progresso) seria muito mais rápido. Por que você usariadd
aqui?dd
seria útil apenas em coisas comoconv=sync,noerror
manipular discos com erros, mas mesmo assim faria mais sentido usar coisas como essasddrescue
(veja tambémpv
a-E
opção de).cat
pode ser ainda mais rápido, mas a diferença não é tão dramática (talvez maior para dispositivo para dispositivo que arquivo para arquivo, como no meu experimento).dd
armadilha # 1Respostas:
dd
tem muitas opções (estranhas), veja dd (1) .Você deve declarar explicitamente o tamanho do buffer, então tente
IIRC, o tamanho padrão do buffer é de apenas 512 bytes. O comando acima o define para 16 megabytes. Você pode tentar algo menor (por exemplo
bs=1M
), mas deve usar mais do que o padrão (especialmente em hardware de disco recente com setores de 4Kbytes, ou seja, Formato Avançado ). Ingenuamente, recomendo uma potência de dois, que é pelo menos um megabyte.Com o tamanho padrão do buffer de 512 bytes, acho (mas posso estar muito errado) que o hardware exige que o kernel transfira 4K para cada bloco de 512 bytes.
A respeito
rdsk
, as páginas de manual do sd (4) dizem:O aumento do tamanho do buffer do dd fornecerá mais desempenho para operações de leitura e gravação. Agora todos os discos possuem buffer de leitura / gravação de hardware. Mas se você aumentar o tamanho do buffer do dd mais do que o buffer do hardware, seu desempenho diminuirá porque o dd lerá do primeiro disco para o buffer quando o segundo disco tiver gravado tudo a partir de seu próprio buffer de hardware. Você precisa definir a
bs
opção do comando dd sempre que um valor diferente para dispositivos diferentes.fonte
cat
tão bem (para transferência de sistema de arquivos para sistema de arquivos, bloco a bloco direto pode ter características de desempenho diferentes). No entanto, a diferença não foi dramática em nenhum caso./dev/rdiskX
como destino durante o desempenhodd
.status=progress
que imprimirá todo o progresso da operação.Anos atrás, no Unix-land,
dd
era a maneira necessária de copiar um dispositivo de bloco. Isso avançou como conhecimento do culto à carga, embora (em sistemas baseados em Linux, pelo menos)cat
seja quase sempre mais rápido quedd
.No entanto, mesmo no histórico, um tamanho de bloco decente ajudou a reduzir o número de chamadas (lentas) do sistema, uma vez que cada chamada do sistema acionava uma operação de E / S. O tamanho padrão do bloco é 512 bytes (um setor de disco). A coleta de vários blocos de disco em uma única leitura também foi - e é - aceitável. Este exemplo usa um tamanho de bloco de 32 MB:
Nos sistemas atuais baseados em Linux, os discos podem ser copiados com mais eficiência com um simples
cat
(Conforme observado nos comentários da sua pergunta,
pv
pode ser substituídocat
e fornecerá uma indicação do progresso e da taxa de transferência.)fonte
Geralmente,
dd
pode ser evitado em favor de algumas alternativas. Existem várias boas razões para usar o GNUddrescue
. No Ubuntu, você pode instalá-lo com:e simples
ddrescue
de usar. Observe que, diferentemente do nome do pacote, o executável não possui a inicialg
.Usá-lo é tão simples quanto:
O arquivo de log (com o nome que você escolher) permite pausar / parar e reiniciar, sem refazer o trabalho anterior, o que é útil ao fazer clones grandes ou recuperar discos. Por padrão, ele exibe o progresso, a velocidade atual da cópia, a velocidade média da cópia e o número de blocos inválidos encontrados.
Ele usa padrões sensíveis para o tamanho do bloco, portanto, a velocidade da cópia é sempre a mais rápida que o dispositivo pode suportar, pelo menos na minha experiência (eu já clonei muitas centenas de unidades com todos os tamanhos e tipos).
Muitas vezes, as unidades que estão começando a falhar apresentam problemas de velocidade, como manchas ocasionais de lentidão, baixa velocidade média, pausas longas repentinas (setores defeituosos) ou redefinições completas (erros graves de superfície).
ddrescue
pode ajudá-lo a identificar todas as opções acima e reiniciar seu clone (desde que você tenha especificado um arquivo de log), mesmo que sua unidade esteja se redefinindo.fonte
Muito boa pergunta. A interface bruta é implementada em alguns sistemas unix (tru64, hpux, solaris), mas não no linux. A interface bruta facilita a transferência porque a E / S unix é ignorada. A interface do bloco (
/dev/dsk
ou/dev/disk
) é mais lenta porque usa o sistema de E / S unix. Para acelerardd
(gnu dd can) usebs=30M
oubs=20M
dependendo do seu hw. A resposta curta é: NÃO, não está implementada, pelo menos até onde eu sei. Estou usando o linux desde os tempos antigos da versão 2.2 do kernel e nunca vi issordsk
usado no unix.fonte