Jak monitorujesz postęp dd?

654

ddjest cudem. Pozwala powielić dysk twardy na inny, całkowicie wyzerować dysk twardy itp. Ale po uruchomieniu ddpolecenia nic nie mówi o jego postępie. Po prostu siedzi tam przy kursorze, aż polecenie w końcu się zakończy. Jak więc monitorować postępy dd?

James
źródło

Odpowiedzi:

728

Aktualizacja 2016 : Jeśli używasz GNU coreutils> = 8.24 (domyślnie w Ubuntu Xenial 16.04 w górę), zobacz metodę 2 poniżej, aby uzyskać alternatywny sposób wyświetlania postępu.


Metoda 1: Za pomocą pv

Zainstaluj pvi umieść go między ddpoleceniami tylko wejścia / wyjścia .

Uwaga : nie możesz go użyć, gdy już zacząłeś dd.

Z opisu pakietu :

pv- Pipe Viewer - to terminalowe narzędzie do monitorowania postępu danych przez potok. Można go wstawić do dowolnego normalnego potoku między dwoma procesami, aby wizualnie wskazywać, jak szybko dane przechodzą, jak długo to trwało, jak blisko jest ich ukończenia oraz oszacować, ile czasu to potrwa do zakończenia.

Instalacja

sudo apt-get install pv

Przykład

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

Wynik

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

Możesz określić przybliżony rozmiar, --sizejeśli chcesz oszacować czas.


Przykład Założenie, że dysk 2 GB jest kopiowany z / dev / sdb

Polecenie bez pvbyłoby:

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

Polecenie za pomocą pv:

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

Wynik:

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

Inne zastosowania

Możesz oczywiście użyć pvbezpośrednio do potokowania wyjścia na standardowe wyjście:

pv /home/user/bigfile.iso | md5sum

Wynik

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

Pamiętaj, że w takim przypadku pvautomatycznie rozpoznaje rozmiar.


Metoda 2: statusDodano nową opcję dd(GNU Coreutils 8.24+)

ddw GNU Coreutils 8.24+ (Ubuntu 16.04 i nowsze) dostał nową statusopcję wyświetlania postępu:

Przykład

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

Wynik

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
phoibos
źródło
76
pv bigfile.iso | dd z = / dev / yourdevice
Ion Br.
18
Należy zauważyć, że parametry „dd” są odpowiednio w pierwszej połowie (części wejściowej rury) 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=35000działa, zweryfikowany. @SopalajodeArrierez, parametry można podać w drugim dd.
SiddharthaRT
11
używanie pv < /dev/sda > /dev/sdbwydaje się mieć lepszą prędkość ( źródło )
Nicola Feltrin
14
Informacje o prędkości. Testy na moim komputerze z dyskiem Samsung 840 PRO SSD: dd if=/dev/urandom | pv | of=/dev/sdbdaje ~ 18 dd if=/dev/zero | pv | of=/dev/sdbMB / s zapisu, daje ~ 80 MB / s, a zwykły stary dd if=/dev/zero of=/dev/sdbdaje ~ 550 MB / s (blisko maksymalnej prędkości zapisu SSD). Wszystko z bs=4096000.
Tedd Hansen
461

Od HowTo: Monitoruj postęp dd

Możesz monitorować postęp dd bez zatrzymywania go za pomocą killpolecenia.

Aby zobaczyć postęp dddziałania, otwórz inny terminal i wprowadź:

sudo kill -USR1 $(pgrep ^dd)

Spowoduje to wyświetlenie ddpostępu w ddoknie terminala bez zatrzymywania procesu. Jeśli korzystasz z BSD lub OS X, użyj INFOzamiast USR1. USR1Sygnał zakończenia dd.

Jeśli chcesz regularnie otrzymywać informacje o ddpostępach, wpisz:

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

watchbędzie sondować ddproces co -n sekund ( -n5= 5 sekund) i raportować bez zatrzymywania go.

Zwróć uwagę na właściwe pojedyncze cudzysłowy w powyższych poleceniach.

