Come monitorate l'avanzamento di dd?


654

ddè una meraviglia. Ti consente di duplicare un disco rigido su un altro, azzerare completamente un disco rigido, ecc. Ma una volta avviato un ddcomando, non c'è nulla che ti dica dei suoi progressi. Si trova lì sul cursore fino a quando il comando non termina. Quindi, come si fa a monitorare i progressi di dd?

Risposte:


729

Aggiornamento 2016 : se usi GNU coreutils> = 8.24 (impostazione predefinita in Ubuntu Xenial 16.04 in poi), vedi il metodo 2 sotto per un modo alternativo per visualizzare l'avanzamento.


Metodo 1: utilizzando pv

Installa pve inseriscilo tra i ddcomandi di input / output .

Nota : non puoi usarlo quando hai già iniziato dd.

Dalla descrizione del pacchetto :

pv- Pipe Viewer - è uno strumento basato su terminali per monitorare l'avanzamento dei dati attraverso una pipeline. Può essere inserito in qualsiasi normale pipeline tra due processi per fornire un'indicazione visiva di quanto velocemente passano i dati, quanto tempo ha impiegato, quanto è vicino al completamento e una stima di quanto tempo sarà fino al completamento.

Installazione

sudo apt-get install pv

Esempio

dd if=/dev/urandom | pv | dd of=/dev/null

Produzione

1,74MB 0:00:09 [ 198kB/s] [      <=>                               ]

È possibile specificare la dimensione approssimativa con --sizese si desidera una stima del tempo.


Esempio Supponendo che un disco da 2 GB sia copiato da / dev / sdb

Il comando senza pvsarebbe:

sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096

Comando con pv:

sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096

Produzione:

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

Altri usi

Ovviamente puoi usare pvdirettamente per reindirizzare l'output a stdout:

pv /home/user/bigfile.iso | md5sum

Produzione

50,2MB 0:00:06 [8,66MB/s] [=======>         ] 49% ETA 0:00:06

Si noti che in questo caso, pvriconosce automaticamente le dimensioni.


Metodo 2: Nuova statusopzione aggiunta a dd(GNU Coreutils 8.24+)

ddin GNU Coreutils 8.24+ (Ubuntu 16.04 e versioni successive) è disponibile una nuova statusopzione per visualizzare l'avanzamento:

Esempio

dd if=/dev/urandom of=/dev/null status=progress

Produzione

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

76
pv bigfile.iso | dd di = / dev / yourdevice
Ion Br.

18
Si noti che i parametri di "dd" sono appropriati nel primo tempo (la parte di ingresso del tubo): dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw.
Sopalajo de Arrierez,

6
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000funziona, verificato. @SopalajodeArrierez, i parametri possono essere dati nel secondo giorno.
Siddhartha

11
l'utilizzo pv < /dev/sda > /dev/sdbsembra aumentare la velocità ( fonte )
Nicola Feltrin,

14
Cordiali saluti sulla velocità. Test sul mio computer con SSD Samsung 840 PRO: dd if=/dev/urandom | pv | of=/dev/sdbdà ~ 18 MB / s in scrittura, dd if=/dev/zero | pv | of=/dev/sdbdà ~ 80 MB / s, e il vecchio normale dd if=/dev/zero of=/dev/sdbdà ~ 550 MB / s (vicino alla velocità massima di scrittura SSD). Tutti con bs=4096000.
Tedd Hansen,

461

Da HowTo: monitorare l'avanzamento di dd

È possibile monitorare l'avanzamento di dd senza arrestarlo utilizzando il killcomando.

Per vedere l'avanzamento di dduna volta in esecuzione, apri un altro terminale ed inserisci:

sudo kill -USR1 $(pgrep ^dd)

Ciò visualizzerà l' ddavanzamento nella ddfinestra del terminale senza interrompere il processo. Se usi BSD o OS X, usa INFOinvece di USR1. Il USR1segnale terminerà dd.

