Aman menggunakan kartu SD ketika daya dapat padam setiap saat

10

Kami sedang mengerjakan sistem Linux tertanam kecil (2.6.35-ish) dengan perangkat NAND internal yang kecil untuk OS dan aplikasi (250-500Meg) dan kartu SD dengan kartu SDHC SDHC 8Gb untuk data.

Kekuatan unit dapat terputus kapan saja.

Sistem harus menyimpan data ke kartu SD. Data ini sangat penting ... itu adalah seluruh tujuan sistem. Sistem biasanya sepenuhnya terputus dari jaringan apa pun di lokasi terpencil dan data diambil melalui sneakernet setiap 4-8 minggu.

Saat ini, kami hanya punya VFAT pada kartu SD. Itu terutama sehingga klien uji pertama dapat dengan mudah menyalin data secara manual ke laptop Win7 mereka.

Namun, saya sekarang khawatir bahwa itu hanya masalah waktu sampai pemadaman listrik pada waktu yang salah menyebabkan hilangnya data.

Apa cara terbaik untuk mengkonfigurasi sistem seperti itu untuk mencegah kehilangan data? JFFS2 kedengarannya seperti apa yang saya inginkan dalam hal bagaimana menulis data (dan kebutuhan kinerja tidak tinggi sama sekali), tetapi kedengarannya cukup kludgy untuk menggunakan block2mtd, dll. Saya juga tidak yakin bagaimana leveling kartu yang dipakai akan berinteraksi dengan itu.

Apa cara terbaik untuk melakukan ini?

EDIT

Saya sekarang berpikir untuk meninggalkan filesystem VFAT dan mengalokasikan file berukuran sehari pada suatu waktu, diisi dengan 0xFF, yang seharusnya sangat membatasi paparan terhadap kegagalan siklus daya. Saya kemudian hanya dapat menambahkan catatan dalam blok-blok yang sudah ditentukan sebelumnya, dan mudah-mudahan kartu SD tidak begitu bodoh sehingga mereka menghapus / memakai tingkat penulisan ke wilayah 0xFF.

Saya dapat menggunakan noatime, tetapi adakah yang setara dengan VFAT nomtime untuk mencegah penulisan ke bidang waktu yang dimodifikasi? Saya memerlukan beberapa cara untuk mencegah pembaruan metadata sama sekali sampai file hari baru dibuat.

EDIT 2

Seseorang di pertukaran tumpukan elektronik mengingatkan saya bahwa ada juga data ECC di NAND, jadi tidak ada cara untuk mencegah perlunya menghapus.

Jadi, apakah JFFS2 melalui block2mtd sesuai dalam situasi ini?

EDIT 3

Ini lebih buruk daripada yang saya kira. Kartu SD yang saya miliki akan menghapus blok data bahkan jika Anda menulis konten yang sama persis ke disk. Eraseblocks adalah 64KB, dan itu terlalu besar untuk ditunda menulis. Saya akan menyimpan hingga 128KB data dalam NAND flash (yang dapat saya kendalikan perilaku menulis), dalam semacam jurnal, dan kemudian menulis blok 128KB ke file yang selaras 128KB dalam partisi VFAT pada kartu SD (di kasus kartu SD lainnya memiliki eraseblock 128KB).

darron
sumber
1
"Mudah-mudahan kartu SD tidak sebodoh itu ..." <--- ROFLOL. Tidak mungkin!
derobert
Sampai Anda menemukan solusi lengkap untuk masalah yang Anda miliki, gunakan syncperintah setelah setiap menulis ke kartu SD, itu akan menulis bit segera setelah Anda mengubah / membuat mereka tanpa menyimpannya dalam RAM sehingga perubahan Anda setidaknya berada di kartu dan tidak akan hilang karena kehilangan daya.
Hanan N.
syncmungkin akan membuat masalah menjadi lebih buruk, karena itu meningkatkan sebagian kecil waktu metadata sedang diperbarui.
Ben Voigt

Jawaban:

5

Nah, cara Anda dapat memperbaikinya adalah dengan memperbaiki masalah "daya dapat diputus kapan saja". Apakah tidak mungkin menambah bahkan daya baterai semenit pun?

Atau, mungkin Anda bisa menggunakan dua kartu SD. Tulis data ke satu kartu, sinkronkan, tulis ke yang lain. Setiap blok data Anda akan membutuhkan checksum dan nomor blok, tetapi bahkan dengan beberapa kegagalan daya yang cukup sial, salah satu kartu harus benar.

