1. Archiviazione basata su Flash
Dipende dal tipo di disco (dischi rigidi tradizionali vs. dischi a stato solido) o da qualsiasi altra variabile di cui potrei non essere a conoscenza? Succede (se succede) solo in Linux o è presente in altri sistemi operativi?
Quando hai una scelta, non dovresti permettere allo storage basato su flash di perdere energia senza un arresto pulito.
Su storage a basso costo come le schede SD, puoi aspettarti di perdere interi blocchi di cancellazione (diverse volte più grandi di 4KB), perdendo dati che potrebbero appartenere a diversi file o strutture essenziali del filesystem.
Alcuni costosi SSD potrebbero pretendere di offrire migliori garanzie in caso di mancanza di corrente. Tuttavia, test di terze parti suggeriscono che molti SSD costosi non riescono a farlo. Lo strato che rimappa i blocchi per il "livellamento dell'usura" è complesso e proprietario. I possibili guasti includono la perdita di tutti i dati sull'unità.
Applicando il nostro framework di test, testiamo 17 SSD di materie prime di sei diversi fornitori utilizzando in totale più di tremila cicli di iniezione di guasti. I nostri risultati sperimentali rivelano che 14 dei 17 dispositivi SSD testati presentano comportamenti di guasto sorprendenti in caso di interruzioni dell'alimentazione, tra cui corruzione dei bit, scritture rasate, scritture non serializzabili, corruzione dei metadati e guasti totali del dispositivo.
2017: https://dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2. Unità disco rigido rotanti
Gli HDD rotanti hanno caratteristiche diverse. Per sicurezza e semplicità, consiglio di presumere che abbiano la stessa incertezza pratica dello storage basato su flash.
A meno che tu non abbia prove specifiche, cosa che chiaramente non hai. Non ho dati comparativi per la rotazione degli HDD.
Un HDD potrebbe lasciare un settore scritto in modo incompleto con un checksum errato, il che ci darà un buon errore di lettura in seguito. In generale, questa modalità di guasto degli HDD è del tutto prevista; i filesystem nativi di Linux sono progettati pensando a questo. Mirano a preservare il contratto di fsync()
fronte a questo tipo di guasto di perdita di potenza. (Vorremmo davvero vederlo garantito su SSD).
Tuttavia non sono sicuro se i filesystem Linux riescano a raggiungere questo obiettivo in tutti i casi o se ciò sia persino possibile.
Il prossimo avvio dopo questo tipo di errore potrebbe richiedere una riparazione del filesystem. Essendo Linux, è possibile che la riparazione del filesystem ponga alcune domande che non capisci, dove puoi solo premere Y e sperare che si risolva da solo.
2.1 Se non sai qual è il contratto fsync ()
Il contratto fsync () è una fonte di buone e cattive notizie. Devi prima capire la buona notizia.
Buone notizie: fsync()
è ben documentato come il modo corretto di scrivere i dati del file, ad esempio quando si preme "salva". È risaputo che, ad esempio, gli editor di testo devono sostituire atomicamente i file esistenti rename()
. Questo ha lo scopo di assicurarsi di mantenere sempre il vecchio file o di ottenere il nuovo file (che è stato fsync()
editato prima della ridenominazione). Non vuoi essere lasciato con una versione scritta a metà del nuovo file.
Cattive notizie: per molti anni, chiamare fsync () sul filesystem Linux più popolare potrebbe effettivamente lasciare l'intero sistema in sospeso per decine di secondi. Dato che le applicazioni non possono fare nulla al riguardo, era molto comune usare in modo ottimistico rename () senza fsync (), che sembrava essere relativamente affidabile su questo filesystem.
Pertanto, esistono applicazioni che non utilizzano correttamente fsync ().
La prossima versione di questo filesystem generalmente evitava il blocco di fsync (), mentre iniziava a fare affidamento sull'uso corretto di fsync ().
È tutto piuttosto male. La comprensione di questa storia non è probabilmente aiutata dal tono sprezzante e dall'invettiva che è stata usata da molti sviluppatori del kernel in conflitto.
L'attuale risoluzione è che l'attuale filesystem Linux più popolare per impostazione predefinita supporta il modello rename () senza richiedere fsync ()implementa la "compatibilità bug-for-bug" con la versione precedente. Questo può essere disabilitato con l'opzione mount noauto_da_alloc
.
Questa non è una protezione completa. Fondamentalmente scarica l'IO in sospeso al momento della ridenominazione (), ma non attende il completamento dell'IO prima di rinominare. Tuttavia, è molto meglio di una finestra di pericolo di 60 secondi! Vedi anche la risposta a Quali filesystem richiedono fsync () per la sicurezza in caso di crash quando si sostituisce un file esistente con rename ()?
Alcuni filesystem meno popolari non offrono protezione. XFS si rifiuta di farlo. E UBIFS non lo ha nemmeno implementato, a quanto pare potrebbe essere accettato ma ha bisogno di molto lavoro per renderlo possibile. La stessa pagina sottolinea che UBIFS ha diversi altri problemi "TODO" per l'integrità dei dati, incluso in caso di perdita di potenza. UBIFS è un filesystem utilizzato direttamente su memoria flash. Immagino che alcune delle difficoltà che UBIFS menziona con l'archiviazione flash possano essere rilevanti per i bug dell'SSD.