Apakah pengeditan file di Linux langsung disimpan ke disk?

57

Dulu saya berpikir bahwa perubahan file disimpan langsung ke disk, yaitu, segera setelah saya menutup file dan memutuskan untuk mengklik / pilih simpan. Namun, dalam percakapan baru-baru ini, seorang teman saya mengatakan kepada saya bahwa itu biasanya tidak benar; OS (khususnya kami berbicara tentang sistem Linux) menyimpan perubahan dalam memori dan memiliki daemon yang benar-benar menulis konten dari memori ke disk.

Dia bahkan memberi contoh flash drive eksternal: ini dipasang ke sistem (disalin ke memori) dan kadang-kadang kehilangan data terjadi karena daemon belum menyimpan konten ke dalam memori flash; itulah sebabnya kami melepas flash drive.

Saya tidak memiliki pengetahuan tentang fungsi sistem operasi, jadi saya sama sekali tidak tahu apakah ini benar dan dalam keadaan apa. Pertanyaan utama saya adalah: apakah ini terjadi seperti dijelaskan dalam sistem Linux / Unix (dan mungkin OS lainnya)? Misalnya, apakah ini berarti bahwa jika saya mematikan komputer segera setelah saya mengedit dan menyimpan file, kemungkinan besar perubahan saya akan hilang? Mungkin itu tergantung pada jenis disk - hard drive tradisional vs disk solid-state?

Pertanyaannya merujuk secara khusus ke sistem file yang memiliki disk untuk menyimpan informasi, meskipun klarifikasi atau perbandingan diterima dengan baik.

JuanRocamonde
sumber
8
FAO: Tutup pengulas antrean Vote. Ini bukan permintaan untuk materi pembelajaran. Lihat unix.meta.stackexchange.com/q/3892/22812
Anthony G - keadilan untuk Monica
2
Cache tidak jelas bagi pengguna, dalam kasus terbaik Anda harus sync, dan aplikasi harus flushmenjamin cache ditulis kembali, tetapi bahkan sukses synctidak menjamin menulis kembali ke disk fisik hanya bahwa cache kernel disiram ke disk, yang mungkin memiliki latensi di driver atau perangkat keras disk (mis. cache pada drive yang hilang)
crasic
1
Meskipun saya tidak setuju bahwa ini adalah permintaan untuk materi pembelajaran, saya pikir pertanyaannya sedikit luas dalam bentuknya saat ini. Batasi ruang lingkup untuk distribusi Linux (atau OS apa pun yang spesifik) dan mungkin batasi untuk teknologi penyimpanan dan sistem file tertentu.
Jeff Schaller
3
Seperti yang ditunjukkan oleh @AnthonyGeoghegan, saya tidak menganggap pertanyaan ini sebagai permintaan materi pembelajaran. Saya pikir ini agak spesifik; Saya tidak meminta penjelasan yang panjang dan mendalam atau manual tentang sistem file Linux; hanya tentang ide singkat yang ingin saya jelaskan.
JuanRocamonde
3
Memang benar bahwa itu mungkin agak luas, @JeffSchaller; Saya akan mencoba mengeditnya sedikit; namun, jujur ​​jika situs ini bukan untuk pertanyaan jenis ini, yang langsung membahas fungsi Linux, lalu untuk apa?
JuanRocamonde

Jawaban:

70

jika saya mematikan komputer segera setelah saya mengedit dan menyimpan file, perubahan saya kemungkinan besar akan hilang?

Mungkin saja. Saya tidak akan mengatakan "kemungkinan besar", tetapi kemungkinannya tergantung pada banyak hal.


Cara mudah untuk meningkatkan kinerja penulisan file, adalah bagi OS untuk hanya men-cache data, kirim (bohong) aplikasi yang telah ditulis, dan kemudian lakukan penulisan nanti. Ini sangat berguna jika ada aktivitas disk lain yang terjadi pada saat yang sama: OS dapat memprioritaskan membaca dan melakukan penulisan nanti. Itu juga dapat menghapus kebutuhan akan penulisan yang sebenarnya, misalnya, dalam kasus di mana file sementara dihapus dengan cepat sesudahnya.

Masalah caching lebih jelas jika penyimpanan lambat. Menyalin file dari SSD cepat ke stik USB lambat mungkin akan melibatkan banyak caching tulis, karena stik USB tidak dapat mengikutinya. Tetapi cpperintah Anda kembali lebih cepat, sehingga Anda dapat terus bekerja, bahkan mungkin mengedit file yang baru saja disalin.