Masalah dasar Anda adalah pemakaian level pada kartu SD, yang AFAIK tergantung pada vendor kartu (dan mungkin bahkan batch, mereka dapat mengubahnya kapan saja). Mungkin tidak menangani pemadaman listrik dengan benar. Dan tergantung apa fungsinya, itu tidak hanya berarti merusak blok yang Anda tulis.

  1. Asumsikan kartu yang sangat kecil — 3 blok (blitz). Blok 1 telah menerima lebih banyak penulisan daripada 2 atau 3. Saya akan memanggil blok fisik dengan nomor, dan blok logis A, B, C dengan huruf. Saat ini, A = 1, B = 2, C = 3.
  2. Anda mengeluarkan tulisan untuk memblokir A. Kartu SD seperti aha! kita perlu memakai leveling di sini, kalau tidak blok 1 akan aus sebelum 2 dan 3. Memutuskan untuk menukar blok 1 dan 2.
  3. Bunyinya blok 1 ke posisi RAM i (pada kartu SD, bukan RAM sistem). Itu memperbarui bagian yang ingin Anda ubah.
  4. Bunyinya blok 2 ke posisi RAM ii
  5. Menghapus blok 1
  6. Ini menulis posisi RAM ii untuk memblokir 1.
  7. Ini memperbarui tabel pemetaan untuk mengatakan B = 1
  8. Menghapus blok 2.
  9. Itu menulis posisi RAM saya untuk memblokir 2.
  10. Ini memperbarui tabel pemetaan untuk mengatakan A = 2

Tentu saja, "memperbarui tabel pemetaan" tidak selalu sepele. Dan urutan 5-10 bisa berbeda (jika semuanya selesai, tidak masalah, yah, penghapusan harus dilakukan sebelum menulis, tentu saja). Tetapi terjadi kegagalan daya, Anda bisa berakhir dengan tidak hanya A rusak (seperti yang Anda harapkan) tetapi B juga. Atau, jika listrik mati saat pembaruan pemetaan, siapa yang tahu jenis korupsi apa yang akan terjadi.

derobert
sumber
1
Unit-unit ini harus hidup di lingkungan yang relatif keras selama bertahun-tahun dan ketika dipasang mereka akan dikirim ke berbagai negara yang kami lebih suka tidak harus memenuhi syarat baterai. Kami mungkin akan menjatuhkan MMC / SD dan membangun solusi NAND-flash kami sendiri sebelum menggunakan baterai.
darron
Nah, dalam kasus kami, solusi "perbaiki 'daya dapat terputus kapan saja'" bermuara pada "menghentikan pengemudi truk agar tidak tertidur di belakang kemudi dan mengemudi ke perangkat kami." "Sebuah truk menabraknya" sebenarnya adalah mode kegagalan yang paling umum.
SF.
1
Satu menit daya baterai tidak diperlukan. Jumlah daya yang diperlukan untuk melepas kartu SD dengan aman harus berada dalam kisaran yang dapat disimpan oleh kapasitor.
Ben Voigt
4

Sesuatu yang serupa telah dibahas di electronics.stackexchange.com: Bagaimana cara melindungi kartu SD dari kegagalan daya yang tidak terduga?

Jawaban menyamping yang bekerja bersama - sama dengan solusi perangkat lunak adalah untuk melihat perangkat keras (ada pertanyaan tentang ESE tentang ini juga, tapi saya tidak dapat menemukannya sekarang; itu bukan semata-mata tentang kartu SD, hanya tentang perangkat kehilangan daya dan bagaimana mendeteksi ini dan menindaklanjutinya).

Ceritanya adalah: Anda mungkin tidak memiliki daya baterai, tetapi catu daya Anda memiliki beberapa kapasitor yang cukup besar untuk memperlancar pasokan. Pada dasarnya, kekuatan tidak hanya padam. Tegangan berkurang. Mungkin ada IC / sirkuit perlindungan berwarna cokelat yang menegaskan sinyal RESET pada sistem tertanam Anda ketika voltase turun di bawah titik tertentu. Motherboard PC juga memilikinya, dan merespons sinyal 'POWEROK' dari PSU. Artinya, ketika listrik padam, komputer akan secara paksa dihentikan beberapa milidetik sebelum voltase turun di bawah level aman. Selama waktu ini, periferal seperti kartu SD masih menyala, tetapi tidak ada lagi transaksi yang datang dari komputer.

