Odpowiedzi:
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.
pvZainstaluj 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.
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:
dd if=/dev/urandom of=/dev/null status=progress
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw.
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000działa, zweryfikowany. @SopalajodeArrierez, parametry można podać w drugim dd.
pv < /dev/sda > /dev/sdbwydaje się mieć lepszą prędkość ( źródło )
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.
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.
kill -INFO $(pgrep ^dd$)w systemach BSD (takich jak OSX).
sudo pkill -usr1 ddjest łatwiejszy do zapamiętania, działa idealnie dobrze (przynajmniej na Ubuntu 14.04) i jest mniej wymagający do pisania.
pvże spowolni transfer, jak pokazał TeddHansen. Założę się też, że wielu ludzi googluje, bo już rozpoczęli ddoperację;)
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

źródło: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/
Również do archiwizacji siebie.
dialogz poleceniemapt-get install dialog
dialogprzykład. SERENITY TERAZ !
dialogże to niesamowicie pomoże w pisaniu skryptów powłoki: D
brew install pv dialogdla Maca. Również ten dżentelmen oblicza się ze stylem. Brawo.
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)
dd.
^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?)
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.
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
Najlepiej jest użyć http://dcfldd.sourceforge.net/ , jest łatwy do zainstalowania przez apt-get
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:)
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
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
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! :-)
whilepętlę. Użyj watch.
sudo watch pkill dd. Następnie ddwygodnie oglądaj statystyki.
watch pkill -USR1 -x dd. Ponieważ używam również watchdo innych podobnych zadań, to jest naturalne.
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
Gruntownie:
kill -USR1 < dd pid >
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.
conv=fsyncjest lepsze
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
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
Naprawdę lubię ddrescue, działa jak dd, ale daje dane wyjściowe i nie zawodzi przy błędach, wręcz przeciwnie, ma bardzo zaawansowany algorytm i bardzo ciężko próbuje wykonać udaną kopię ... Jest też wiele GUI
Projekt: https://www.gnu.org/software/ddrescue
Wikipedia: https://en.wikipedia.org/wiki/Ddrescue
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[@]}"
}
#!/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.
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.
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
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.
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 ... :(
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