Czy istnieje metoda uzyskania procentu wartości DD w systemie Linux?

41

Oto co się dzieje.

Rozpocząłem tworzenie kopii zapasowej dysku na moim serwerze za pośrednictwem USB na żywo Linux. Zacząłem kopiować pierwszy dysk za pomocą ddpolecenia waniliowego; właśnie sudo dd if=/dev/sda of=/dev/sdc1przypomniałem sobie, że konsola pozostawia pustą aż do zakończenia.

W każdym razie musiałem uruchomić inną kopię zapasową na tym samym dysku, więc zacząłem tę również od, sudo dd if=/dev/sdb of=/dev/sdc3 status=progressa następnie dostałem wiersz tekstu, który pokazuje bieżącą szybkość przesyłania, a także postęp w bajtach.

Miałem nadzieję na metodę, która pokazuje procent kopii zapasowej zamiast matematyki, ile bajtów zostało utworzonych z 1,8 TB. Czy jest na to łatwiejszy sposób niż status = postęp?

Hastur
źródło

Odpowiedzi:

68

Zobacz odpowiedzi na to pytanie [ 1 ]

pv

Na przykład możesz użyć pv przed rozpoczęciem

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 

Wyjście [ 2 ] :

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

Uwagi:
Zwłaszcza w przypadku dużych plików możesz chcieć zobaczyć man ddi ustawić opcje potrzebne do przyspieszenia całego sprzętu, np. bs=100MUstawić bufor, oflag=syncpoliczyć zapisane bajty efektywne, być może direct...
Ta opcja -sprzyjmuje tylko parametry całkowite 1.8T-->1844G.
Jak widać z pierwszych linii, wcale nie potrzebujesz dd.


kill -USR1 pid

Jeśli już uruchomiona na ddkomendę, gdy już Indywidualizacji jego PID ( Ctrl- Z+ bgi ją przeczytać, albo pgrep ^dd...) możesz wysłać sygnał USR1(lub SIGUSR1, lub SIGINFOpatrz poniżej) i odczytać wynik.
Jeśli PID programu to 1234 przy pomocy

kill -USR1 1234

dd odpowie na terminalu swojego STDERR czymś podobnym do

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

Ostrzeżenie: w OpenBSD może być konieczne wcześniejsze sprawdzenie zachowania kill[ 3 ] : użyj zamiast tego
kill -SIGINFO 1234.
Istnieje sigaction o nazwie SIGINFO. Ten SIGUSR1, w tym przypadku, powinien zakończyć program ( dd) ...
W Ubuntu use -SIGUSR1( 10).

Hastur
źródło
9
prawie na pewno przekonasz się, że użycie „bs” w poleceniu dd znacznie przyspiesza. Jak dd if = / dev / blah z = / tmp / blah bs = 100 mln, aby przesłać 100 mln bloków naraz
Sirex
1
@Sirex Oczywiście musisz ustawić bs, aby zoptymalizować szybkość transferu w stosunku do twojego sprzętu ... W odpowiedzi powtarza się wiersz polecenia OP. :-)
Hastur
3
@ Criggie: być może dlatego, ddże zakończył już wszystkie write()wywołania systemowe fsynclub closezostał zablokowany w oczekiwaniu na zapis na dysku. W przypadku wolnej pamięci USB domyślne progi bufora we / wy systemu Linux dla tego, jak duże mogą być brudne bufory zapisu, prowadzą do jakościowo innego zachowania niż w przypadku dużych plików na szybkich dyskach, ponieważ bufory są tak duże, jak to, co kopiujesz, i to wciąż zajmuje zauważalny czas.
Peter Cordes
5
Świetna odpowiedź. Chciałbym jednak zauważyć, że w OpenBSD właściwym sygnałem zabicia jest SIGINFO, a nie SIGUSR1. Użycie -USR1 w OpenBSD zabije tylko dd. Dlatego zanim wypróbujesz to w nowym środowisku, w przypadku przesyłania, którego nie chcesz przerywać, możesz zapoznać się z działaniem środowiska (podczas bezpieczniejszego testu).
TOOGAM
1
rada sygnałów dla ddjest naprawdę świetną informacją, szczególnie dla serwerów, na których nie możesz / nie chcesz instalowaćpv
mike 3'18
38

