Dlaczego dd czasami nie czeka, aż dane zostaną zapisane?

20

Czasami, gdy piszę obrazy na dysk flash, dzieje się tak:

$ 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

Zasadniczo Linux buforuje wszystko, niczego nie zapisuje i ddwychodzi. Po syncwpisaniu zaczyna zapisywać dane (dioda LED napędu flash zaczyna migać).

Dlaczego to się dzieje?

jgillich
źródło
3
Czy jesteś pewien, że /dev/sdcw twoim systemie jest rzeczywiste urządzenie i nie piszesz do pliku /dev/sdc? Wykonaj ls --color /dev- /dev/sdcpowinien być żółty, jeśli jest to urządzenie.
LawrenceC,

Odpowiedzi:

21

Użyj tego zamiast:

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

To wywołuje fsync()po każdym write()wywołaniu systemowym. To zmusza dddo niczego nie buforowania. Zobacz tę część strony podręcznika 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)).

Jest to domyślne zachowanie jądra. Jądra systemu Linux zarządzają pamięcią podręczną zapisu i odczytu w następujący sposób: Po write()wydaniu wywołania syscall dane są szybko zapisywane w pamięci podręcznej, a proces jest wysyłany do procesu. Gdy potrzebny jest bufor lub gdy na magistrali jest wolny czas, dane są zapisywane z pamięci podręcznej na dysk twardy.

chaos
źródło
1
Podoba mi się, że twoja odpowiedź i moje obejmują prawie całkowicie różne podejścia. Fajnie, +1.
ChrisInEdmonton
1
@ChrisInEdmonton dito +1
chaos
wszystkie odpowiedzi są dobre w tym pytaniu.
Francisco Tapia,
@chaos Wyjaśnij: Jest to domyślne zachowanie jądra. -Czy masz na myśli, że conv=fsyncjest to domyślne ustawienie podczas pisania w celu zablokowania urządzeń, które ddniczego nie buforują? Szukasz dobrej odpowiedzi na to: unix.stackexchange.com/questions/312687/…
Jonathan Komar
10

Dzieje się tak, ponieważ Linux i większość innych systemów operacyjnych buforują zarówno odczyt, jak i zapis. W większości przypadków sprawia to, że system operacyjny jest bardziej responsywny.

Jeśli chcesz mieć pewność, że zapisane w pamięci podręcznej dane zostały zapisane, chcesz je wykorzystać sync, jak wiesz. Linux udostępnia również znaczną liczbę ustawień, które można dostroić. Ten artykuł zawiera dobry przegląd niektórych ustawień. Możesz ustawić vm.dirty_background_bytes na 0, na przykład, aby zapewnić, że jądro natychmiast zacznie wątki flusher.

ChrisInEdmonton
źródło
7

sync (8) - strona podręcznika użytkownika Linux :

Jądro przechowuje dane w pamięci, aby uniknąć wykonywania (stosunkowo powolnych) odczytów i zapisów na dysku. Zwiększa to wydajność, ale jeśli komputer ulegnie awarii, dane mogą zostać utracone lub system plików uszkodzony. Dzięki synchronizacji wszystko w pamięci jest zapisywane na dysku.

Uwaga: unmount(lub wysunięcie) automatycznie wywołuje funkcję, syncktóra „ukrywa” to podczas normalnego użytkowania systemu plików.

Steven
źródło