Dlaczego synchronizacja jest tak ważna przy tworzeniu bootowalnej pamięci USB z Linuksem?

15

Z Arch Wiki Wiki: https://wiki.archlinux.org/index.php/USB_flash_installation_media

# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync

[...] Czy nie tęsknić sync, aby zakończyć przed wyciągnięciem dysku USB.

chciałbym wiedzieć

  • Co to robi?
  • Jakie konsekwencje zostaną pominięte?

Notatki

ddpolecenie używane z opcjonalnym status=progress:

tar -xzOf archlinux-2016-09-03-dual.iso | dd of=/dev/disk2 bs=4M status=progress && sync

Lub używając pvdo postępu

tar -xzOf archlinux-2016-09-03-dual.iso | pv | dd of=/dev/disk2 bs=4M && sync
Jonathan Komar
źródło

Odpowiedzi:

19

ddNie ominąć skrytek dyskowych jądra, gdy pisze do urządzenia, więc jakaś część danych może nie być jeszcze zapisane na USBpatyku po ddzakończeniu. Jeśli USBw tym momencie wyciągniesz wtyczkę z gniazdka , zawartość na USBpatyku będzie niespójna. W związku z tym system może nawet nie uruchomić się z tego USBdrążka.

Sync opróżnia dane znajdujące się w pamięci podręcznej na urządzeniu.

Zamiast wywoływania syncmożna użyć fdatasync ddopcji konwersji:

fdatasync

fizycznie zapisz dane pliku wyjściowego przed zakończeniem

W twoim przypadku polecenie byłoby:

tar -xzOf archlinux-2016-09-03-dual.iso | \
dd of=/dev/disk2 bs=4M status=progress conv=fdatasync

Te conv=fdatasyncmarki ddskutecznie wywołać fdatasync()wywołania systemowego pod koniec transferu tuż przed ddwyjściami (sprawdziłem to z dd„s źródeł).

Potwierdza to, ddże nie obejdzie ani nie opróżni pamięci podręcznej, chyba że zostanie to wyraźnie zalecone.

Serge
źródło
Dziękuję za Twój wkład, jednak nie jestem pewien, czy to stwierdzenie jest poprawne . ddNie omija pamięci podręcznej dysku jądra podczas zapisywania na urządzeniu . Podczas zapisywania do pliku (przez warstwę systemu plików jądra) rzeczy są buforowane. Martwię się jednak pisaniem na urządzenia. Podaj źródło tego oświadczenia, jeśli możesz, ponieważ jest to podstawa tego pytania. Jeśli jest prawdą, podałby prawidłowy powód uruchomienia syncpo operacji na ddurządzeniu .
Jonathan Komar
Tak, jest buforowany. Buforowanie odbywa się wewnątrz infrastruktury urządzeń blokowych jądra. Same operacje na plikach nie są buforowane. podstawowy interfejs urządzenia blokowego dokonuje wypłaty gotówki. źródło: lxr.free-electrons.com/source/block/blk-flush.c
Serge
@ macmadness86 zobacz zaktualizowaną odpowiedź
Serge
7
Preferuję używanie oflag=sync, więc postęp wysyła rzeczywistą prędkość transferu, a nie buforowaną (tak więc stabilne 10 MB / s zamiast jednej sekundy 100 MB / s, a następnie 10 sekund utknięcia).
Bart Polot,
Zapis do urządzenia blokowego całkowicie pomija VFS. Innymi słowy: zapis do pliku może być buforowany przez jądro (i zwykle tak jest), ale zapis do urządzenia nigdy nie jest buforowany przez jądro (i nie może).
Eric
0

Na stronie podręcznika synchronizacji (1): „synchronizacja - Synchronizacja zapisanych w pamięci podręcznej zapisów w pamięci trwałej”. Zasadniczo syncupewnia się, że wszystkie dane są zapisywane na pamięć podręczną z pamięci podręcznej.

schaiba
źródło
Nie widzę, gdzie w twoim pytaniu pojawia się część o zapaleniu światła.
schaiba