James
źródło
19
To działało, ale kilka komentarzy. Przede wszystkim nie jestem pewien, dlaczego uciekłeś od backsticksa (jeśli jest to edytor SO, zrobiłeś to niepoprawnie). Po drugie, zaleciłbym użycie ^ dd $, na wypadek gdyby coś innego działało z prefiksem dd. Wreszcie, nie potrzebujesz sudo, aby wysłać sygnał USR1. W przeciwnym razie dobra odpowiedź, +1.
gsingh2011
22
NB! W ten sposób przerywa pracę dd pod OSX.
Maxim Kholyavkin,
26
@Speakus Musisz używać kill -INFO $(pgrep ^dd$)w systemach BSD (takich jak OSX).
Torben,
20
sudo pkill -usr1 ddjest łatwiejszy do zapamiętania, działa idealnie dobrze (przynajmniej na Ubuntu 14.04) i jest mniej wymagający do pisania.
Phizes,
21
Podoba mi się, ponieważ obawiam się, pvże spowolni transfer, jak pokazał TeddHansen. Założę się też, że wielu ludzi googluje, bo już rozpoczęli ddoperację;)
sudo
104

Kilka przydatnych przykładowych zastosowań z pvmniejszym pisaniem lub większym postępem niż inne odpowiedzi:

Najpierw musisz zainstalować pvza pomocą polecenia:

sudo apt-get install pv

Oto kilka przykładów:

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

Uwaga: pierwsza próbka ma wtedy 5 znaków mniej pisania dd if=/dev/urandom | pv | dd of=/dev/null.

I mój ulubiony do klonowania dysku (zastąp X literami dysku):

(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

zrzut ekranu

źródło: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/

Również do archiwizacji siebie.

JSBach
źródło
3
musisz zainstalować również dialogz poleceniemapt-get install dialog
k7k0
7
KOCHAM ten dialogprzykład. SERENITY TERAZ !
Alex Grey
Czy możesz wywołać to okno dialogowe tylko za pomocą pytona?
mikeymop
1
dzięki tej odpowiedzi odkryłem, dialogże to niesamowicie pomoże w pisaniu skryptów powłoki: D
holms
2
brew install pv dialogdla Maca. Również ten dżentelmen oblicza się ze stylem. Brawo.
evilSnobu,
62

Użyj Ctrl+ Shift+ Tpodczas dddziałania, a wyświetli on postęp (w bajtach):

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)
01010101
źródło
5
Nie działa dla mnie w Kubuntu Trusty. Możliwe sprzeczne powiązania klawiszy?
jamadagni
14
Świetny sposób. Działa pod OSX, ale nie działa pod Ubuntu 14.04
Maxim Kholyavkin
1
Pierwsza linia jest generowana przez OS X, tylko ostatnie 3 linie są z dd.
Itay Grudev
3
Powinieneś być w stanie użyć kill -INFO na BSD, takim jak OS X
macshome,
3
To nie działa na Ubuntu. Ctrl-T / Ctrl-Shift-T wyświetla tylko dane wyjściowe ^Tna terminalu (z wyjątkiem wielu aplikacji terminalowych przechwytujących Ctrl-Shift-T i otwierających nową kartę). Wielu użytkowników OSX / BSD może docenić tę odpowiedź, ale należy wyjaśnić, że nie dotyczy ona Ubuntu (lub ogólnie GNU / LInux?)
mwfearnley,
60

Dla kompletności:

Wersja 8.24 z coreutils GNU zawiera łatki dd wprowadzającą parametru drukowania postęp.

Zatwierdzenie wprowadzające tę zmianę ma komentarz:

dd: nowy status = poziom postępu do okresowego drukowania statystyk

Wiele wersji, w tym Ubuntu 16.04.2 LTS, korzysta z tej wersji.

