dd
é uma maravilha. Ele permite duplicar um disco rígido para outro, zerar completamente um disco rígido,etc. Mas uma vez que você lançar um dd
comando, não há nada para lhe dizer sobre o seu progresso. Ele apenas fica lá no cursor até que o comando finalmente termine. Então, como monitorar o progresso do dd?
Atualização 2016>: Se você usar GNU coreutils = 8.24 (padrão no Ubuntu Xenial 16.04 para cima), consulte o método 2 abaixo para uma maneira alternativa de exibir o progresso.
Método 1: usando pv
Instalar pv
e colocá-lo entre entrada / saída apenas dd
comando.
Notar: você não pode usá-lo quando você já começou dd
.
pv
- Pipe Viewer - é uma ferramenta baseada em terminal para monitorar o progresso dos dados através de um pipeline. Ele pode ser inserido em qualquer pipeline normal entre dois processos para dar uma indicação visual de quão rapidamente os dados estão passando, quanto tempo demorou, quão perto da conclusão é e uma estimativa de quanto tempo será até a conclusão.
Instalacao
sudo apt-get install pv
Exemplo
dd if=/dev/urandom | pv | dd of=/dev/null
Saida
1,74MB 0:00:09 [ 198kB/s] [ <=> ]
Você pode especificar o tamanho aproximado com o --size
se você quer uma estimativa de tempo.
Exemplo assumindo que um disco de 2 GB está sendo copiado de / dev / sdb
Comando sem pv
seria:
sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096
Comando com pv
:
sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
Saida:
440MB 0:00:38 [11.6MB/s] [======> ] 21% ETA 0:02:19
Utilizacao
Você pode, claro, usar pv
diretamente para canalizar a saída para stdout:
pv /home/user/bigfile.iso | md5sum
Saida
50,2MB 0:00:06 [8,66MB/s] [=======> ] 49% ETA 0:00:06
Observe que, neste caso, pv
reconhece o tamanho automaticamente.
Método 2: Novo status
Opção adicionada a dd
(GNU Coreutils 8.24+)
dd
em GNU Coreutils 8.24+ (Ubuntu 16.04 e mais recente) tem um novo status
opção para exibir o progresso:
Exemplo
dd if=/dev/urandom of=/dev/null status=progress
Saida
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
De HowTo: monitore o progresso do dd
Você pode monitorar o progresso do dd
uma vez que está funcionando sem interrompê-lo usando o kill
comando para enviar um sinal para o processo.
Depois de começar dd
, abra outro terminal e entre ou:
sudo kill -USR1 $(pgrep ^dd$)
Ou, se você estiver no BSD ou OS X:
sudo kill -INFO $(pgrep ^dd$)
Isso exibirá o progresso no dd
janela do terminal sem interromper o processo (imprimindo em seu fluxo stderr). Por exemplo:
# dd if=/dev/urandom of=rando bs=1024 count=1048576335822+0 records in335821+0 records out343880704 bytes (344 MB, 328 MiB) copied, 6.85661 s, 50.2 MB/s
Se você gostaria de obter atualizações regulares do dd
progresso e, em seguida, entrar:
watch -n5 'sudo kill -USR1 $(pgrep ^dd$)'
watch
vai sondar o dd
processo a cada-n segundos (-n5
= 5 segundos) e relatar sem interrompê-lo.
Observe as aspas únicas adequadas nos comandos acima.
Alguns usos úteis da amostra com pv
e menos digitação ou mais progresso do que outras respostas:
Primeiro você precisará instalar pv
, com o comando:
sudo apt-get install pv
Então alguns exemplos são:
pv -n /dev/urandom | dd of=/dev/nullpv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror
Nota: a primeira amostra é de 5 caracteres menos digitando então dd if=/dev/urandom | pv | dd of=/dev/null
.
E meu favorito para clonar uma unidade de disco (substitua X por letras de unidade):
(pv -n /dev/sdX | dd of=/dev/sdX bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0
fonte: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/
Também para me arquivar.
Por uma questão de Completude:
Versao 8.24 do GNU coreutils inclui um patch para DD introduzindo um parâmetro para imprimir o progresso.
O commit apresentando esta mudança tem o comentário:
dd: novo status = progresso nível para imprimir estatísticas periodicamente
Muitas distribuições, incluindo Ubuntu 16.04.2 LTS use esta versão.
Usar Ctrl+Shift+T enquanto dd
está em execução e produzirá o progresso (em bytes):
load: 1.51 cmd: dd 31215 uninterruptible 0.28u 3.67s321121+0 records in321120+0 records out164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)
O status de progresso nativo foi adicionado ao dd!!!
A nova versão do Coreutils (8.24) adiciona um status de progresso ao dd
ferramenta:
Uso no Xubuntu 15.10:
Abra um terminal e digite esses comandos:
wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xztar -xf coreutils-8.24.tar.xzcd coreutils-8.24./configure && make -j $(nproc)
Executar dd
como raiz:
sudo sucd src./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress
Você verá: Bytes, segundos e velocidade (Bytes/segundo).
Para verificar as versões do dd
:
Nativo:
dd --version
Novo:
cd coreutils-8.24/src./dd --version
Se você já iniciou o dd e, se estiver gravando um arquivo, como ao criar uma cópia de um pendrive no disco, poderá usar o comando watch para observar constantemente o tamanho do arquivo de saída para ver as alterações e estimar a conclusão.
watch ls -l /pathtofile/filename
Para ver apenas o tamanho do arquivo (H-human view):
watch ls -sh /pathtofile/filename
O dd | pv | dd
a tríade fez minha cópia de vm de 50 GB demorar 800 segundos, em oposição a 260 segundos usando apenas dd. Com esse pipeline, pelo menos, o pv não tem ideia de quão grande é o arquivo de entrada, então não será capaz de dizer o quão longe você está, então não há desvantagem em fazê-lo da seguinte maneira - e você obtém uma boa vantagem de velocidade:
Eu evitaria pv em qualquer coisa grande e (se estiver usando Bash):
Control - Z O processo dd
bg
para colocá-lo em segundo plano. Observe que bg
vai lhe dar saída como [1] 6011
onde o último número é um ID de processo. Então, faça:
while true; do kill -USR1 process_id ; sleep 5; done
onde process_id é o ID do processo que você observou. Hit Control-C quando você vê algo como:
[1]+ Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse-bash: kill: (60111) - No such process
Já acabaste.
Editar: Administrador De Sistemas Bobo! Automatize sua vida, não trabalhe! Se eu tiver um longo processo dd que quero monitorar, aqui está um one-liner que cuidará de toda a enchilada para você; coloque tudo isso em uma linha:
dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done
Você pode, é claro, script-lo, talvez fazer $1 seu arquivo de entrada e $2 seu arquivo de saída. Isso é deixado como um exercício para o leitor. Note que você precisa que pouco sono antes da morte ou a morte pode morrer tentando enviar um sinal para dd quando ainda não está pronto. Ajuste seus dormidos conforme desejado(talvez até remova o segundo sono completamente).
Bash-FTW! :-)
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
Basicamente:
kill -USR1 < dd pid >