Ich habe nicht dd
so viel benutzt, aber bisher ist es mir noch nicht durchgefallen. Im Moment habe dd
ich mehr als 12 Stunden Zeit - ich schreibe ein Image zurück auf die Festplatte, von der es stammt - und ich mache mir ein wenig Sorgen, da ich in der Lage war, dd
in etwa von der Festplatte auf das Image zu wechseln 7 Stunden.
Ich verwende OSX 10.6.6 auf einem MacBook mit einem Core 2 Duo mit 2,1 GHz / Core und 4 GB RAM. Ich lese von einer .dmg-Datei auf einer Festplatte mit 7200 U / min (dem Startlaufwerk) und schreibe auf ein Laufwerk mit 7200 U / min, das über einen SATA-zu-USB-Anschluss angeschlossen ist. Ich habe die Blockgröße standardmäßig belassen und das Bild ist ungefähr 160 GB groß.
EDIT: Und nach 14 Stunden reinen Stresses hat das doch dd
einwandfrei geklappt. Das nächste Mal werde ich es jedoch durchgehen pv
und nachverfolgen strace
. Vielen Dank an alle für Ihre Hilfe.
quelle
dd ... bs=16M
ist mein Vorschlag, angesichts Ihres Arbeitsspeichers, Ihrer Festplattengröße und Geschwindigkeit.dd
nach friert Mac OS X so oft ein, dass ich den Prozess nicht mehr beenden kann, sondern das System neu starten muss. Ich greife dann auf die Arbeit an einer Linux-VM zurück.Antworten:
dd
Mit demkill
Befehl können Sie ein bestimmtes Signal senden , damit es seinen aktuellen Status ausgibt. Das Signal istINFO
auf BSD-Systemen (einschließlich OSX) undUSR1
unter Linux. In deinem Fall:Sie finden die Prozess-ID (
$PID
oben) mit demps
Befehl; Oder lesen Sie pgrep- und pkill-Alternativen unter Mac OS X, um bequemere Methoden zu finden.Einfacher gesagt, wie AntoineG in seiner Antwort hervorhebt , können Sie
ctrl-T
in der Shell, in der dd ausgeführt wird, dasINFO
Signal eingeben .Als Beispiel für Linux könnten Sie alle aktiven
dd
Prozesse so ausgeben lassen:Nach der Ausgabe des Status
dd
wird der Kopiervorgang fortgesetzt.quelle
pkill -USR1 -x dd
INFO
Signal senden . Linux hat kein SIGINFO und verwendetUSR1
stattdessen.dd if=/dev/zero of=/dev/null
. :)Unter OS X (nicht unter Linux ausprobiert) können Sie einfach Ctrl+ Tin das laufende Terminal eingeben
dd
. Es wird die gleiche Ausgabe wie gedrucktkill -INFO $PID
, zuzüglich der CPU-Auslastung:Ich habe herausgefunden, dass ich diesen Thread gelesen und versucht habe, einen neuen Tab in meinem Terminal zu öffnen, aber ⌘+ Tmit Ctrl+ gemischt habe T.
quelle
load
ist die CPU-Auslastung?^T
zum Terminal.Für
dd
können Sie ein Signal senden . Bei anderen Befehlen, die in eine Datei lesen oder schreiben, können Sie deren Position in der Datei mit beobachtenlsof
.Wenn Sie im Voraus planen, leiten Sie die Daten weiter
pv
.quelle
pv
sieht aus wie nur das Ticket.Eine allgemeinere Methode ist
iotop
die Anzeige des aktuellen Lese- / Schreibvolumens pro Programm.BEARBEITEN:
iotop -o
Nur Programme anzeigen, die derzeit E / A-Vorgänge ausführen (danke Jason C für diesen Kommentar).quelle
iotop -o
verbirgt Prozesse, die keine E / A-Vorgänge ausführen, und macht es einfacher, auf einen Blick zu erkennen, was los ist.Normalerweise hänge ich an
strace
einen solchen laufenden Prozess an (mit der-p $PID
Option), um zu sehen, ob er bei einem Systemaufruf blockiert bleibt oder noch aktiv ist.Wenn Sie nervös sind, ein Signal an das laufende dd zu senden, starten Sie ein anderes dd, um zu überprüfen, ob dies funktioniert.
quelle
strace
? Außerdem habe ich ein anderes gestartetdd
und eines der vorgeschlagenen Signale an es gesendet, und ... es hat es getötet.Für das nächste Mal können Sie es einfach
pv
von Anfang an verwenden (falls es über Ihren Paketmanager verfügbar ist, installieren Sie es). Dies ist ein Dienstprogramm mit dem einzigen Zweck, die Eingabe an die Ausgabe weiterzuleiten und den Fortschritt und die Geschwindigkeit zu überwachen.Um ein Image auf ein Laufwerk zu schreiben, sagen wir 4 MB Blockgröße:
Abgesehen von der anfänglichen Pufferung (die durch eine abschließende Synchronisierung ausgeglichen wird, die durchgeführt werden kann,
dd
wenn Sie dies möchten), werden Ihnen ein Fortschrittsbalken, die Durchschnittsgeschwindigkeit, die aktuelle Geschwindigkeit und die ETA angezeigt.Die
iflag=fullblock
Option zwingt dd, volle Eingabeblöcke durchzuziehenpv
, sonst sind Sie der Pipe für Blockgrößen ausgeliefert.Verwenden Sie zum Lesen dd und zum Schreiben pv, obwohl Sie die Größe explizit angeben müssen, wenn es sich bei der Quelle um ein Blockgerät handelt. Für ein 4 GB Gerät:
Sie können die Größe auch automatisch bestimmen, so etwas wie:
Es spielt wirklich keine Rolle, in welcher Reihenfolge Sie vorgehen
dd
undpv
in welcher Reihenfolge Sie vorgehen. Es ist vollkommen leistungsabhängig - wenn das Gerät, auf das Sie lesen oder von dem Sie lesen, für bestimmte Blockgrößen die optimale Leistung aufweist,dd
anstattpv
auf dieses Gerät zuzugreifen. Sie können sogardd
an beiden Enden ein kleben, wenn Sie möchten, oder überhaupt nicht, wenn es Ihnen egal ist:quelle
Ab
coreutils
v8.24,dd
hat native Unterstützung für Fortschritte zeigt. Fügen Sie einfach die Option hinzustatus=progress
.Beispiel:
Quelle
quelle
ddrescue
gibt dir Statistiken, wie es läuft.Demo: http://www.youtube.com/watch?v=vqq9A01geeA#t=144s
quelle
Manchmal können Sie das INFO- oder USR1-Signal möglicherweise nicht verwenden, weil auf den stderr-Stream des
dd
Prozesses nicht zugegriffen werden kann (z. B. weil das Terminal, in dem es ausgeführt wurde, bereits geschlossen wurde). In diesem Fall können Sie das folgende Problem umgehen (unter FreeBSD getestet, unter Linux möglicherweise geringfügig anders):Verwenden Sie
iostat
diese Option , um die durchschnittliche Schreibrate (MB / s) auf dem Zielgerät zu schätzen. Beispiel:iostat -d -w30 ada0
Ersetzen Sie
ada0
hier den Namen Ihres Zielgeräts und warten Sie eine Minute, bis einige Ergebnisse vorliegen. Der Parameter "w" bestimmt, wie viele Sekunden zwischen den Abtastungen liegen. Wenn Sie den Wert erhöhen, erhalten Sie eine bessere Durchschnittsschätzung mit weniger Varianz. Sie müssen jedoch länger warten.Verwenden Sie
ps
diese Option , um zu bestimmen, wie langedd
ausgeführt wurde:ps -xo etime,command | grep dd
Konvertieren Sie dies in Sekunden, um die Gesamtlaufzeit in Sekunden zu erhalten.
Holen Sie sich die Gerätegröße in MB mit:
grep ada0 /var/run/dmesg.boot
Ersetzen Sie den Namen Ihres Zielgeräts durch
ada0
. Teilen Sie das Ergebnis durch die durchschnittliche Schreibrate, um die Gesamtübertragungszeit in Sekunden zu erhalten. Subtrahieren Sie die bisher gelaufene Zeit, um die verbleibende Zeit zu erhalten.Diese Strategie funktioniert nur, wenn
dd
seit Beginn kontinuierlich mit der aktuellen durchschnittlichen Schreibrate geschrieben wurde. Wenn andere Prozesse um die CPU- oder E / A-Ressourcen (einschließlich des E / A-Busses) konkurrieren, kann dies die Übertragungsrate verringern.quelle
Ich habe angefangen, dcfldd (1) zu verwenden, um dd-Operationen besser darzustellen.
quelle
Während der
dd
Ausführung starte ich dies in einem anderen Terminal als root:Er gibt den
dd
Status alle 1 Sekunde im ursprünglichen Terminalfenster aus, in dem erdd
ausgeführt wird, und wird beendet, wenn der Befehl ausgeführt wird.quelle
Sie können verwenden
progress
, um insbesondere den Fortschritt eines Laufs anzuzeigendd
. Es nutzt/proc/$pid/fd
und/proc/$pid/fdinfo
was Sie auch von Hand überwachen können.quelle
Die
wchar
Zeile (geschriebene Zeichen) in/proc/$pid/io
kann Ihnen genaue Informationen über dendd
Vorgang geben. Solange es sich ändert, arbeitet Ihrdd
noch!Hier ist ein netter kleiner PHP - Skript, die Sie speichern und führen Sie dann mit
php filename.php
während derdd
das geschriebenen Bytes angezeigt werden soll . Der nette Vorteil beobachten/proc/$pid/io
überkill -USR1 $(pidof dd)
ist , dass Sie nicht zwischen den Terminals wechseln müssen, was nicht immer eine Option.quelle