Eu não usei dd
muito, mas até agora ainda não me falhou. No momento, eu trabalho dd
há mais de 12 horas - estou gravando uma imagem no disco de onde veio - e estou ficando um pouco preocupado, pois consegui dd
do disco para a imagem em cerca de 7 horas.
Estou executando o OSX 10.6.6 em um MacBook com Core 2 Duo a 2,1ghz / core com 4GB de RAM. Estou lendo um arquivo .dmg em um disco rígido de 7200rpm (a unidade de inicialização) e estou gravando em uma unidade de 7200rpm conectada através de um conector SATA para USB. Deixei o tamanho do bloco como padrão e a imagem tem cerca de 160 gb.
EDIT: E, após 14 horas de puro estresse, dd
funcionou perfeitamente depois de tudo. Da próxima vez, porém, eu irei analisá-lo pv
e acompanhá-lo strace
. Obrigado a todos por toda a sua ajuda.
fonte
dd ... bs=16M
é minha sugestão, dada a sua RAM, tamanho e velocidade do disco.dd
no Mac OS X, a tendência é congelar até o ponto em que não consigo nem matar o processo, mas preciso reiniciar o sistema. Então, eu recorro ao trabalho em uma VM Linux.Respostas:
Você pode enviar
dd
um determinado sinal usando okill
comando para fazer com que ele produza seu status atual. O sinal estáINFO
nos sistemas BSD (incluindo OSX) eUSR1
no Linux. No seu caso:Você pode encontrar a identificação do processo (
$PID
acima) com ops
comando; ou consulte as alternativas pgrep e pkill no mac os x para obter métodos mais convenientes.Mais simplesmente, como AntoineG aponta em sua resposta , você pode digitar
ctrl-T
no shell executando dd para enviar oINFO
sinal.Como um exemplo no Linux, você pode fazer com que todos os
dd
processos ativos produzam status como este:Depois de emitir seu status,
dd
continuará enfrentando.fonte
pkill -USR1 -x dd
INFO
sinal. O Linux não possui um SIGINFO e utilizaUSR1
.dd if=/dev/zero of=/dev/null
. :)No OS X (não tente no Linux), você pode simplesmente digitar Ctrl+ Tno terminal em execução
dd
. Ele imprimirá a mesma saída quekill -INFO $PID
, além do uso da CPU:Descobri lendo este tópico e tentando abrir uma nova guia no meu terminal, mas misturando ⌘+ Tcom Ctrl+ T.
fonte
load
é o uso da CPU?^T
para o terminal.Para
dd
, você pode enviar um sinal . Para outros comandos que estão lendo ou gravando em um arquivo, você pode observar a posição deles no arquivolsof
.Se você planeja com antecedência, canalize os dados
pv
.fonte
pv
parece apenas o bilhete.Uma maneira mais geral é usar o
iotop
que exibe a quantidade atual de leitura / gravação em disco por programa.EDIT:
iotop -o
mostra apenas programas que realizam operações de E / S atualmente (agradecemos a Jason C por esse comentário).fonte
iotop -o
ocultará processos que não estão executando E / S e facilitará a visualização rápida do que está acontecendo.Eu costumo me conectar
strace
a esse processo em execução (com a-p $PID
opção) para ver se ele permanece bloqueado em uma chamada do sistema ou se ainda está ativo.Ou, se você estiver nervoso por enviar um sinal para o dd em execução, inicie outro dd para validar se isso funciona.
fonte
strace
? Além disso, eu comecei outrodd
e enviei um dos sinais sugeridos para ele, e ... ele o matou.Para a próxima vez, você pode usar apenas
pv
desde o início (se estiver disponível através do seu gerenciador de pacotes, instale-o). Este é um utilitário com o único objetivo de canalizar a entrada para a saída e monitorar o progresso e a velocidade.Em seguida, para gravar uma imagem em uma unidade, digamos com tamanho de bloco de 4 MB:
Além do buffer inicial (compensado por uma sincronização final, que pode ser feita
dd
se você quiser), isso mostrará uma barra de progresso, velocidade média, velocidade atual e ETA.A
iflag=fullblock
opção força o dd a pegar blocos completos de entradapv
, caso contrário, você estará à mercê do tubo para tamanhos de bloco.Para ir para o outro lado, use dd para ler e pv para escrever, embora você precise especificar explicitamente o tamanho se a fonte for um dispositivo de bloco. Para um dispositivo de 4 GB:
Você também pode determinar o tamanho automaticamente, algo como:
Realmente não importa que ordem você faz
dd
epv
em, é inteiramente relacionados com o desempenho - se o dispositivo que você está lendo de ou para tem um ótimo desempenho para determinados tamanhos de blocos que deseja usardd
em vez depv
acessar esse dispositivo. Você pode até colocar umdd
dos dois lados, se quiser, ou não, se não se importar:fonte
A partir da
coreutils
v8.24,dd
possui suporte nativo para mostrar progresso. Basta adicionar a opçãostatus=progress
.Exemplo:
Fonte
fonte
ddrescue
lhe fornecerá estatísticas enquanto estiver em execução.demo: http://www.youtube.com/watch?v=vqq9A01geeA#t=144s
fonte
Às vezes, você pode não conseguir usar o sinal INFO ou USR1 porque o fluxo stderr do
dd
processo não está acessível (por exemplo, porque o terminal no qual foi executado já estava fechado). Nesse caso, uma solução alternativa é fazer o seguinte (testado no FreeBSD, pode ser um pouco diferente no Linux):Use
iostat
para estimar a taxa média de gravação (MB / s) no dispositivo de destino, por exemplo:iostat -d -w30 ada0
Substitua o nome do dispositivo de destino por
ada0
aqui e aguarde alguns minutos para que ele dê alguns resultados. O parâmetro "w" determina quantos segundos entre as amostras. Aumentá-lo fornecerá uma estimativa média melhor com menos variação, mas você terá que esperar mais.Use
ps
para determinar há quanto tempodd
está em execução:ps -xo etime,command | grep dd
Converta isso em segundos para obter o total de segundos de tempo de execução.
Obtenha o tamanho do dispositivo em MB com:
grep ada0 /var/run/dmesg.boot
Substitua o nome do seu dispositivo de destino
ada0
. Divida o resultado pela taxa média de gravação para obter o tempo total de transferência em segundos. Subtraia o tempo que está sendo executado até agora para obter o tempo restante.Essa estratégia só funciona se
dd
estiver gravando continuamente na taxa de gravação média atual desde o início. Se outros processos estiverem competindo pelos recursos da CPU ou de E / S (incluindo o barramento de E / S), isso poderá reduzir a taxa de transferência.fonte
Comecei a usar o dcfldd (1), que mostra as operações do dd de uma maneira melhor.
fonte
Enquanto
dd
estiver em execução, eu executo isso em outro terminal como root:Ele imprime o
dd
status a cada 1 segundo na janela original do terminal em quedd
está sendo executado e fecha quando o comando é executado.fonte
Você pode usar o
progress
que, em particular, mostra o progresso de uma corridadd
. Ele usa/proc/$pid/fd
e/proc/$pid/fdinfo
que você também pode monitorar manualmente.fonte
A
wchar
linha (caracteres escritos) em/proc/$pid/io
pode fornecer informações precisas sobre odd
processo. Desde que mude, o seudd
ainda está funcionando!Aqui está um pequeno script php, que você pode salvar e executar
php filename.php
durante odd
para exibir os bytes gravados. O benefício agradável de assistir/proc/$pid/io
maiskill -USR1 $(pidof dd)
é que você não tem que alternar entre os terminais, o que nem sempre é uma opção.fonte