Se desideri ricevere aggiornamenti regolari ddsull'avanzamento, inserisci:

watch -n5 'sudo kill -USR1 $(pgrep ^dd)'

watchesaminerà il ddprocesso ogni -n secondi ( -n5= 5 secondi) e segnalerà senza arrestarlo.

Nota le virgolette singole appropriate nei comandi sopra.


19
Questo ha funzionato, ma un paio di commenti. Prima di tutto, non sono sicuro del motivo per cui sei sfuggito ai tuoi backtick (se è per l'editor SO, l'hai fatto in modo errato). In secondo luogo, consiglierei di usare ^ dd $, nel caso in cui qualcos'altro funzioni con il prefisso dd. Infine, non è necessario sudo per inviare il segnale USR1. Altrimenti, buona risposta, +1.
gsingh2011,

22
NB! In questo modo si interrompe il lavoro su OSX.
Maxim Kholyavkin,

26
@Speakus Devi usare kill -INFO $(pgrep ^dd$)su sistemi BSD (come OSX).
Torben,

20
sudo pkill -usr1 ddè più facile da ricordare, funziona perfettamente (almeno su Ubuntu 14.04), ed è meno da digitare.
Phizes,

21
Mi piace perché temo pvche rallenterà il trasferimento, come ha dimostrato TeddHansen. Inoltre, scommetto che molte persone stanno cercando su Google perché hanno già iniziato l' ddoperazione;)
sudo

104

Alcuni utili esempi di utilizzo con pve meno digitazione o più progressi rispetto ad altre risposte:

Per prima cosa dovrai installare pv, con il comando:

sudo apt-get install pv

Quindi alcuni esempi sono:

pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror

Nota: il primo esempio è di 5 caratteri in meno digitando allora dd if=/dev/urandom | pv | dd of=/dev/null.

E il mio preferito per la clonazione di un'unità disco (sostituire X con lettere di unità):

(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

immagine dello schermo

fonte: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/

Anche per l'archiviazione.


3
dovrai installarlo anche dialogcon il comandoapt-get install dialog
k7k0

7
ADORO l' dialogesempio. SERENITÀ ORA !
alex gray,

Puoi chiamare quella finestra di dialogo solo con Python?
mikeymop,

1
grazie a questa risposta, dialogho scoperto che questo aiuterà follemente a scrivere script di shell: D
holms,

2
brew install pv dialogper Mac. Anche questo signore calcola con stile. Bravo.
evilSnobu,

62

Usa Ctrl+ Shift+ Tmentre ddè in esecuzione e genererà l'avanzamento (in byte):

load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)

5
Non funziona per me su Kubuntu Trusty. Associazioni chiave forse in conflitto?
Jamadagni,

14
Ottimo modo. Funziona con OSX, ma non funziona con Ubuntu 14.04
Maxim Kholyavkin,

1
La prima riga è generata da OS X, solo le ultime 3 righe provengono da dd.
Itay Grudev,

3
Dovresti essere in grado di usare kill -INFO su un BSD come OS X
macshome,

3
Questo non funziona su Ubuntu. Ctrl-T / Ctrl-Maiusc-T viene emesso solo ^Tsul terminale (tranne per il fatto che molte app terminali intercettano Ctrl-Maiusc-T e aprono una nuova scheda). Molti ricercatori su OSX / BSD potrebbero apprezzare questa risposta, ma dovrebbe essere chiaro che non è per Ubuntu (o GNU / LInux in generale?)
mwfearnley,

60

Per amor di completezza:

La versione 8.24 dei coreutils GNU include una patch per dd che introduce un parametro per stampare l'avanzamento.

Il commit che introduce questa modifica ha il commento:

dd: nuovo stato = livello di avanzamento per stampare periodicamente le statistiche

Molte distribuzioni, tra cui Ubuntu 16.04.2 LTS utilizzano questa versione.


