Apakah filesystem pasca-tiba-tiba-hilang rusak pada partisi ext3 drive SSD "perilaku yang diharapkan"?

13

Perusahaan saya membuat perangkat Debian Linux tertanam yang melakukan booting dari partisi ext3 pada drive SSD internal. Karena perangkat ini merupakan "kotak hitam" tertanam, biasanya dimatikan dengan cara kasar, dengan hanya memotong daya ke perangkat melalui saklar eksternal.

Ini biasanya baik-baik saja, karena penjurnalan ext3 membuat hal-hal dalam urutan, jadi selain sesekali kehilangan bagian dari file log, hal-hal tetap baik-baik saja.

Namun, kami baru-baru ini melihat sejumlah unit di mana setelah beberapa siklus hard-power partisi ext3 mulai mengembangkan masalah struktural - khususnya, kami menjalankan e2fsck pada partisi ext3 dan ia menemukan sejumlah masalah seperti itu ditunjukkan dalam daftar keluaran di bagian bawah Pertanyaan ini. Menjalankan e2fsck hingga berhenti melaporkan kesalahan (atau memformat ulang partisi) menyelesaikan masalah.

Pertanyaan saya adalah ... apa implikasi dari melihat masalah seperti ini pada sistem ext3 / SSD yang telah mengalami banyak shutdown mendadak / tidak terduga?

Perasaan saya adalah bahwa ini mungkin merupakan tanda masalah perangkat lunak atau perangkat keras di sistem kami, karena pemahaman saya adalah bahwa (kecuali masalah bug atau perangkat keras) fitur penjurnalan ext3 seharusnya mencegah kesalahan integritas sistem file semacam ini. (Catatan: Saya mengerti bahwa data pengguna tidak dijurnal dan sehingga file pengguna munged / hilang / terpotong dapat terjadi; Saya secara khusus berbicara di sini tentang kesalahan filesystem-metadata seperti yang ditunjukkan di bawah ini)

Rekan kerja saya, di sisi lain, mengatakan bahwa ini dikenal / perilaku yang diharapkan karena pengontrol SSD kadang-kadang memesan ulang perintah tulis dan yang dapat menyebabkan jurnal ext3 menjadi bingung. Secara khusus, ia percaya bahwa meskipun diberikan perangkat keras yang berfungsi normal dan perangkat lunak bebas bug, jurnal ext3 hanya membuat korupsi sistem file lebih kecil, bukan tidak mungkin, jadi kita tidak perlu terkejut melihat masalah seperti ini dari waktu ke waktu.

Siapakah di antara kita yang benar?

Embedded-PC-failsafe:~# ls
Embedded-PC-failsafe:~# umount /mnt/unionfs
Embedded-PC-failsafe:~# e2fsck /dev/sda3
e2fsck 1.41.3 (12-Oct-2008)
embeddedrootwrite contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Invalid inode number for '.' in directory inode 46948.
Fix<y>? yes

Directory inode 46948, block 0, offset 12: directory corrupted
Salvage<y>? yes

Entry 'status_2012-11-26_14h13m41.csv' in /var/log/status_logs (46956) has deleted/unused inode 47075.  Clear<y>? yes
Entry 'status_2012-11-26_10h42m58.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47076.  Clear<y>? yes
Entry 'status_2012-11-26_11h29m41.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47080.  Clear<y>? yes
Entry 'status_2012-11-26_11h42m13.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47081.  Clear<y>? yes
Entry 'status_2012-11-26_12h07m17.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47083.  Clear<y>? yes
Entry 'status_2012-11-26_12h14m53.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47085.  Clear<y>? yes
Entry 'status_2012-11-26_15h06m49.csv' in /var/log/status_logs (46956) has deleted/unused inode 47088.  Clear<y>? yes
Entry 'status_2012-11-20_14h50m09.csv' in /var/log/status_logs (46956) has deleted/unused inode 47073.  Clear<y>? yes
Entry 'status_2012-11-20_14h55m32.csv' in /var/log/status_logs (46956) has deleted/unused inode 47074.  Clear<y>? yes
Entry 'status_2012-11-26_11h04m36.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47078.  Clear<y>? yes
Entry 'status_2012-11-26_11h54m45.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47082.  Clear<y>? yes
Entry 'status_2012-11-26_12h12m20.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47084.  Clear<y>? yes
Entry 'status_2012-11-26_12h33m52.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47086.  Clear<y>? yes
Entry 'status_2012-11-26_10h51m59.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47077.  Clear<y>? yes
Entry 'status_2012-11-26_11h17m09.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47079.  Clear<y>? yes
Entry 'status_2012-11-26_12h54m11.csv.gz' in /var/log/status_logs (46956) has deleted/unused inode 47087.  Clear<y>? yes

