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 dd
wychodzi. Po sync
wpisaniu zaczyna zapisywać dane (dioda LED napędu flash zaczyna migać).
Dlaczego to się dzieje?
linux
command-line
dd
jgillich
źródło
źródło
/dev/sdc
w twoim systemie jest rzeczywiste urządzenie i nie piszesz do pliku/dev/sdc
? Wykonajls --color /dev
-/dev/sdc
powinien być żółty, jeśli jest to urządzenie.Odpowiedzi:
Użyj tego zamiast:
To wywołuje
fsync()
po każdymwrite()
wywołaniu systemowym. To zmuszadd
do niczego nie buforowania. Zobacz tę część strony podręcznika fsync (man 2 fsync
):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.źródło
conv=fsync
jest to domyślne ustawienie podczas pisania w celu zablokowania urządzeń, któredd
niczego nie buforują? Szukasz dobrej odpowiedzi na to: unix.stackexchange.com/questions/312687/…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.źródło
Uwaga:
unmount
(lub wysunięcie) automatycznie wywołuje funkcję,sync
która „ukrywa” to podczas normalnego użytkowania systemu plików.źródło