davidDavidson
źródło
po prostu chcę dodać, jak skompilowałem 8.24 coreutils: apt install build-essentiala apt-get build-dep coreutilsnastępnie pobierz coreutils-8.25.tar.xz tar xvf coreutils-8.25.tar.xz configure --prefix=$HOME/usr/locali uruchom make. Nowo skompilowane ddbędą w srcreż. Możesz skopiować go do / bin i zastąpić istniejący lub uruchomić jus jako src / dd
holms
2
Chłodny! Podoba mi się ta funkcja. Nauczenie dd drukowania wyników postępu zajęło około 30 lat. :-)
Johannes Overmann
Co za ulga! Natychmiast dodam ten argument do aliasu powłoki dd.
Stephan Henningsen
Zauważ, że status czasami drukuje się z dwiema liczbami, jedną w jednostkach SI i równoważną wartością w jednostkach binarnych (np. 10 MB, 9,5 MiB).
palswim
33

Najlepiej jest użyć http://dcfldd.sourceforge.net/ , jest łatwy do zainstalowania przez apt-get

TheNano
źródło
3
dzięki za wskaźnik do dcfldd, bardzo kompatybilny z dd, ale kilka dobrych nowych funkcji. Szczególnie podoba mi się standardowy postęp.
Floyd,
4
Dlaczego dcfldd nie jest bardziej znany, jest dla mnie całkowitą tajemnicą.
Freedom_Ben
28
prawdopodobnie ze względu na swoją nazwę.
Giovanni Toraldo
Ma opcje ddi opcję status=ondomyślnie dla komunikatów postępu, statusinterval=N(N w blokach) dla częstotliwości aktualizacji wiadomości i sizeprobe=[if|of]dla wskaźnika procentowego. Będę to pseudonim DD:)
kavadias
25

Natywny status postępu został dodany do dd !!!

Nowa wersja Coreutils (8.24) dodaje do ddnarzędzia status postępu :

Zastosowanie na Xubuntu 15.10:

Otwórz terminal i wpisz następujące polecenia:

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)

Uruchom ddjako root:

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

Zobaczysz: Bajty, sekundy i prędkość (Bajty / sekundę).

Aby sprawdzić wersje dd:

Ojczysty:

dd --version

Nowy:

cd coreutils-8.24/src
./dd --version
użytkownik3394963
źródło
18

Jeśli już uruchomiłeś dd i piszesz plik, na przykład podczas tworzenia kopii pendrive'a na dysk, możesz użyć polecenia watch, aby stale obserwować rozmiar pliku wyjściowego, aby zobaczyć zmiany i oszacować zakończenie.

watch ls -l /pathtofile/filename

Aby zobaczyć tylko rozmiar pliku (widok człowieka):

watch ls -sh /pathtofile/filename
producent 4
źródło
Również realna metoda ...
ζ--
3
Przydatne, choć niekoniecznie działa, jeśli przesyłasz wyjście dd do czegoś innego niż plik (np. Gzip'ing przed zapisaniem go na dysk).
Ponkadoodle,
Nie działa na specjalnych plikach.
Johannes Overmann
13

dd | pv | ddTriada mój 50GB VM kopia wziąć 800 sekund, w przeciwieństwie do 260 sekund przy użyciu tylko dd. Przy pomocy tego potoku pv nie ma pojęcia, jak duży jest plik wejściowy, więc nie będzie w stanie powiedzieć, jak daleko jesteś, więc nie ma wady robienia tego w następujący sposób - i zyskujesz przewagę prędkości:

Unikałbym pv na czymkolwiek dużym i (jeśli używasz Bash):

Control-Z proces dd

bgumieścić to w tle. Zauważ, że bgto da ci wynik jak [1] 6011tam, gdzie ta ostatnia liczba jest identyfikatorem procesu. Więc wykonaj:

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

gdzie identyfikator_procesu to identyfikator procesu, który zaobserwowałeś. Naciśnij Control-C, gdy zobaczysz coś takiego:

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

Gotowe.

Edytuj: Silly Systems Administrator! Automatyzuj swoje życie, nie pracuj! Jeśli mam długi proces dd, który chcę monitorować, oto jedna linijka, która zaopiekuje się tobą całą enchiladą; umieść to wszystko w jednym wierszu:

 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

Możesz oczywiście napisać skrypt, być może ustawić 1 $ na plik wejściowy, a 2 $ na plik wyjściowy. Pozostaje to jako ćwiczenie dla czytelnika. Pamiętaj, że potrzebujesz trochę snu przed zabiciem, w przeciwnym razie zabicie może umrzeć, próbując wysłać sygnał do dd, gdy nie będzie jeszcze gotowy. Dostosuj swoje sny według potrzeb (może nawet całkowicie usuń drugi sen).

Bash - FTW! :-)