voglio solo aggiungere come ho compilato 8.24 coreutils: apt install build-essentiale apt-get build-dep coreutils, quindi scaricare coreutils-8.25.tar.xz, tar xvf coreutils-8.25.tar.xz configure --prefix=$HOME/usr/localed eseguire make. La nuova compilazione ddsarà sotto srcdir. Puoi copiarlo su / bin e sostituire uno esistente o jus run come src / dd
holms

2
Freddo! Mi piace questa funzionalità. E ci sono voluti solo circa 30 anni per insegnare a dd per stampare i progressi. :-)
Johannes Overmann,

Che sollievo! Aggiungerò immediatamente questo argomento in un alias di shell dd.
Stephan Henningsen,

Si noti che a volte lo stato viene stampato con due numeri, uno in unità SI e il valore equivalente in unità binarie (ad esempio 10 MB, 9,5 MiB).
Palswim,

33

Il migliore è usare http://dcfldd.sourceforge.net/ è facile da installare tramite apt-get


3
grazie per il puntatore a dcfldd, molto compatibile con dd ma alcune buone nuove funzionalità. Mi piacciono particolarmente i progressi standard.
Floyd,

4
Perché dcfldd non è più noto è un mistero per me.
Freedom_Ben

28
probabilmente per il suo nome.
Giovanni Toraldo,

Ha le opzioni dde l'opzione status=ondi default, per i messaggi di avanzamento, statusinterval=N(N in blocchi) per la frequenza di aggiornamento dei messaggi e sizeprobe=[if|of]per un indicatore percentuale. Lo farò alias DD:)
kavadias

25

Lo stato di avanzamento nativo è stato aggiunto a dd !!!

La nuova versione di Coreutils (8.24) aggiunge uno stato di avanzamento allo ddstrumento:

Utilizzo su Xubuntu 15.10:

Apri un terminale e digita questi comandi:

wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)

Esegui ddcome root:

sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress

Vedrai: byte, secondi e velocità (byte / secondo).

Per verificare le versioni di dd:

Native:

dd --version

Nuovo:

cd coreutils-8.24/src
./dd --version

18

Se hai già avviato dd e se stai scrivendo un file come quando si crea una copia di un pendrive su disco, è possibile utilizzare il comando watch per osservare costantemente le dimensioni del file di output per vedere le modifiche e stimare il completamento.

watch ls -l /pathtofile/filename

Per visualizzare solo le dimensioni del file (vista h-human):

watch ls -sh /pathtofile/filename

Anche un metodo praticabile ...
Dec--

3
Utile, anche se questo non funziona necessariamente se stai eseguendo il piping dell'output dd su qualcosa di diverso da un file (ad esempio gzip'ing prima di scriverlo su disco).
Ponkadoodle,

Non funziona su file speciali.
Johannes Overmann,

13

La dd | pv | ddtriade ha fatto in modo che la mia copia da 50 GB vm impiegasse 800 secondi, anziché 260 secondi usando solo dd. Con questa pipeline, almeno, pv non ha idea di quanto sia grande il file di input, quindi non sarà in grado di dirti quanto siete lontani, quindi non ci sono svantaggi nel farlo come segue e otterrete un bel vantaggio di velocità:

Eviterei il pv su qualsiasi cosa di grandi dimensioni e (se uso Bash):

Control-Z il processo dd

bgper metterlo in background. Osserva che bgti darà un output come [1] 6011dove l'ultimo numero è un ID di processo. Quindi, fai:

while true; do kill -USR1 process_id ; sleep 5; done

dove process_id è l'id del processo che hai osservato. Premi Control-C quando vedi qualcosa del tipo:

[1]+  Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process

Hai fatto.

Modifica: Silly Systems Administrator! Automatizza la tua vita, non lavorare! Se ho un lungo processo dd che voglio monitorare, ecco un one-liner che si occuperà dell'intera enchilada per te; metti tutto su una riga:

 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