Pass 3: Checking directory connectivity
'..' in /etc/network/run (46948) is <The NULL inode> (0), should be /etc/network (46953).
Fix<y>? yes

Couldn't fix parent of inode 46948: Couldn't find parent directory entry

Pass 4: Checking reference counts
Unattached inode 46945
Connect to /lost+found<y>? yes

Inode 46945 ref count is 2, should be 1.  Fix<y>? yes
Inode 46953 ref count is 5, should be 4.  Fix<y>? yes

Pass 5: Checking group summary information
Block bitmap differences:  -(208264--208266) -(210062--210068) -(211343--211491) -(213241--213250) -(213344--213393) -213397 -(213457--213463) -(213516--213521) -(213628--213655) -(213683--213688) -(213709--213728) -(215265--215300) -(215346--215365) -(221541--221551) -(221696--221704) -227517
Fix<y>? yes

Free blocks count wrong for group #6 (17247, counted=17611).
Fix<y>? yes

Free blocks count wrong (161691, counted=162055).
Fix<y>? yes

Inode bitmap differences:  +(47089--47090) +47093 +47095 +(47097--47099) +(47101--47104) -(47219--47220) -47222 -47224 -47228 -47231 -(47347--47348) -47350 -47352 -47356 -47359 -(47457--47488) -47985 -47996 -(47999--48000) -48017 -(48027--48028) -(48030--48032) -48049 -(48059--48060) -(48062--48064) -48081 -(48091--48092) -(48094--48096)
Fix<y>? yes

Free inodes count wrong for group #6 (7608, counted=7624).
Fix<y>? yes

Free inodes count wrong (61919, counted=61935).
Fix<y>? yes


embeddedrootwrite: ***** FILE SYSTEM WAS MODIFIED *****

embeddedrootwrite: ********** WARNING: Filesystem still has errors **********

embeddedrootwrite: 657/62592 files (24.4% non-contiguous), 87882/249937 blocks

Embedded-PC-failsafe:~# 
Embedded-PC-failsafe:~# e2fsck /dev/sda3
e2fsck 1.41.3 (12-Oct-2008)
embeddedrootwrite contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Directory entry for '.' in ... (46948) is big.
Split<y>? yes

Missing '..' in directory inode 46948.
Fix<y>? yes

Setting filetype for entry '..' in ... (46948) to 2.
Pass 3: Checking directory connectivity
'..' in /etc/network/run (46948) is <The NULL inode> (0), should be /etc/network (46953).
Fix<y>? yes

Pass 4: Checking reference counts
Inode 2 ref count is 12, should be 13.  Fix<y>? yes

Pass 5: Checking group summary information

embeddedrootwrite: ***** FILE SYSTEM WAS MODIFIED *****
embeddedrootwrite: 657/62592 files (24.4% non-contiguous), 87882/249937 blocks
Embedded-PC-failsafe:~# 
Embedded-PC-failsafe:~# e2fsck /dev/sda3
e2fsck 1.41.3 (12-Oct-2008)
embeddedrootwrite: clean, 657/62592 files, 87882/249937 blocks
Jeremy Friesner
sumber
Apakah Anda semua berpikir untuk mengubah ke ext4 atau ZFS?
mdpc
Saya sudah berpikir tentang mengubah ke ext4, setidaknya ... akankah itu membantu mengatasi masalah ini? Apakah ZFS akan lebih baik?
Jeremy Friesner
1
Tidak ada opsi yang akan memperbaiki ini. Kami masih menggunakan perangkat dengan superkapasitor di ZFS, dan baterai atau cache yang dilindungi flash disarankan untuk ext4 di aplikasi server.
ewwhite

Jawaban:

11

Anda berdua salah (mungkin?) ... ext3 mengatasi yang terbaik dengan menghapus penyimpanan mendasarnya secara tiba-tiba.

