Sistem file kartu SD anti-korupsi untuk Linux tertanam?

36

Baru-baru ini kami memiliki situasi yang agak tidak menyenangkan dengan pelanggan kami - "kios" berbasis Raspberry Pi yang digunakan untuk menampilkan data penginderaan jauh (tidak lebih mewah daripada browser mode kios yang menampilkan halaman web yang memperbarui sendiri dari server pengumpulan data) gagal melakukan booting karena korupsi sistem file. Ext4, Manual fsck diperlukan, sistem akan menjadi bagian dari presentasi penting besok, layanan diperlukan segera. Tentu saja kami tidak bisa meminta pelanggan untuk mematikan sistem dengan baik ketika mematikannya untuk malam itu; sistem harus dengan mudah menahan perlakuan buruk tersebut.

Saya ingin menghindari situasi seperti itu di masa depan, dan saya ingin memindahkan OS ke sistem file yang akan mencegah hal ini. Ada banyak filesystem yang ditujukan untuk perangkat MTD, di mana menjalankannya pada kartu SD (perangkat blok standar) memerlukan beberapa gangguan serius. Ada juga beberapa sistem file lain (penjurnalan dll) yang memiliki daya tahan yang baik terhadap korupsi. Saya masih perlu melihat beberapa perbandingan yang masuk akal dari pro dan kontra mereka.

Sistem file mana yang tersedia di Linux akan memberikan perlawanan terbaik terhadap korupsi pada kegagalan daya yang tidak terduga dan tidak perlu melompat melewati lingkaran mustahil seperti yaffs2 untuk menginstal ke SD.

Wear-balancing adalah nilai tambah, tetapi bukan keharusan - kartu SD biasanya memiliki mekanisme sendiri, jika kurang sempurna, meskipun sistem harus "lembut untuk flash" (sistem seperti NTFS dapat membunuh kartu SD dalam waktu satu bulan).

SF.
sumber
1
Secara pribadi, saya akan pergi ke arah lain, dan bekerja pada shutdown yang aman pada poweroff, mungkin menggunakan topi untuk memberikan semangat yang cukup untuk menjalankan shutdown.
Scott Seidman
Saya ingin melihat seseorang mendesain modul yang hanya menyediakan daya yang cukup untuk shutdown yang bersih, bersama dengan dukungan sistem yang diperlukan untuk mengindahkan peringatan dan benar-benar ditutup. Sepertinya itu harus menjadi pendamping yang masuk akal untuk Pi, BeagleBone, dan mesin Linux kecil lainnya, tetapi tampaknya tidak ada sebagai produk yang ditandai oleh pengguna mesin tersebut.
RBerteig
@ScottSeidman: Ini RPi, sangat haus kekuasaan - pikirkan 800mA pada 5V selama 15-an. Bukan hal kapasitor kecuali Anda berinvestasi dalam seluruh baterai super.
SF.
@RBerteig: Sebuah kotak dengan baterai yang dapat diisi ulang, peralatan elektronik yang tepat untuk diisi daya, menstabilkan tegangan output (kemungkinan naik dari baterai sendiri), mengirim sinyal shutdown, memotong daya output setelah shutdown selesai, mematikan diri hingga daya input dipulihkan - yakin itu semua bisa dilakukan tetapi jika Anda tidak memproduksinya secara massal, ini akan melipatgandakan biaya RPi (walaupun dalam hal kios itu, pesawat TV 10 kali lebih mahal ...)
SF.
1
@ SF. - Perhatikan bahwa ada dua masalah dengan ketahanan terhadap sistem file powerfail. Yang pertama adalah bahwa FS itu sendiri menjadi kuat, yang kedua adalah bahwa perangkat keras yang mendasarinya tidak berbohong tentang pembilasan data ke disk. Saya tahu bahwa cakram pemintalan telah digunakan untuk berbohong dalam beberapa tahun terakhir untuk meningkatkan kinerjanya yang nyata, Anda harus memastikan bahwa kartu SD Anda tidak melakukan hal yang sama.
Michael Kohne

Jawaban:

17

Perlawanan terbaik terhadap korupsi pada kartu SD tunggal akan ditawarkan oleh BTRFS dalam mode RAID1 dengan scrub otomatis menjalankan setiap periode waktu yang telah ditentukan.

Keuntungan-keuntungan:

  1. mempertahankan kemampuan untuk RW ke sistem file
  2. filesystem modern dengan fitur lengkap dengan opsi yang sangat berguna untuk RPi, seperti kompresi transparan dan snapshot
  3. dirancang dengan memori flash dalam pikiran (antara lain)

Inilah cara melakukannya:

