Gibt es eine Methode, um unter Linux einen Prozentsatz für eine DD zu erhalten?

41

Also hier ist was passiert.

Ich habe eine Sicherung eines Laufwerks auf meinem Server über einen Linux-Live-USB-Stick gestartet. Ich fing an, das erste Laufwerk mit dem ddBefehl vanilla zu kopieren . nur sudo dd if=/dev/sda of=/dev/sdc1ich und dann erinnerte , dass dies nur die Konsole leer läßt , bis es fertig ist .

Ich musste ohnehin ein anderes Backup auf demselben Laufwerk ausführen, also habe ich auch dieses mit gestartet sudo dd if=/dev/sdb of=/dev/sdc3 status=progressund dann eine Textzeile mit der aktuellen Übertragungsrate und dem Fortschritt in Byte angezeigt.

Ich hoffte auf eine Methode, die einen Prozentsatz der Sicherung anzeigt, anstatt zu berechnen, wie viele Bytes von 1,8 TB gesichert wurden. Gibt es einen einfacheren Weg als status = progress?

Hastur
quelle

Antworten:

68

Antworten auf diese Frage anzeigen [ 1 ]

pv

Zum Beispiel können Sie verwenden, pv bevor Sie beginnen

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 

Ausgabe [ 2 ] :

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

Hinweise:
Vor allem für große Dateien , die Sie mögen , um zu sehen man ddund die Optionen benötigt , um alle auf Ihrer Hardware zu beschleunigen, zB bs=100Mdie Puffer zu setzen, um oflag=syncdas effektive Bytes geschrieben, vielleicht zu zählen direct...
Die Option -snimmt nur Integer - Parameter so 1.8T-->1844G.
Wie Sie an den ersten Zeilen erkennen können, brauchen Sie überhaupt nicht dd.


kill -USR1 pid

Wenn Sie den Befehl bereits gestartet habendd , können Sie, nachdem Sie die PID ( Ctrl- Z+ bgund das Lesen oder pgrep ^dd...) eingegeben haben, ein Signal senden USR1(oder SIGUSR1, oder SIGINFOsiehe unten) und die Ausgabe lesen.
Ist die PID des Programms 1234 mit

kill -USR1 1234

dd werde auf dem Terminal seines STDERR mit etwas ähnlichem antworten

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

Warnung: Unter OpenBSD müssen Sie möglicherweise vorher das Verhalten von kill[ 3 ] : use überprüfen
kill -SIGINFO 1234.
Es existiert die Signatur mit dem Namen SIGINFO. Der SIGUSR1sollte in diesem Fall das Programm beenden ( dd) ...
unter Ubuntu benutzen -SIGUSR1( 10).

Hastur
quelle
9
Sie werden mit ziemlicher Sicherheit feststellen, dass die Verwendung von 'bs' für den Befehl dd eine enorme Beschleunigung bewirkt. Wie dd if = / dev / blah von = / tmp / blah bs = 100M, um jeweils 100M Blöcke zu übertragen
Sirex
1
@ Sirex Natürlich müssen Sie die bs einstellen, um die Übertragungsrate in Bezug auf Ihre Hardware zu optimieren ... In der Antwort wird nur die Kommandozeile des OPs wiederholt. :-)
Hastur
3
@Criggie: Das liegt vielleicht daran, dddass bereits alle write()Systemaufrufe abgeschlossen waren und fsyncoder closeblockiert wurde, bis die Schreibvorgänge die Festplatte erreichen. Bei einem langsamen USB-Stick führen die standardmäßigen Schwellenwerte für den Linux-E / A-Puffer dafür, wie groß schmutzige Schreibpuffer sein können, zu einem qualitativ anderen Verhalten als bei großen Dateien auf schnellen Datenträgern, da die Puffer so groß sind, wie Sie und es kopieren dauert noch merklich lange.
Peter Cordes
5
Gute Antwort. Ich möchte jedoch darauf hinweisen, dass in OpenBSD das richtige Kill-Signal SIGINFO und nicht SIGUSR1 ist. Die Verwendung von -USR1 in OpenBSD beendet nur dd. Bevor Sie dies in einer neuen Umgebung ausprobieren, möchten Sie sich bei einer Übertragung, die Sie nicht unterbrechen möchten, möglicherweise mit der Funktionsweise der Umgebung vertraut machen (bei einem sichereren Test).
TOOGAM
1
die signalberatung für ddist wirklich eine großartige information, besonders für server, auf denen man nicht installieren kann / willpv
mike
38

