Warum wartet dd manchmal nicht, bis Daten geschrieben wurden?

20

Wenn ich Bilder auf ein Flash-Laufwerk schreibe, passiert Folgendes manchmal:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

Grundsätzlich speichert Linux alles im Cache, schreibt nichts und beendet sich dd. Nach syncder Eingabe werden die Daten geschrieben (die LED des Flash-Laufwerks beginnt zu blinken).

Warum passiert das?

jgillich
quelle
3
Sind Sie sicher, dass /dev/sdcein Gerät in Ihrem System vorhanden ist und Sie nicht in eine Datei schreiben /dev/sdc? Do an ls --color /dev- /dev/sdcsollte gelb sein, wenn es sich um ein Gerät handelt.
LawrenceC

Antworten:

21

Verwenden Sie dies stattdessen:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

Dieser ruft den fsync()nach jedem write()Systemaufruf auf. Dies zwingt dddazu, nichts zwischenzuspeichern. Siehe diesen Teil der Manpage von fsync ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

Dies ist das Standardverhalten des Kernels. Linux-Kernel verwalten Schreib- und Lesecaches wie write()folgt : Wenn der Syscall ausgegeben wird, werden die Daten schnell in den Cache geschrieben und der Status "Schreibvorgang abgeschlossen" wird an den Prozess gesendet. Wenn der Puffer benötigt wird oder wenn auf dem Bus freie Zeit vorhanden ist, werden die Daten aus dem Cache auf die Festplatte geschrieben.

Chaos
quelle
1
Ich mag, dass Ihre und meine Antwort fast völlig unterschiedliche Ansätze abdecken. Schön, +1.
ChrisInEdmonton
1
@ChrisInEdmonton dito +1
Chaos
Alle Antworten sind in dieser Frage gut.
Francisco Tapia
@chaos Nur zur Verdeutlichung: Dies ist das Standardverhalten des Kernels. - Meinen Sie, dass dies conv=fsyncdie Standardeinstellung ist, wenn Sie schreiben, um Geräte zu blockieren, ddbei denen nichts zwischengespeichert wird? Auf der Suche nach einer guten Antwort auf diese Frage
Jonathan Komar
10

Dies liegt daran, dass Linux und die meisten anderen Betriebssysteme Lese- und Schreibvorgänge zwischenspeichern. In den meisten Fällen reagiert Ihr Betriebssystem dadurch schneller.

Wenn Sie sicherstellen möchten, dass die zwischengespeicherten Daten geschrieben wurden, möchten Sie verwenden sync , wie Sie wissen, verwenden. Linux bietet eine große Anzahl von Einstellungen, die Sie ebenfalls anpassen können. Dieser Artikel gibt einen guten Überblick über einige Einstellungen. Sie können beispielsweise vm.dirty_background_bytes auf 0 setzen, um sicherzustellen, dass der Kernel die Flusher-Threads sofort startet.

ChrisInEdmonton
quelle
7

sync (8) - Linux-Manpage :

Der Kernel speichert die Daten im Speicher, um zu vermeiden, dass die Festplatte (relativ langsam) liest und schreibt. Dies verbessert die Leistung, aber wenn der Computer abstürzt, können Daten verloren gehen oder das Dateisystem beschädigt werden. Die Synchronisierung stellt sicher, dass alles im Speicher auf die Festplatte geschrieben wird.

Hinweis: unmount(oder Auswerfen) ruft automatisch auf, syncwas dies bei normaler Verwendung des Dateisystems "verbirgt".

Steven
quelle