Moje narzędzie do tego typu rzeczy to progress:

To narzędzie można opisać jako komendę C Tiny , Dirty, Linux-and-OSX-only, która wyszukuje podstawowe komendy coreutils (cp, mv, dd, tar, gzip / gunzip, cat itp.) Aktualnie uruchomione w systemie i wyświetla procent skopiowanych danych. Może także pokazywać szacowany czas i przepustowość oraz zapewnia tryb „top-like” (monitorowanie).

Zrzut ekranu „<code> progress </code> w akcji”

Po prostu skanuje w /procposzukiwaniu interesujących poleceń, a następnie przegląda katalogi fdi fdinfoznajduje otwarte pliki oraz szuka pozycji i raportuje stan największego pliku.

Jest bardzo lekki i kompatybilny z praktycznie każdym poleceniem.

Uważam to za szczególnie przydatne, ponieważ:

  • w porównaniu do pvpotoku lub dcfldd, nie muszę pamiętać, aby po uruchomieniu operacji uruchomić inną komendę, po tym mogę monitorować różne rzeczy;
  • w porównaniu z tym kill -USR1, działa na praktycznie każdym poleceniu, nie muszę zawsze dwukrotnie sprawdzać strony podręcznika, aby upewnić się, że przypadkowo nie zabiję kopii; fajnie jest też, że po wywołaniu bez parametrów pokazuje postęp dla każdego aktualnie uruchomionego polecenia „transfer danych”, więc nie muszę nawet szukać PID;
  • w porównaniu do tego pv -d, znowu nie muszę szukać PID.
Matteo Italia
źródło
1
Uwaga: Możesz monitorować więcej niż tylko procesy coreutils. Wystarczy podać nazwę polecenia za pomocą --command <command-name>.
jpaugh
1
To jest niesamowite!
Floris,
25

Uruchom dd, a następnie w osobnej powłoce uruchom następującą komendę:

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

Spowoduje to, że pv uzyska statystyki dotyczące wszystkich otwartych deskryptorów plików ddprocesu. Pokaże wam oboje, gdzie znajduje się bufor odczytu i zapisu.

sleblanc
źródło
2
Działa po fakcie !? Niesamowity!!
jpaugh
3
To bardzo fajnie. Pozwala to uniknąć przepustowości pamięci i obciążenia związanego z przełączaniem kontekstu podczas przesyłania wszystkich danych przez 3 procesy! @jpaugh: Myślę, że po prostu sprawdza /proc/$PID/fdinfopozycje plików i /proc/$PID/fdsprawdza, które pliki (a więc i rozmiary). Tak, bardzo fajny i dobry pomysł na tę funkcję, ale nie nazwałbym tego „niesamowitym”, ponieważ istnieją interfejsy API systemu Linux, które pozwalają sondować pozycje plików innego procesu.
Peter Cordes
@PeterCordes Nie zdawałem sobie sprawy, że pozycja pliku została ujawniona przez jądro. (Całe życie spędziłem ostrożnie przygotowując pvrurociągi z wyprzedzeniem.) Oczywiście przyjąłem tyle samo, gdy zobaczyłem, że to działa.
jpaugh
9

Jest to alternatywa dla dd: dcfldd.

dcfldd to ulepszona wersja GNU dd z funkcjami użytecznymi dla kryminalistyki i bezpieczeństwa.

Wyjście statusu - dcfldd może aktualizować użytkownika o postępach pod względem ilości przesyłanych danych i tego, jak długo potrwa operacja.

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.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd

Antonin Décimo
źródło
To dłuższa nazwa polecenia ... najwyraźniej jest gorsza. (+1)
jpaugh
6

Jako procent musiałbyś wykonać matematykę, ale możesz uzyskać postęp dd w postaci czytelnej dla człowieka, nawet po rozpoczęciu, wykonując kill -USR1 $(pidof dd)

Bieżący proces dd wyświetli podobny do:

11117279 bajtów (11 MB, 11 MiB) skopiowanych, 13,715 s, 811 kB / s

Sirex
źródło
4
To w zasadzie to samo, co status=progressdaje
rakslice 30.01.2018
1
Właśnie miałem powiedzieć, że dokładnie to samo daje status = postęp.