Erzwinge, dass dd nicht zwischenspeichert oder nicht aus dem Cache liest

22

Ich arbeite an einem Embedded-System mit der Busybox-Version von dd. Ich versuche, ein Löschen des Laufwerks von einem externen Dienstprogramm aus zu testen, aber dd liest nach dem Löschen nicht erneut von der Disc, sondern zeigt mir die zwischengespeicherten Daten an.

Ich habe es auf dd eingegrenzt, als wenn ich eine erste dd mache, die Daten sehe, mein System neu starte, um den Cache zu leeren, das Löschen durchführte und dann dd erneut ausführte, kam es mit allen Nullen auf.

Wenn ich jedoch in den Werkseinstellungen dd mache, lösche ich das Laufwerk und mache dd erneut, ohne es neu zu starten, dann werden mir erst nach einem Neustart alle Nullen angezeigt.

Ich habe in der GNU-Manpage gelesen, dass dd das iflag opt mit einem Nocache-Flag unterstützt, aber busybox unterstützt diese Option nicht, so dass dies nicht in Frage kommt.

Meine Frage ist, wie ich dd zwingen kann, von der Scheibe anstatt vom Pufferspeicher wieder zu lesen?

leidenschaftlich
quelle
2
Mögliches Nitpicking, aber ... dd speichert es nicht im Cache. Das Kernel / Disk-System funktioniert. Aus diesem Grund funktioniert der Befehl von Frostschutz (der nicht an dd gesendet wird).
Hennes
Ich brauche das, um die Festplatte wach zu halten, anstatt auf das Hochfahren zu warten.
neverMind9

Antworten:

11

Du könntest es versuchen

sync
echo 3 > /proc/sys/vm/drop_caches

was alle Arten von Caches löscht.

Details siehe /usr/src/linux/Documentation/sysctl/vm.txtauf drop_caches.

(Hinweis: Die Frage betraf die busybox dd, die bis heute noch nicht unterstützt wird iflag=direct.)

Frostschutz
quelle
1
Nur eine Anmerkung: das funktioniert nur mit Linux. /procIn einigen eingebetteten Linux-Konfigurationen ist das Dateisystem deaktiviert.
@EvanTeitelman Richtig, es scheint hier allerdings zu funktionieren, also werde ich diese Antwort unterstützen und akzeptieren.
glühender
2
Ich habe mich gefragt, ob dies einen einmaligen Effekt hat oder noch andauert. Nach dieser ist die Wirkung eine einmalige.
Craig McQueen
Dadurch werden die Caches gelöscht, es wird jedoch nichts dagegen ddunternommen, sie bei der Übertragung großer Datenmengen in den Papierkorb zu werfen.
Jan Hudec
9

Basierend auf der Antwort von @ sendmoreinfo:

dd if=/dev/device iflag=direct bs=1M

Der Lese-Cache ist davon nicht betroffen.

Ole Tange
quelle
Das funktioniert, aber wird auch nicht zwischengespeichert, was gerade gelesen wird?
neverMind9
1
Richtig. Das ist das Ziel.
Ole Tange
8

Direkte E / A (offener Modus O_DIRECT) sollte funktionieren, aber Ihr Kernel und / oder ddmöglicherweise nicht unterstützen.

sendmoreinfo
quelle
4
Dies ist die richtige Antwort: dd if = / dev / device iflag = direct bs = 1M; Der Lese-Cache ist davon nicht betroffen.
Ole Tange
1
@OleTange: Warum postest du das dann nicht als deine eigene Antwort? Dies ist der Nr. 1-Hit bei Google für "dd no cache", und die tatsächliche richtige Antwort ist in einem Kommentar zu einer nicht akzeptierten Antwort ...
mic_e
5

Ein kleiner Vorgeschmack auf das iflag = direkte Antwort; Bieten Sie auch einen Fortschrittsbalken an:

dd iflag=direct if=~/source.iso | pv | dd oflag=direct of=/dev/sdb bs=8M

Ohne das iflag / oflag ist der pv-Bericht fertig und sieht dann so aus, als wäre er aufgehängt. aber die dd zum gerät arbeitet immer noch am cache.

awltux
quelle