Jakiś czas temu dyskutowano o tym, że ext4 potencjalnie pozostawia puste pliki po nieczystym odmontowaniu, podsumowane całkiem dobrze w tym artykule . Zasadniczo, z powodu opóźnionego przydziału, zapisy mogą być przechowywane w pamięci podręcznej zapisu przez znacznie dłuższy czas niż domyślny interwał zatwierdzania dziennika rozszerzenia (5 sekund).
Wydaje się, że problemy zostały naprawione w łatce, która wymusza blokowanie przydziału w określonych sytuacjach, tym samym zmuszając dane do dysku domyślnie po maksymalnie 5 sekundach.
Zastanawiam się, co się stanie, gdy aplikacja zastąpi istniejące części pliku, bez obcinania lub dołączania samego pliku. Czy to również zostanie zmuszone do dysku w ciągu 5 sekund?
Wydaje się, że jest to inna sytuacja niż dołączanie do pliku: podczas dołączania zmienia się rozmiar pliku, co jest zmianą metadanych; dlatego zatwierdzenie dziennika będzie konieczne w ciągu 5 sekund, a ze względu na dane = zamówione, dane będą musiały zostać wcześniej zapisane ze względów bezpieczeństwa (w przeciwnym razie części usuniętych plików innych użytkowników mogą pojawić się dla właściciela dołączonego plik).
Po prostu nadpisując dane pliku, nie ma powodu, dla którego zapis danych powinien nastąpić przed zatwierdzeniem dziennika metadanych, ponieważ stare dane należą do tego samego użytkownika co nowy. Czy więc zapis ma miejsce przed zatwierdzeniem, czy może być opóźniony dłużej niż interwał zatwierdzenia dziennika? Jeśli tak, to jak długo?
Aktualizacja: Wiem, że wszystko to jest nieistotne, gdy robisz właściwą rzecz, to znaczy używając fsync (). (To był główny powód całej dyskusji na temat ext4 i utraty danych - problem dotyczył tylko aplikacji, które nie były fsync () lub nie we właściwych momentach.) Nie piszę własnej aplikacji, pytam, ponieważ ja nie wiem, czy wszystkie moje aplikacje działają poprawnie, i chcę znać przybliżone ramy czasowe dla takich „niebezpiecznych” zapisów. Powodem pytania jest to, że mój sterownik grafiki regularnie powoduje panikę jądra i chcę wiedzieć, czy muszę się martwić o więcej niż ostatnie 5 sekund zapisu danych.
źródło
sync
(lub, równoważnie, gdy uruchamiany jest licznik czasu zatwierdzenia). W momenciesync
ukończenia nie ma absolutnie żadnych brudnych danych, metadanych ani stron dziennika. Wszelkie zmiany w systemie plików podczas synchronicznego przesyłania danych są blokowane, dopóki się nie zakończy.commit=...
isync
NIE są równoważne? A może tytso sugerowało, że nawet przy pomocysync
nie popełnia nieprzydzielonych stron? Nie mogę sobie tego wyobrazić, ponieważ byłoby to sprzeczne ze specyfikacjami POSIX. Może mógłbyś użyć tego skryptu bash, który zapewniłem dlaJakakolwiek jest odpowiedź na twoje pytanie, nie ma to znaczenia.
Gwarantowana narażony zachowanie systemu plików ext4 jest, że „dane będą znajdować się na dysku po udanej
sync
/fsync
rozmowy”. Tak więc, jeśli masz aplikację, która powoduje, że zadajesz to pytanie, powinieneś wstawiać wywołania synchronizacji w krytycznych punktach, w których należy zapewnić integralność danych. Jeśli martwisz się tym samym problemem, możesz zadzwonić dosync
narzędzia wiersza polecenia, zanim zrobisz coś niebezpiecznego, co może spowodować nieczyste zamknięcie.źródło