Tentu saja caching seperti itu memiliki kelemahan yang Anda catat, beberapa data mungkin hilang sebelum sebenarnya disimpan. Pengguna akan jengkel jika editor mereka memberi tahu mereka bahwa penulisan berhasil, tetapi file tersebut tidak benar-benar ada di disk. Itulah sebabnya ada fsync()panggilan sistem , yang seharusnya kembali hanya setelah file benar-benar menabrak disk. Editor Anda dapat menggunakannya untuk memastikan data baik-baik saja sebelum melaporkan kepada pengguna bahwa penulisan berhasil.

Saya berkata, "seharusnya", karena drive itu sendiri mungkin mengatakan kebohongan yang sama ke OS dan mengatakan bahwa penulisan selesai, sementara file benar-benar hanya ada dalam cache tulis yang tidak stabil di dalam drive. Tergantung pada drive, mungkin tidak ada jalan lain.

Selain itu fsync(), ada juga panggilan sistem sync()dan syncfs()yang meminta sistem untuk memastikan semua penulisan seluruh sistem atau semua penulisan pada sistem file tertentu telah mengenai disk. Utilitas syncdapat digunakan untuk memanggil mereka.

Lalu ada juga O_DIRECTflag untukopen() , yang seharusnya "mencoba meminimalkan efek cache I / O ke dan dari file ini." Menghapus caching mengurangi kinerja, sehingga sebagian besar digunakan oleh aplikasi (database) yang melakukan caching sendiri dan ingin mengendalikannya. ( O_DIRECTbukan tanpa masalah, komentar tentang hal itu di halaman manual agak lucu.)


Apa yang terjadi pada power-out juga tergantung pada sistem file. Bukan hanya data file yang harus Anda perhatikan, tetapi metadata sistem file. Memiliki data file pada disk tidak banyak digunakan jika Anda tidak dapat menemukannya. Hanya memperluas file ke ukuran yang lebih besar akan membutuhkan mengalokasikan blok data baru, dan mereka perlu ditandai di suatu tempat.

Bagaimana sistem file menangani perubahan metadata dan urutan antara metadata dan penulisan data sangat bervariasi. Misalnya, dengan ext4, jika Anda mengatur flag mount data=journal, maka semua penulisan - bahkan penulisan data - harus melalui jurnal dan seharusnya lebih aman. Itu juga berarti mereka ditulis dua kali, sehingga kinerjanya turun. Opsi default mencoba untuk memesan penulisan sehingga data ada di disk sebelum metadata diperbarui. Opsi lain atau sistem file lain mungkin lebih baik atau lebih buruk; Saya bahkan tidak akan mencoba studi yang komprehensif.


Dalam praktiknya, pada sistem yang dimuat ringan, file tersebut akan mengenai disk dalam beberapa detik. Jika Anda berurusan dengan penyimpanan yang dapat dilepas, lepaskan sistem file sebelum menarik media untuk memastikan data benar-benar dikirim ke drive, dan tidak ada aktivitas lebih lanjut. (Atau minta lingkungan GUI Anda melakukannya untuk Anda.)

ilkkachu
sumber
some cases whereTautan Anda tampaknya tidak mengatakan tentang kasus seperti itu - melainkan mengatakan bahwa ada masalah ketika aplikasi tidak digunakan fsync. Atau haruskah saya melihat ke komentar untuk menemukan kasus-kasus yang Anda tunjukkan?
Ruslan
1
Anda juga dapat menggunakan syncsecara langsung sebagai perintah shell sistem untuk menyodok kernel untuk mem-flush semua cache.
crasic
3
Dalam praktiknya, pada sistem yang sedikit dimuat, file akan mengenai disk dalam beberapa saat. Hanya jika editor Anda menggunakan fsync()setelah menulis file. Linux default /proc/sys/vm/dirty_writeback_centisecsadalah 500 (5 detik), dan PowerTop merekomendasikan pengaturannya menjadi 1500 (15 detik). ( kernel.org/doc/Documentation/sysctl/vm.txt ). Pada sistem yang sedikit dimuat, kernel hanya akan membiarkannya kotor di cache halaman yang lama write()sebelum membilas ke disk, untuk mengoptimalkan kasus di mana itu dihapus atau diubah lagi segera.
Peter Cordes
2
+1 untuk karena drive itu sendiri mungkin membuat kebohongan yang sama ke OS . Pemahaman saya adalah bahwa drive yang melakukan caching semacam itu juga memiliki kapasitansi daya yang cukup untuk memungkinkan cache mereka disimpan bahkan pada kehilangan daya katastropik. Ini bukan OS khusus; Windows memiliki mekanisme "Lepaskan USB dengan aman" untuk melakukan pembilasan cache sebelum pengguna mencabut kabel.
Studog
1
@studog, saya tidak akan terlalu yakin, terutama pada perangkat keras konsumen. Tapi itu mungkin hanya paranoia. Akan menarik untuk diuji.
ilkkachu
14