Sangat mungkin bahwa kartu SD memiliki cukup waktu untuk menyelesaikan transaksi yang tertunda termasuk keausan level, sebelum kekuatannya padam. Meningkatkan catu daya Anda dengan kapasitor yang cukup besar atau menggunakannya di dekat kartu SD dapat membantu memastikan hal ini, tetapi Anda selalu dapat bereksperimen dengan platform Anda apa adanya. Sangat mungkin mempertahankan daya untuk waktu yang cukup.

Jika aspek perangkat keras dari masalahnya adalah non-masalah, Anda bisa menyelesaikannya hanya untuk perangkat lunak. ide derobert tentang menggunakan dua kartu untuk redundansi tidak buruk, dan menggunakan sistem file standar seperti VFAT lebih sedikit berisiko untuk membingungkan algoritma levelling pemakaian kartu.

Bagaimanapun, bisa jadi Anda tidak akan memiliki masalah sebanyak itu. Dengan asumsi satu blok pada kartu Anda dapat bertahan 100 menulis (konservatif - tetapi cobalah untuk mendapatkan kartu berkualitas baik!), Dan menggunakan kartu 8GB, Anda akan telah menulis 800GB pada saat blok pertama mati (tentu saja secara statistik berbicara).

Alexios
sumber
Pertanyaan itu dimulai karena saya sudah mendapatkan korupsi kartu SD besar-besaran pada acara mematikan daya. Cukup sering, sebenarnya. Mungkin 1 dari 20 peristiwa kegagalan daya adalah bencana besar, dan mungkin 1 dari 4 setidaknya BEBERAPA kerusakan. Saya akhirnya berubah menjadi menyimpan data sehari dalam NAND flash internal, dan menyalin ke SD pada tengah malam (operasi sekitar 1 detik). Saya mencari untuk meningkatkan hal-hal di masa depan. Saya sudah mendapatkan tutup senilai 400 uF di rel ... tidak cukup, tampaknya ... mungkin brownout tidak ditangani dengan benar.
darron
Itu angka kejadian yang cukup tinggi! Saatnya untuk mendapatkan probe osiloskop dan melihatnya dalam aksi, metode. Meskipun kemungkinan Anda dapat mengatasinya dalam perangkat lunak, cara terbaik dalam hal konsumsi daya adalah untuk memastikan Anda tidak memiliki gangguan perangkat keras. Mungkin Anda bisa melakukan lindung nilai dari taruhan Anda dan bertanya pada electronics.stackexchange.com juga?
Alexios
@ Darron, solusi apa yang Anda dapatkan untuk masalah penyimpanan kartu SD Anda? Apakah Anda masih menulis ke NANDFlash kemudian menyalin sekali sehari? Saya memiliki desain dengan kartu SD sebagai RFS utama (tidak ada NANDFlash terpisah) dan saya melihat masalah data korupsi, baik dengan dan tanpa kondisi mati listrik secara tiba-tiba.
fred basset
4

Kami memiliki masalah dengan SD kami, sistem file root ext2 yang rusak pada daya tak terduga gagal. Pertama-tama, kita membuat sistem berjalan dengan mount root read-only. Karena kami memerlukan beberapa penyimpanan yang dapat ditulisi (tetapi kami bukan pencatatan data), kami menyiapkan partisi kedua sebagai yang dapat ditulisi. Untuk meminimalkan kerusakan FS pada kegagalan daya yang tidak terduga kami membuat ini partisi ext3, meskipun ini akan menyebabkan setidaknya dua kali lebih banyak menulis fisik ke kartu. Kombinasi ini (tapi saya akui penulisan partisi kedua jarang terjadi dibandingkan dengan data logger) tampaknya berjalan tanpa masalah. Sejauh ini. (Sistem diinstal selama sekitar 30 bulan di fasilitas profesional)

Dave Kitchen
sumber
3

Untuk Keamanan Data di lingkungan dengan kemungkinan pemadaman listrik dan keamanan data secara keseluruhan, Anda harus mempertimbangkan lebih banyak poin.

GUNAKAN TANPA sel MLC untuk penyimpanan, hanya SLC yang memiliki waktu penyimpanan data yang memadai. Kemudian kartu-kartu SLC tersebut dapat memiliki firmware pintar, beberapa di antaranya tidak dapat rusak karena kehilangan daya. Mereka mengenali pemadaman listrik dengan mengukur dan memastikan bahwa blok terakhir ditulis dengan lengkap.

Kartu-kartu itu lebih mahal dan sedikit lebih lambat dari sel MLC. Lihat vendor seperti swissbit untuk kartu.

Rotesmofa
sumber