Mein Werkzeug für diese Art von Sachen ist progress:

Dieses Tool kann als Tiny , Dirty, Linux- und OSX-Only-C-Befehl beschrieben werden, der nach Coreutils-Basisbefehlen (cp, mv, dd, tar, gzip / gunzip, cat usw.) sucht, die derzeit auf Ihrem System ausgeführt werden Zeigt den Prozentsatz der kopierten Daten an. Es kann auch die geschätzte Zeit und den geschätzten Durchsatz anzeigen und bietet einen "top-like" -Modus (Überwachung).

Screenshot "<code> Fortschritt </ code> in Aktion"

Es /procsucht einfach nach interessanten Befehlen, durchsucht Verzeichnisse fdund sucht fdinfonach geöffneten Dateien und Positionen und meldet den Status der größten Datei.

Es ist sehr leicht und mit praktisch jedem Befehl kompatibel.

Ich finde es besonders nützlich, weil:

  • im vergleich zu pvin pipe oder dcflddmuss ich nicht daran denken, einen anderen befehl auszuführen, wenn ich die operation starte, ich kann sachen nachträglich überwachen;
  • Im Vergleich dazu kill -USR1funktioniert es mit praktisch jedem Befehl. Ich muss die Manpage nicht immer noch einmal überprüfen, um sicherzustellen, dass ich die Kopie nicht versehentlich beendet habe. Außerdem ist es schön, dass beim Aufrufen ohne Parameter der Fortschritt für alle gängigen "Datenübertragungs" -Befehle angezeigt wird, die gerade ausgeführt werden, sodass ich nicht einmal die PID nachschlagen muss.
  • Im Vergleich dazu pv -dmuss ich die PID nicht nachschlagen.
Matteo Italia
quelle
1
Hinweis: Sie können mehr als nur Coreutils-Prozesse überwachen. Geben Sie einfach den Namen des Befehls mit an --command <command-name>.
Jpaugh
1
Das ist fantastisch!
Floris
25

Führen Sie dddann in einer separaten Shell den folgenden Befehl aus:

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

Dadurch erhält pv Statistiken über alle geöffneten Dateideskriptoren des ddProzesses. Es zeigt Ihnen beide, wo sich der Lese- und Schreibpuffer befindet.

sleblanc
quelle
2
Funktioniert nach der Tat !? Tolle!!
Jpaugh
3
Das ist sehr cool. Es vermeidet den Mehraufwand für Speicherbandbreite + Kontextwechsel, der entsteht, wenn alle Daten durch drei Prozesse geleitet werden! @jpaugh: Ich schätze mal, es wird nur nach Dateipositionen gesucht /proc/$PID/fdinfound /proc/$PID/fdnach welchen Dateien (und damit nach der Größe). Also ja, sehr cool und eine gute Idee für ein Feature, aber ich würde es nicht als "erstaunlich" bezeichnen, da es Linux-APIs gibt, mit denen die Dateipositionen eines anderen Prozesses abgefragt werden können.
Peter Cordes
@PeterCordes Ich habe nicht bemerkt, dass der Kernel die Dateiposition offengelegt hat. (Ich habe mein ganzes Leben damit verbracht, pvPipelines im Voraus sorgfältig vorzubereiten .) Natürlich ging ich davon aus, als ich sah, dass dies funktioniert.
Jpaugh
9

Es gibt eine Alternative zu dd: dcfldd.

dcfldd ist eine erweiterte Version von GNU dd mit nützlichen Funktionen für Forensik und Sicherheit.

Statusausgabe - dcfldd kann den Benutzer über den Fortschritt in Bezug auf die übertragene Datenmenge und die Dauer des Vorgangs informieren.

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
quelle
Es ist ein längerer Befehlsname ... klar, er ist minderwertig. (+1)
jpaugh
6

Als Prozentsatz müssten Sie ein bisschen rechnen, aber Sie können den Fortschritt eines DDS in einer für Menschen lesbaren Form erhalten, selbst nachdem Sie bereits damit begonnen haben kill -USR1 $(pidof dd)

Der aktuelle dd-Prozess wird folgendermaßen angezeigt:

11117279 Bytes (11 MB, 11 MiB) kopiert, 13,715 s, 811 kB / s

Sirex
quelle
4
Das ist im Grunde das gleiche, was status=progressgibt
Rakslice
1
Eigentlich wollte ich gerade sagen, dass dies genau dasselbe ist, was status = progress gibt.