Ada cara yang sangat sederhana untuk membuktikan bahwa tidak mungkin benar bahwa pengeditan file selalu langsung disimpan ke disk, yaitu fakta bahwa ada sistem file yang tidak didukung oleh disk sejak awal . Jika filesystem tidak memiliki disk di tempat pertama, maka tidak mungkin menulis perubahan ke disk, pernah .

Beberapa contoh adalah:

  • tmpfs, sistem file yang hanya ada dalam RAM (atau lebih tepatnya, dalam cache buffer)
  • ramfs, sistem file yang hanya ada di RAM
  • sistem file jaringan apa pun (NFS, CIFS / SMB, AFS, AFP, ...)
  • setiap filesystem virtual ( sysfs, procfs, devfs, shmfs, ...)

Tetapi bahkan untuk sistem file yang didukung disk, ini biasanya tidak benar. Halaman Bagaimana Merusak Basis Data SQLite memiliki bab yang disebut Kegagalan untuk menyinkronkan yang menjelaskan berbagai cara penulisan (dalam hal ini berkomitmen untuk basis data SQLite) dapat gagal tiba pada disk. SQLite juga memiliki kertas putih yang menjelaskan banyak rintangan yang harus Anda lewati untuk menjamin Atomic Commit In SQLite . (Perhatikan bahwa Atomic Write jauh lebih sulit daripada sekadar Write , tetapi tentu saja menulis ke disk adalah sub-masalah penulisan atom, dan Anda juga dapat belajar banyak tentang masalah itu, dari makalah ini.) Makalah ini memiliki bagian pada Things That Can Go Wrong yang termasuk ayat tentangIncush Complete Disk Flushes yang memberikan beberapa contoh seluk-beluk halus yang dapat mencegah penulisan dari mencapai disk (seperti pengontrol HDD melaporkan bahwa ia telah menulis ke disk ketika kenyataannya tidak - ya, ada produsen HDD yang melakukan ini, dan bahkan mungkin menurut hukum menurut spesifikasi ATA, karena kata tersebut ambigu dalam hal ini).

Jörg W Mittag
sumber
10
Bagian pertama dari jawaban ini hanyalah besserwissering tentang kata yang tepat digunakan. Saya tidak melihat bagaimana ini melayani tujuan apa pun selain untuk mengolok-olok pengguna. Jelas sistem file jaringan tidak akan menulis ke disk lokal tetapi pertanyaannya masih ada.
pipa
3
Seperti @pipe tunjukkan, fakta bahwa ada filesystem yang tidak menyimpan data ke disk karena mereka tidak menggunakan disk untuk menyimpan data, tidak memutuskan apakah mereka yang memilikinya mungkin atau mungkin tidak menyimpannya secara langsung. Namun, jawabannya terlihat menarik
JuanRocamonde
1
@pipe Saya cukup yakin menggunakan istilah "besserwissering" adalah besserwissering! Mengatakan itu sebagai Besserwisser Jerman dengan otoritas.
Volker Siegel
11

Memang benar bahwa sebagian besar sistem operasi, termasuk Unix, Linux dan Windows menggunakan cache tulis untuk mempercepat operasi. Itu berarti mematikan komputer tanpa mematikannya adalah ide yang buruk dan dapat menyebabkan hilangnya data. Hal yang sama berlaku jika Anda menghapus penyimpanan USB sebelum siap untuk dihapus.

Sebagian besar sistem juga menawarkan opsi untuk membuat penulisan menjadi sinkron. Itu berarti bahwa data akan di disk sebelum aplikasi menerima konfirmasi sukses, dengan biaya lebih lambat.