Saya menjalankan RaspberryPi saya di ArchARM linux dan kartu saya ada di pembaca SD, jadi modifikasi instruksi tersebut sesuai untuk distro lain dan / dev interface.

Berikut ini contoh tata letak partisi:

/dev/mmcblk0p1: fat32 boot partition
/dev/mmcblk0p2: to be used as btrfs partition
/dev/mmcblk0p3: to be used as btrfs partition (mirrored with the above)
/dev/mmcblk0p4 (optional): swap

Untuk memasukkan btrf ke RAID1, Anda membuat sistem file seperti ini:

mkfs.btrfs -m raid1 -d raid1 /dev/mmcblk0p2 /dev/mmcblk0p3

Maka Anda rsync -aAXvke sistem Anda yang sebelumnya didukung.

Untuk mendapatkannya dari BTRFS di raid1, Anda perlu memodifikasi initramfs . Oleh karena itu, Anda perlu melakukan yang berikut selagi sistem Anda masih berjalan di sistem file lama Anda.

Raspberry biasanya tidak menggunakan mkinitcpio sehingga Anda harus menginstalnya. Kemudian, Anda perlu menambahkan "btrfs" ke array MODULES di mkinitcpio.conf dan membuat ulang initramfs dengan

mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION

Untuk mengetahui apa yang harus diketik daripada YOUR_KERNEL_VERSION, jalankan

ls /lib/modules

Jika Anda memperbarui kernel, Anda HARUS membuat ulang initramfs SEBELUM Anda reboot.

Kemudian, Anda perlu memodifikasi file boot RPi.

Di cmdline.txt, Anda harus memilikinya

root=/dev/mmcblk0p2 initrd=0x01f00000 rootfstype=btrfs

dan di config.txt, Anda perlu menambahkan

initramfs initrd 0x01f00000

Setelah Anda melakukan semua itu dan berhasil mem-boot ke sistem RAID1 btrfs Anda, satu-satunya yang tersisa adalah mengatur scrub periodik (setiap 3-7 hari) baik dengan timer systemd (lebih disukai), atau cron (dcron) seperti:

btrfs scrub start /

Ini akan berjalan pada sistem file Anda membandingkan checksum dari semua file dan memperbaikinya (mengganti dengan salinan yang benar) jika ditemukan ada korupsi.

Kombinasi BTRFS RAID1, medium tunggal, dan Raspberry Pi menjadikannya hal yang cukup misterius. Butuh beberapa waktu dan usaha untuk menyatukan semua bagian, tetapi ini dia.

Lockheed
sumber
Haruskah saya menambahkan 'scrub' setelah setiap boot-up juga?
SF.
@ SF. Tidak, itu tidak perlu. Gosok berkala setiap X hari sudah cukup. Lebih disukai selama jam penggunaan paling sedikit.
lockheed
Maaf, saya gagal memahami - jika saya menyimpan /bootpartisi yang gemuk , apakah saya masih perlu memodifikasi initramfs?
Bex
Bex, ya. Ini ada hubungannya dengan fitur raid1 dari btrfs, bukan partisi fat / boot.
lockheed
@@@ UPDATE: @@@ Sampai sekarang, seseorang dapat mencoba menggunakan mode-dup alih-alih RAID1: "mkfs.btrfs --data dup --metadata dup" tapi saya tidak 100% yakin itu setangguh RAID1 pada satu drive.
lockheed
10

Penyimpanan flash juga lebih diinginkan daripada penyimpanan magnetik, karena berbagai alasan, tetapi untuk aplikasi ini saya akan mengatakan terutama karena tidak ada bagian yang bergerak. Yang sedang berkata, saya tidak berpikir ada filesystem 'bukti korupsi' di luar sana, tetapi ada beberapa filesystem yang kuat (ext4 menjadi satu) di luar sana, serta beberapa taktik untuk membantu mengurangi korupsi.

RAM Disk

Jika gambar RPi tidak harus berubah, dan kedengarannya tidak, jika tidak ada yang mencoba (atau seharusnya mencoba) menulis ke disk, kemudian coba gunakan sistem file root yang dibuat untuk dibuka ke dalam RAM . Idenya di sini adalah bahwa Anda memiliki sistem file root terkompresi pada saat boot up yang dibongkar ke dalam RAM. Semua perubahan terjadi pada disk RAM, sehingga secara efektif tidak ada tulisan pada Kartu SD, hanya membaca saat boot. ini harus mengurangi membaca / menulis ke drive Anda, melestarikan kehidupan itu. Ini mirip dengan apa yang dilakukan ketika Anda mem-boot linux dari CD , dan merupakan salah satu hal pertama yang terjadi ketika linux boot .

MDMoore313
sumber
10

