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.
pv
Zainstaluj pv
i umieść go między dd
poleceniami 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, --size
jeśli chcesz oszacować czas.
Przykład Założenie, że dysk 2 GB jest kopiowany z / dev / sdb
Polecenie bez pv
był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ć pv
bezpoś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 pv
automatycznie rozpoznaje rozmiar.
status
Dodano nową opcję dd
(GNU Coreutils 8.24+)dd
w GNU Coreutils 8.24+ (Ubuntu 16.04 i nowsze) dostał nową status
opcję 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=35000
działa, zweryfikowany. @SopalajodeArrierez, parametry można podać w drugim dd.
pv < /dev/sda > /dev/sdb
wydaje się mieć lepszą prędkość ( źródło )
dd if=/dev/urandom | pv | of=/dev/sdb
daje ~ 18 dd if=/dev/zero | pv | of=/dev/sdb
MB / s zapisu, daje ~ 80 MB / s, a zwykły stary dd if=/dev/zero of=/dev/sdb
daje ~ 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ą kill
polecenia.
Aby zobaczyć postęp dd
działania, otwórz inny terminal i wprowadź:
sudo kill -USR1 $(pgrep ^dd)
Spowoduje to wyświetlenie dd
postępu w dd
oknie terminala bez zatrzymywania procesu. Jeśli korzystasz z BSD lub OS X, użyj INFO
zamiast USR1
. USR1
Sygnał zakończenia dd.
Jeśli chcesz regularnie otrzymywać informacje o dd
postępach, wpisz:
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
watch
będzie sondować dd
proces 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 dd
jest ł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 dd
operację;)
Kilka przydatnych przykładowych zastosowań z pv
mniejszym pisaniem lub większym postępem niż inne odpowiedzi:
Najpierw musisz zainstalować pv
za 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.
dialog
z poleceniemapt-get install dialog
dialog
przykład. SERENITY TERAZ !
dialog
że to niesamowicie pomoże w pisaniu skryptów powłoki: D
brew install pv dialog
dla Maca. Również ten dżentelmen oblicza się ze stylem. Brawo.
Użyj Ctrl+ Shift+ Tpodczas dd
dział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
.
^T
na 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-essential
a apt-get build-dep coreutils
następnie pobierz coreutils-8.25.tar.xz tar xvf coreutils-8.25.tar.xz
configure --prefix=$HOME/usr/local
i uruchom make
. Nowo skompilowane dd
będą w src
reż. 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
dd
i opcję status=on
domyś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 dd
narzę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 dd
jako 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 | dd
Triada 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
bg
umieścić to w tle. Zauważ, że bg
to da ci wynik jak [1] 6011
tam, 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! :-)
while
pętlę. Użyj watch
.
sudo watch pkill dd
. Następnie dd
wygodnie oglądaj statystyki.
watch pkill -USR1 -x dd
. Ponieważ używam również watch
do 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=dsync
utrzyma synchronizację pisania, dzięki czemu informacje będą status=progress
bardziej dokładne. Jednak może być nieco wolniejszy.
conv=fsync
jest 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=progress
wraz z dd
poleceniem.
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=progress
aby uzyskać postęp podczas przenoszenia.
Ponadto conv=fsync
bę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, dd
które będzie używać pv
do pokazywania postępu. Włóż do swojego .bashrc
i używaj dd
jak 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 dd
lokalizację. 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 kill
w pętli podczas dd
pracy 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 vdd
gdziekolwiek 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: -m
więc czeka na zakończenie monitorowanego procesu, -p
wię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