SSD Anda mungkin memiliki beberapa jenis cache terpasang. Anda tidak menyebutkan merek / model SSD yang digunakan, tetapi ini terdengar seperti SSD tingkat konsumen versus model perusahaan atau kelas industri .

Either way, cache digunakan untuk membantu menyatukan penulisan dan memperpanjang umur drive. Jika ada menulis dalam perjalanan, kehilangan kekuasaan secara tiba-tiba jelas merupakan sumber korupsi Anda. SSD perusahaan dan industri yang sebenarnya memiliki supercapacitors yang mempertahankan daya cukup lama untuk memindahkan data dari cache ke penyimpanan yang tidak mudah menguap, banyak cara yang sama dengan cache cache yang didukung oleh baterai dan pengontrol RAID yang didukung oleh flash .

Jika drive Anda tidak memiliki supercap, transaksi dalam penerbangan hilang, maka sistem file rusak. ext3 mungkin diberitahu bahwa semuanya ada di penyimpanan stabil, tapi itu hanya fungsi dari cache.

putih
sumber
Maaf untuk Anda dan semua orang yang mengunggah ini, tetapi Anda salah. Menangani hilangnya penulisan yang sedang berjalan adalah untuk apa jurnal itu dibuat, dan selama drive tersebut melaporkan dengan benar apakah ia memiliki cache tulis dan mematuhi perintah untuk membilasnya, jurnal itu menjamin bahwa metadata tidak akan tidak konsisten. Anda hanya perlu supercap atau cache raid yang didukung baterai sehingga Anda dapat mengaktifkan cache tulis tanpa harus mengaktifkan penghalang, yang mengorbankan beberapa kinerja untuk menjaga kebenaran data.
psusi
@psusi SSD yang digunakan mungkin memiliki cache yang diaktifkan secara eksplisit atau bergantung pada buffer internal terlepas dari pengaturan OS_level. Data dalam cache itu adalah apa yang akan dilindungi oleh SSD berkemampuan super .
ewwhite
Data dalam cache tidak perlu dilindungi jika Anda mengaktifkan penghalang IO. Sebagian besar drive tipe konsumen dikirimkan dengan caching penulisan dinonaktifkan secara default dan Anda harus mengaktifkannya jika Anda menginginkannya, tepatnya karena menyebabkan masalah korupsi jika OS tidak berhati-hati.
psusi
2
@ pusi Tua sekarang, tetapi Anda menyebutkan ini: as long as the drive correctly reports whether it has a write cache and obeys commands to flush it, the journal guarantees that the metadata will not be inconsistent.Itulah masalahnya: karena pengontrol penyimpanan yang cenderung mengasumsikan disk lama, SSD kadang-kadang berbohong tentang apakah data memerah. Anda perlu supercap itu.
Joel Coel
2

Anda benar dan rekan kerja Anda salah. Kecuali ada yang tidak beres, jurnal memastikan Anda tidak pernah memiliki metadata fs yang tidak konsisten. Anda mungkin memeriksa hdparmuntuk melihat apakah cache tulis drive diaktifkan. Jika ya, dan Anda belum mengaktifkan penghalang IO (dinonaktifkan secara default pada ext3, aktif secara default di ext4), maka itu akan menjadi penyebab masalah.

Rintangan diperlukan untuk memaksa cache tulis drive memerah pada waktu yang tepat untuk mempertahankan konsistensi, tetapi beberapa drive berperilaku buruk dan melaporkan bahwa cache tulisnya dinonaktifkan ketika tidak, atau mengabaikan perintah flush dalam diam. Ini mencegah jurnal melakukan tugasnya.

psusi
sumber
-1 untuk membaca-pemahaman ...
ewwhite
@ewwhite, mungkin Anda harus mencoba membaca, dan benar-benar menulis tanggapan yang bermanfaat alih-alih penghinaan yang kekanak-kanakan ini.
psusi
Memberi +1 jawaban ini mungkin dapat ditingkatkan, seperti jawaban lainnya dalam QA apa pun. Tetapi setidaknya memberikan beberapa cahaya dan petunjuk. @ downvoters: perbaiki jawaban Anda sendiri, atau komentari kemungkinan aliran, tetapi membatalkan jawaban ini tanpa justifikasi yang tepat hanya menjijikkan!
Alberto