Singkatnya, ada alasan mengapa Anda harus mematikan komputer dengan benar dan mempersiapkan penyimpanan USB dengan benar untuk dihapus.

RalfFriedl
sumber
Terimakasih atas balasan anda! Apakah ada cara untuk memaksa penulisan disk dari file tertentu di Linux? Mungkin tautan ke tutorial atau halaman dokumen, bahkan pertanyaan SE hanya akan baik-baik saja :)
JuanRocamonde
4
Anda dapat memaksa penulisan file dengan fsync()syscall dari suatu program. Dari shell, cukup gunakan syncperintah.
RalfFriedl
2
Ada (atau setidaknya) beberapa sistem file di beberapa versi Linux, di mana syncdiimplementasikan sebagai no-op. Dan bahkan untuk filesystem yang melakukan implementasi dengan benar sync, masih ada masalah yang diimplementasikan oleh beberapa disk FLUSH CACHEperusahaan sebagai no-op atau segera kembali dari sana dan melakukannya di latar belakang.
Jörg W Mittag
9

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.

sourcejedi
sumber
5

Pada sistem yang dimuat dengan ringan, kernel akan membiarkan data file yang baru ditulis disimpan di cache halaman selama mungkin 30 detik setelah write(), sebelum membilasnya ke disk, untuk mengoptimalkan untuk kasus di mana itu dihapus atau diubah lagi segera.

Standar Linux adalah dirty_expire_centisecs3000 (30 detik) , dan mengontrol berapa lama sebelum data yang baru ditulis "kedaluwarsa". (Lihat https://lwn.net/Articles/322823/ ).

Lihat https://www.kernel.org/doc/Documentation/sysctl/vm.txt untuk lebih banyak merdu terkait, dan google untuk lebih banyak lagi. (mis. google on dirty_writeback_centisecs).

Linux default /proc/sys/vm/dirty_writeback_centisecsadalah 500 (5 detik) , dan PowerTop merekomendasikan untuk mengaturnya 1500 (15 detik) untuk mengurangi konsumsi daya.


Write-back yang tertunda juga memberikan waktu bagi kernel untuk melihat seberapa besar suatu file, sebelum mulai menulisnya ke disk. Filesystem dengan alokasi tertunda (seperti XFS, dan mungkin yang lain hari ini) bahkan tidak memilih di mana pada disk untuk meletakkan data file yang baru ditulis sampai diperlukan, secara terpisah dari mengalokasikan ruang untuk inode itu sendiri. Ini mengurangi fragmentasi dengan membiarkan mereka menghindari menempatkan awal file besar di celah 1 meg antara file lain, misalnya.

Jika banyak data sedang ditulis, maka writeback ke disk dapat dipicu oleh ambang batas untuk berapa banyak data kotor (belum disinkronkan ke disk) dapat di pagecache.

Jika Anda tidak melakukan banyak hal lain, lampu aktivitas hard drive Anda tidak akan menyala selama 5 (atau 15) detik setelah menekan save pada file kecil.


Jika editor Anda digunakan fsync()setelah menulis file, kernel akan menuliskannya ke disk tanpa penundaan. (Dan fsynctidak akan kembali sampai data sebenarnya dikirim ke disk).


Caching tulis di dalam disk juga bisa menjadi suatu hal, tetapi disk biasanya mencoba untuk melakukan cache-tulis ke ASAP penyimpanan permanen, tidak seperti algoritma cache-halaman Linux. Tembolok tulis disk lebih merupakan penyangga toko untuk menyerap semburan kecil penulisan, tetapi mungkin juga untuk menunda penulisan demi membaca, dan memberikan ruang firmware disk untuk mengoptimalkan pola pencarian (mis. Lakukan dua tulisan atau bacaan terdekat daripada melakukan satu , lalu mencari jauh, lalu mencari kembali.)

Pada disk yang berputar (magnetik), Anda mungkin melihat beberapa keterlambatan pencarian masing-masing 7 hingga 10 ms sebelum data dari perintah penulisan SATA benar-benar aman dari daya mati, jika ada yang tertunda membaca / menulis di depan tulisan Anda. (Beberapa jawaban lain pada pertanyaan ini masuk ke lebih detail tentang cache tulis disk dan menulis hambatan yang dapat digunakan FS yang dijurnal untuk menghindari korupsi.)

Peter Cordes
sumber