Puoi, ovviamente, scriverlo, forse rendere $ 1 il tuo file di input e $ 2 il tuo file di output. Questo è lasciato come esercizio per il lettore. Nota che hai bisogno di quel poco sonno prima che l'uccisione o l'uccisione possa morire provando a inviare un segnale a dd quando non è ancora pronto. Regola i tuoi dormi come desideri (magari rimuovi del tutto il secondo sonno).

Bash- FTW! :-)


1
Comprimi il whileciclo. Usa watch.
muru,

1
@muru dipende. Non conosco il tuo sistema ma su CentOS7 * l'output è un po 'confuso; è leggibile ma non sembra ordinato. Inoltre passa sopra il tuo output precedente in modo da perdere la cronologia della velocità del tuo dd; la mia varia tra 20 MB / se 300 MB / s. È interessante vedere i numeri variare e anche istruttivi. Penso che parte della grande varianza sia dovuta ai thin pool LVM che aumentano l'allocazione per un LV a cui sto scrivendo. * Sì, questo è un forum di Ubuntu ma sono arrivato qui alla ricerca di "progressi monitor dd". È il primo risultato su Google.
Mike S,

Oh, volevo dire in un altro terminale o finestra sullo schermo, corri sudo watch pkill dd. Quindi guarda ddle statistiche comodamente in uscita.
muru,

Pkill non invierà SIGTERM per impostazione predefinita? Non voglio nemmeno sperimentare, dato che pgrep dd presenta 3 pid quando esegue un singolo dd: kthreadd, oddjob e il dd. Ho paura di cosa farà Pkill. Potresti inviare il segnale -USR1 con pkill ma di nuovo non so se sia sicuro inviare al thread del kernel o a obbjob. Il comando watch sembra più pulito ma sembra un sacco di passaggi extra solo per evitare un ciclo while. Generalmente se sto facendo un dd in una finestra, farò qualcosa subito dopo nella stessa shell. Il ciclo while è sicuro: sai ESATTAMENTE quale pid riceve il segnale.
Mike S,

per lo più non mi interessa quali pid ricevano il segnale, dal momento che uso watch pkill -USR1 -x dd. Dal momento che utilizzo anche watchper altri compiti simili, questo viene naturalmente.
muru,


7

Il più semplice è:

 dd if=... of=... bs=4M status=progress oflag=dsync

oflag=dsyncmanterrà la tua scrittura sincronizzata, quindi le informazioni di saranno status=progresspiù accurate. Tuttavia potrebbe essere un po 'più lento.



Grazie per questo! Sto facendo un dd in un lvm2 remoto e bs = 4M ha aumentato il mio trasferimento di un fattore 20 e l'indicazione del progresso è meravigliosa.
Lonnie Best

6

Su Ubuntu 16.04

Ubuntu 16.04 viene fornito con dd (coreutils) Versione 8.25 . Quindi l'opzione status=progress è supportata :-)

Per usarlo, basta aggiungere status=progresscon il tuo ddcomando.

Esempio :

dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync

Fornisce lo stato come

1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s

inserisci qui la descrizione dell'immagine


5

Utilizzare l'opzione status=progressper ottenere l'avanzamento durante il trasferimento.

Inoltre, conv=fsyncvisualizzerà errori I / O.

Esempio:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync


3

Ho creato un wrapper bash ddche verrà utilizzato pvper mostrare i progressi. Mettilo nel tuo .bashrce usa ddcome al solito:

# dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
    2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%            
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s

Fonte:

