1. Penyimpanan berbasis flash
Apakah ini tergantung pada jenis disk (hard drive tradisional vs solid-state disk) atau variabel lain yang mungkin tidak saya sadari? Apakah hanya terjadi di Linux atau di OS lain?
Ketika Anda punya pilihan, Anda tidak boleh membiarkan penyimpanan berbasis flash kehilangan daya tanpa shutdown bersih.
Pada penyimpanan berbiaya rendah seperti kartu SD, Anda dapat kehilangan seluruh blok-hapus (beberapa kali lebih besar dari 4KB), kehilangan data yang mungkin berasal dari file yang berbeda atau struktur penting dari sistem file.
Beberapa SSD mahal mungkin mengklaim menawarkan jaminan yang lebih baik dalam menghadapi kegagalan daya. Namun pengujian pihak ketiga menunjukkan bahwa banyak SSD mahal gagal melakukannya. Lapisan yang memetakan ulang blok untuk "wear leveling" adalah kompleks dan eksklusif. Kemungkinan kegagalan termasuk hilangnya semua data pada drive.
Menerapkan kerangka kerja pengujian kami, kami menguji 17 SSD komoditas dari enam vendor berbeda menggunakan total lebih dari tiga ribu siklus injeksi kesalahan. Hasil eksperimental kami mengungkapkan bahwa 14 dari 17 perangkat SSD yang diuji menunjukkan perilaku kegagalan yang mengejutkan di bawah gangguan daya, termasuk kerusakan bit, penulisan sobek, penulisan yang tidak dapat digunakan, korupsi metadata, dan kegagalan total perangkat.
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. Memutar drive hard disk
HDD pemintalan memiliki karakteristik yang berbeda. Untuk keamanan dan kesederhanaan, saya sarankan mengasumsikan mereka memiliki ketidakpastian praktis yang sama dengan penyimpanan berbasis flash.
Kecuali jika Anda memiliki bukti spesifik, yang jelas tidak Anda miliki. Saya tidak memiliki angka perbandingan untuk memintal HDD.
HDD mungkin meninggalkan satu sektor yang ditulis tidak lengkap dengan checksum yang buruk, yang akan memberi kita kegagalan membaca yang bagus nantinya. Secara umum, mode kegagalan HDD ini sepenuhnya diharapkan; filesystem Linux asli dirancang dengan mempertimbangkan hal itu. Mereka bertujuan untuk mempertahankan kontrak fsync()
dalam menghadapi kesalahan kehilangan daya jenis ini. (Kami benar-benar ingin melihat ini dijamin pada SSD).
Namun saya tidak yakin apakah sistem file Linux mencapai ini dalam semua kasus, atau apakah itu mungkin.
Boot berikutnya setelah jenis kesalahan ini mungkin memerlukan perbaikan sistem file. Karena ini Linux, ada kemungkinan bahwa perbaikan sistem file akan menanyakan beberapa pertanyaan yang tidak Anda mengerti, di mana Anda hanya bisa menekan Y dan berharap itu akan beres sendiri.
2.1 Jika Anda tidak tahu apa kontrak fsync ()
Kontrak fsync () adalah sumber berita baik dan berita buruk. Anda harus memahami kabar baiknya terlebih dahulu.
Berita baik: fsync()
didokumentasikan dengan baik sebagai cara yang benar untuk menulis data file misalnya ketika Anda menekan "save". Dan secara luas dipahami bahwa editor teks misalnya harus mengganti file yang ada secara atom menggunakan rename()
. Ini dimaksudkan untuk memastikan bahwa Anda selalu menyimpan file lama, atau mendapatkan file baru (yang fsync()
diedit sebelum mengganti nama). Anda tidak ingin dibiarkan dengan versi baru dari file yang baru.
Berita buruk: selama bertahun-tahun, memanggil fsync () pada sistem file Linux yang paling populer dapat secara efektif membuat seluruh sistem menggantung selama puluhan detik. Karena aplikasi tidak dapat melakukan apapun mengenai hal ini, sangat umum untuk secara optimis menggunakan rename () tanpa fsync (), yang tampaknya relatif dapat diandalkan pada sistem file ini.
Oleh karena itu, ada aplikasi yang tidak menggunakan fsync () dengan benar.
Versi selanjutnya dari sistem file ini umumnya menghindari hang fsync () - pada saat yang sama ketika mulai bergantung pada penggunaan fsync () yang benar.
Ini semua sangat buruk. Memahami riwayat ini mungkin tidak terbantu oleh nada penolakan dan makian yang digunakan oleh banyak pengembang kernel yang saling bertentangan.
Resolusi saat ini adalah sistem file Linux yang paling populer saat ini default untuk mendukung pola rename () tanpa memerlukan fsync ()mengimplementasikan "kompatibilitas bug-untuk-bug" dengan versi sebelumnya. Ini dapat dinonaktifkan dengan opsi pemasangan noauto_da_alloc
.
Ini bukan perlindungan lengkap. Pada dasarnya ia menghapus IO yang tertunda pada waktu rename (), tetapi tidak menunggu IO selesai sebelum berganti nama. Ini jauh lebih baik daripada misalnya jendela bahaya 60 detik! Lihat juga jawaban untuk Sistem file mana yang membutuhkan fsync () untuk keamanan crash saat mengganti file yang sudah ada dengan rename ()?
Beberapa sistem file yang kurang populer tidak memberikan perlindungan. XFS menolak untuk melakukannya. Dan UBIFS juga belum mengimplementasikannya, tampaknya itu bisa diterima tetapi membutuhkan banyak usaha untuk memungkinkannya. Halaman yang sama menunjukkan bahwa UBIFS memiliki beberapa masalah "TODO" lainnya untuk integritas data, termasuk kehilangan daya. UBIFS adalah sistem file yang digunakan langsung pada penyimpanan flash. Saya membayangkan beberapa kesulitan yang disebutkan UBIFS dengan penyimpanan flash dapat relevan dengan bug SSD.