Saya akan pergi dengan cara lain dan hanya akan menggunakan sistem file read-only. Saya tidak pernah mendapatkan pi raspberry saya cukup stabil saat menggunakan filesystem root baca-tulis pada sdcard. Anda bisa mem-boot root Anda melalui cmdline kernel (ro) atau menggunakan initramfs dengan dukungan kuda termasuk sistem lengkap Anda.

Keduanya dimungkinkan untuk dibuat dengan sistem build buatan saya OpenADK. ( http://www.openadk.org )


sumber
RO filesystem membantu ... tetapi tidak menyelesaikan masalah sepenuhnya.
Piskvor
7

Nah, masalah yang Anda alami di sini adalah bahwa menggunakan sistem file "modern" seperti ext * kemungkinan akan membuat Kartu SD Anda rusak; dari pengalaman saya yang terjadi dalam setahun, atau tahun depan jika Anda mengambil akhir yang lebih tinggi.

Masalahnya adalah bahwa sistem file modern selalu bergerak blok untuk mencegah fragmentasi data. Yang merupakan hal yang baik pada disk berputar, di mana Anda ingin semua data Anda dikumpulkan ketika memuatnya ke cache. The downside adalah bahwa ia melakukan lebih banyak menulis yang tidak bisa di-cache karena merapikan sedang ditangani ketika tidak banyak I / O terjadi.

Ini juga terjadi ketika Anda menangani banyak pencatatan, yang mungkin ingin Anda lakukan saat men-debug perangkat yang disematkan. Penulisan logging adalah jenis penulisan terburuk, karena banyak penulisan kecil yang terjadi secara teratur, yang menghasilkan banyak fragmentasi.

Seperti yang Anda katakan sistem Anda juga menangani data sensor, sangat mungkin Anda menyimpannya di flash saat datang. Dan mereka seburuk data log.

Saya mengalami masalah yang sama dengan yang Anda temui, dan inilah kesimpulan saya. Saya mencoba mencari Kartu SD yang akan dijual sebagai "lebih kuat", yaitu mampu menangani lebih banyak menulis daripada yang lain, tetapi saya tidak menemukan patokan di pasar yang berfokus pada itu, tidak seperti tolok ukur pada SSD. Karena mereka semua fokus hanya pada kecepatan, tidak mungkin untuk mengetahui jumlah penulisan per blok memori, dan teknologi yang digunakan dalam SDCard.

Padahal, saya perhatikan bahwa sandisk kelas "industri" memiliki umur yang lebih panjang tanpa nama. Yang tidak mengejutkan, ketika Anda membayar lebih, Anda mendapatkan lebih banyak.

Tetapi pada akhirnya, dengan penebangan intensif diaktifkan, saya tidak menemukan Kartu SD memiliki umur lebih dari beberapa tahun, satu tahun di mana kematian terbanyak terjadi.

Solusi yang saya temukan adalah solusi @ BigHomie's dan @wbx ': gunakan sistem file extX Read Only (karena penjurnalan tidak lagi diperlukan, Anda bahkan dapat mundur ke ext2 lama yang baik). Dan jika Anda ingin menyimpan log di dalam sesi atau menulis file sementara, Anda selalu dapat menggunakan RAMDISK.

Hanya ada tutorial dan skrip yang membantu mengisi ramdisk dengan data dari dalam bagian hanya baca sehingga Anda dapat mengeditnya untuk sesi ini.

NB: pengalaman saya menggunakan Angstrom Linux di Beaglebone, di antara uji coba 20 perangkat sensor. Pencatatan sistem itu sangat verbose, menggunakan sistem jurnal systemd.

zmo
sumber
4

Linux menawarkan banyak sistem file. ext4 adalah yang paling saya percayai. Ketika ragu, ext4 harus digunakan untuk partisi yang akan di-mount baca-tulis.

Sistem file ext2 jauh lebih rapuh. Ini adalah sistem file yang sangat baik untuk sistem yang dapat me-mount-nya hanya baca, atau unmount dengan benar. Tetapi korupsi sangat mungkin terjadi dengan kegagalan daya pada ext2 .

Pilihan lain dapat mempertimbangkan jfs walaupun filesystem jfs tidak dapat diandalkan di beberapa versi Linux. Korupsi lebih kecil kemungkinannya dengan jfs dibandingkan dengan ext4 . Jfs juga memiliki waktu pemasangan cepat dan waktu pemeriksaan sistem file.


sumber
2
Ya, ext4 sangat bagus dan saya menggunakannya untuk sebagian besar server saya. TAPI pertanyaan ini adalah tentang sistem file untuk sistem root pada kartu sd . Ini adalah lingkungan yang berbeda. Apakah saran Anda bersifat umum, atau apakah Anda benar-benar menyarankan untuk menggunakan kartu ext4?
guettli