Mike S.
źródło
1
Ściśnij whilepętlę. Użyj watch.
muru
1
@muru to zależy. Nie wiem o twoim systemie, ale na CentOS7 * wyjście jest trochę zniekształcone; jest czytelny, ale nie wygląda uporządkowany. Również tupie w stosunku do twojego poprzedniego wyjścia, więc tracisz historię prędkości twojego dd; moje waha się od 20 MB / s do 300 MB / s. Ciekawie jest obserwować różne liczby i pouczające. Myślę, że niektóre z dużych wariancji są spowodowane cienkimi pulami LVM zwiększającymi przydział dla LV, do którego piszę. * tak, to jest forum ubuntu, ale znalazłem się tutaj, szukając „postępu w monitorowaniu dd”. To pierwszy wynik w Google.
Mike S,
Och, miałem na myśli w innym oknie terminala lub oknie, uruchom sudo watch pkill dd. Następnie ddwygodnie oglądaj statystyki.
muru
Czy pkill nie wysyła domyślnie SIGTERM? Nie chcę nawet eksperymentować, ponieważ pgrep dd wyświetla 3 pidy podczas uruchamiania pojedynczego dd: kthreadd, oddjob i dd. Boję się, co zrobi pkill. Możesz wysłać sygnał -USR1 za pomocą pkill, ale znowu nie wiem, czy można bezpiecznie wysłać do wątku jądra lub obbjob. Polecenie zegarka wygląda na czystsze, ale wydaje się, że jest wiele dodatkowych kroków, aby uniknąć pętli while. Ogólnie, jeśli robię dd w jednym oknie, zaraz zrobię coś w tej samej powłoce. Pętla while jest bezpieczna: dokładnie wiesz, który pid odbiera sygnał.
Mike S
przeważnie nie dbam o to, które piki dostają sygnał, ponieważ używam watch pkill -USR1 -x dd. Ponieważ używam również watchdo innych podobnych zadań, to jest naturalne.
muru
11

http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html

Gruntownie:

kill -USR1 < dd pid >
hnasarat
źródło
1
„pkill -USR1 dd” to najprostsza wersja, o której wiem (pod warunkiem, że i tak używasz tylko jednej instancji dd). W moim systemie potrzebuję sudo: „sudo pkill -USR1 dd”. Działa po wpisaniu polecenia dd i nie musisz instalować niczego nowego.
Fred Hamilton
7

Najłatwiej jest:

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

oflag=dsyncutrzyma synchronizację pisania, dzięki czemu informacje będą status=progressbardziej dokładne. Jednak może być nieco wolniejszy.

zevero
źródło
1
według gnu.org/software/coreutils/manual/html_node/dd-invocation.html używanie conv=fsyncjest lepsze
Chen Deng-Ta
Dzięki za to! Robię dd do zdalnego lvm2, a bs = 4M zwiększyło mój transfer o współczynnik 20, a wskazanie postępu jest wspaniałe.
Lonnie Best,
6

W systemie Ubuntu 16.04

Ubuntu 16.04 jest dostarczany z wersją dd (coreutils) w wersji 8.25 . Dlatego opcja status=progress jest obsługiwana :-)

Aby go użyć, po prostu dodaj status=progresswraz z ddpoleceniem.

Przykład:

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

Nadaje status jako

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

wprowadź opis zdjęcia tutaj

Severus Tux
źródło
5

Użyj opcji, status=progressaby uzyskać postęp podczas przenoszenia.

Ponadto conv=fsyncbędą wyświetlać błędy We / Wy.

Przykład:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
MUY Belgium
źródło
3

Stworzyłem opakowanie bash, ddktóre będzie używać pvdo pokazywania postępu. Włóż do swojego .bashrci używaj ddjak zwykle:

# 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