dd()
{
    local dd=$(which dd); [ "$dd" ] || {
        echo "'dd' is not installed!" >&2
        return 1
    }

    local pv=$(which pv); [ "$pv" ] || {
        echo "'pv' is not installed!" >&2
        "$dd" "$@"
        return $?
    }

    local arg arg2 infile
    local -a args
    for arg in "$@"
    do
        arg2=${arg#if=}
        if [ "$arg2" != "$arg" ]
        then
            infile=$arg2
        else
            args[${#args[@]}]=$arg
        fi
    done

    "$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}

Buon modo ma non funziona con comandi come sudo o time.
Maxim Kholyavkin,

1
Metterlo in bin / gg / usr / local / con questo sulla parte superiore: #!/bin/bash. In basso: tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"oppure potresti voler hardcode ddlocation. Quindi utilizzare local dd=/usr/bin/dd. Non dimenticate di aggiungere bit di esecuzione: chmod +x /usr/local/dd.
midenok,

2

Quindi oggi sono stato un po 'frustrato nel provare a correre killin un ciclo mentre ddera in esecuzione e ho trovato questo metodo per eseguirli in parallelo, facilmente:

function vdd {
    sudo dd "$@" &
    sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}

Ora basta usare vddovunque tu normalmente usi dd(passa direttamente tutti gli argomenti) e otterrai un rapporto sui progressi stampato ogni 5 secondi.

L'unico aspetto negativo è che il comando non ritorna immediatamente al completamento di dd; quindi è possibile che questo comando possa farti aspettare altri 5 secondi dopo che dd ritorna prima che si accorga e si chiuda.


2

Questo impone dd di fornire statistiche ogni 2 secondi, valore predefinito per l'orologio:

watch killall -USR1 dd

Per passare da ogni 2 secondi a ogni 5 secondi, aggiungi l'opzione -n ​​5 in questo modo:

watch -n 5 killall -USR1 dd

2

Nel caso in cui qualcuno dalla terra CentOS trovi questa discussione ...

L'opzione 'status = progress' funziona con CentOS 7.5 e 7.6

La risposta sopra di @davidDavidson implica che la funzionalità è stata recentemente aggiunta in Coreutils 8.24.

La versione 8.24 dei coreutils GNU include una patch per dd che introduce un parametro per stampare l'avanzamento.

Questo può essere il caso, ma CentOS potrebbe non seguire lo stesso schema di controllo delle versioni.

La versione di Coreutils fornita con CentOS 7.6.1810 è:

coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts

E la versione di dd installata è:

[root@hostname /]# dd --version
dd (coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin, David MacKenzie, and Stuart Kemp.

Questo mostra le versioni 8.22 .

Tuttavia, ho testato "status = progress" con dd su CentOS 7.5 e CentOS 7.6 (entrambi con la versione 8.22 di Coreutils) e funziona correttamente.

Non so perché RedHat scelga di utilizzare una versione così vecchia di Coreutils ma la funzionalità esiste con 8.22.


1

Come accennato in precedenza, almeno con 'dd' da GNU coreutils, o busybox, risponderà a un segnale USR1 stampando le informazioni di avanzamento su stderr.

Ho scritto un piccolo script wrapper per dd che mostra un buon indicatore di percentuale completa e cerca di non interferire in alcun modo con il processo o il modo di funzionare di dd. Puoi trovarlo su github:

http://github.com/delt01/dd_printpercent

Sfortunatamente, questo trucco di SIGUSR1 funziona solo con GNU dd (dal pacchetto coreutils) o con la modalità 'dd' di busybox con quella specifica funzione abilitata al momento della compilazione. Non funziona con lo stock 'dd' incluso con la maggior parte dei sistemi BSD, inclusi FreeBSD e OS X ... :(


Il link è morto.
Ismaele

1

Puoi vedere lo stato di avanzamento di qualsiasi programma coreutils usando progress - Coreutils Progress Viewer.

Può monitorare:

cp mv dd tar cat rsync grep fgrep egrep cut sort md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma unlzma 7z 7za zcat bzcat lzcat split gpg

Puoi vedere la manpage

Puoi usarlo in una finestra terminale separata mentre il comando è in esecuzione o avviarlo con il comando dd:

dd if=/dev/sda of=file.img & progress -mp $!

Qui &biforca il primo comando e continua immediatamente invece di attendere fino alla fine del comando.

Il comando progress viene avviato con: -mquindi attende fino al termine del processo monitorato, -pquindi monitora un determinato pid ed $!è l'ultimo comando pid.

Se emetti dd con sudo, devi farlo anche con i progressi:

sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.