Existe um método para obter uma porcentagem em um DD no linux?

43

Então, aqui está o que está acontecendo.

Eu iniciei um backup de uma unidade no meu servidor através de um Linux USB ao vivo. Comecei a copiar a primeira unidade com a baunilha do comando dd ; apenas sudo dd if=/dev/sda of=/dev/sdc1 e depois lembrei que isso deixa o console em branco até terminar.

Eu precisava executar um backup diferente na mesma unidade, então eu iniciei esse também com sudo dd if=/dev/sdb of=/dev/sdc3 status=progress e, em seguida, obtive uma linha de texto que mostra a taxa atual de transferência, bem como o progresso em bytes.

Eu estava esperando por um método que mostra uma porcentagem do backup em vez de fazer as contas de quantos bytes são copiados de 1.8TBs. Existe uma maneira mais fácil de fazer isso do que status = progresso?

    
por Hastur 30.01.2018 / 23:46

5 respostas

67

Veja as respostas desta pergunta [ 1 ]

pv

Por exemplo, você pode usar pv antes de começar

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

Saída [ 2 ] :

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

Notas:
Especialmente para arquivos grandes, convém ver man dd e definir as opções necessárias para agilizar tudo em seu hardware, por exemplo, bs=100M para definir o buffer, oflag=sync para contar os bytes efetivos gravados, talvez direct ...
A opção -s usa apenas parâmetros inteiros, portanto, 1.8T-->1844G .
Como você pode notar nas primeiras linhas, você não precisa de dd .

kill -USR1 pid

Se você já lançou o comando dd , depois de ter individuado seu PID ( Ctrl - Z + bg e você leia, ou pgrep ^dd ...) você pode enviar um sinal USR1 (ou SIGUSR1 , ou SIGINFO veja abaixo) e ler a saída.
Se o PID do programa é 1234 com

kill -USR1 1234

dd vai responder no terminal do seu STDERR com algo parecido com

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

Aviso: No OpenBSD você pode ter que verificar antecipadamente o comportamento de kill [ 3 ] : use em vez disso kill -SIGINFO 1234 .
Existe a sigração denominada SIGINFO . O SIGUSR1 one, neste caso, deve encerrar o programa ( dd ) ...
Sob o uso do Ubuntu -SIGUSR1 ( 10 ).

    
por 31.01.2018 / 00:07
36

Minha ferramenta para esse tipo de coisa é progress :

This tool can be described as a Tiny, Dirty, Linux-and-OSX-Only C command that looks for coreutils basic commands (cp, mv, dd, tar, gzip/gunzip, cat, etc.) currently running on your system and displays the percentage of copied data. It can also show estimated time and throughput, and provides a "top-like" mode (monitoring).

"<code>progress</code> in action" screenshot

It simply scans /proc for interesting commands, and then looks at directories fd and fdinfo to find opened files and seek positions, and reports status for the largest file.

It's very light, and compatible with virtually any command.

Acho particularmente útil porque:

  • comparado a pv no canal ou dcfldd , não preciso lembrar de executar um comando diferente quando inicio a operação, posso monitorar o material após o fato;
  • comparado a kill -USR1 , ele funciona virtualmente em qualquer comando, não preciso sempre verificar novamente a página de manual para ter certeza de que não estou matando acidentalmente a cópia; Além disso, é bom que, quando invocado sem parâmetros, ele mostre o progresso de qualquer comando comum de "transferência de dados" atualmente em execução, então nem preciso procurar o PID;
  • comparado a pv -d , mais uma vez não preciso procurar o PID.
por 01.02.2018 / 09:14
24

Execute dd e, em um shell separado, invoque o seguinte comando:

pv -d $(pidof dd) # root may be required

Isso fará com que o pv obtenha estatísticas sobre todos os descritores de arquivos abertos do processo dd . Ele mostrará a você onde estão os buffers de leitura e gravação.

    
por 31.01.2018 / 15:37
8

Há uma alternativa para dd : dcfldd .

dcfldd is an enhanced version of GNU dd with features useful for forensics and security.

Status output - dcfldd can update the user of its progress in terms of the amount of data transferred and how much longer operation will take.

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

link link

    
por 31.01.2018 / 22:42
7

Como porcentagem você teria que fazer algumas contas, mas você pode obter o progresso de um dd em forma legível, mesmo depois de começar, fazendo kill -USR1 $(pidof dd)

O processo dd atual será exibido de forma semelhante a:

11117279 bytes (11 MB, 11 MiB) copiados, 13,715 s, 811 kB / s

    
por 30.01.2018 / 23:58