Źródło:

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[@]}"
}
midenok
źródło
Dobry sposób, ale nie działa z poleceniami takimi jak sudo lub time.
Maxim Kholyavkin,
1
Umieścić go w katalogu / usr / local / bin / DD z tym na górze: #!/bin/bash. Na dole: tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"Lub możesz ustalić na stałe ddlokalizację. Następnie użyj local dd=/usr/bin/dd. Nie zapomnij dodać trochę wykonywalny: chmod +x /usr/local/dd.
midenok
2

Więc dzisiaj byłem trochę sfrustrowany próbą uruchomienia killw pętli podczas ddpracy i wymyśliłem tę metodę równoległego, łatwego uruchamiania:

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

Teraz po prostu używaj vddgdziekolwiek normalnie używasz dd(przekazuje wszystkie argumenty bezpośrednio przez), a raport postępu będzie drukowany co 5 sekund.

Jedynym minusem jest to, że polecenie nie wraca natychmiast po zakończeniu dd; więc możliwe jest, że to polecenie sprawi, że będziesz czekać dodatkowe 5 sekund po powrocie dd, zanim zauważy i zakończy działanie.

robru
źródło
2

To zmusza dd do dostarczania statystyk co 2 sekundy, co jest domyślne dla zegarka:

watch killall -USR1 dd

Aby zmienić z co 2 sekundy na co 5 sekund, dodaj opcję -n 5 w następujący sposób:

watch -n 5 killall -USR1 dd
Kostyantyn
źródło
2

Na wypadek, gdyby ktoś z ziemi CentOS znalazł ten wątek ...

Opcja „status = postęp” działa z CentOS 7.5 i 7.6

Powyższa odpowiedź autorstwa @davidDavidson sugeruje, że funkcja została nowo dodana w Coreutils 8.24.

Wersja 8.24 jądra GNU zawiera łatkę dla dd wprowadzającą parametr do drukowania postępu.

Może tak być, ale CentOS może nie stosować tego samego schematu kontroli wersji.

Wersja Coreutils dostarczana z CentOS 7.6.1810 to:

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

Zainstalowana wersja dd to:

[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.

To pokazuje wersje 8.22 .

Jednak przetestowałem „status = postęp” z dd zarówno w CentOS 7.5, jak i CentOS 7.6 (oba w wersji 8.22 Coreutils) i działa poprawnie.

Nie wiem, dlaczego RedHat decyduje się na użycie tak starej wersji Coreutils, ale funkcjonalność istnieje w wersji 8.22.

J Hauss
źródło
1

Jak wspomniano powyżej, przynajmniej z „dd” z GNU coreutils lub busybox, zareaguje na sygnał USR1, drukując informacje o postępie na stderr.

Napisałem mały skrypt otoki dla dd, który pokazuje ładny procent ukończenia i próbuje nie zakłócać procesu lub sposobu działania dd w jakikolwiek sposób. Możesz go znaleźć na github:

http://github.com/delt01/dd_printpercent

Niestety, ta sztuczka SIGUSR1 działa tylko z GNU dd (z pakietu coreutils) lub w trybie „dd” busyboksa z tą konkretną funkcją włączoną w czasie kompilacji. Nie działa z zapasem „dd” zawartym w większości systemów BSD, w tym FreeBSD i OS X ... :(

delt
źródło
Link jest martwy.
Ismael
1

Możesz obserwować postęp dowolnego programu Coreutils progress - Coreutils Progress Viewer.

Może monitorować:

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

Możesz zobaczyć stronę podręcznika

Możesz użyć go w osobnym oknie terminala, gdy polecenie jest uruchomione, lub uruchom je za pomocą polecenia dd:

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

Tutaj &rozwidla pierwsze polecenie i kontynuuje natychmiast, zamiast czekać na zakończenie polecenia.

Polecenie postępu jest uruchamiane z: -mwięc czeka na zakończenie monitorowanego procesu, -pwięc monitoruje dany pid i $!jest ostatnim pid polecenia.

Jeśli wydajesz dd z sudo, musisz też postępować z postępem:

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
labsin
źródło