ใช้การ์ด SD อย่างปลอดภัยเมื่อไฟฟ้าดับเมื่อใดก็ได้


10

เรากำลังทำงานบนระบบลินุกซ์ขนาดเล็กที่ฝังตัว (2.6.35-ish) กับอุปกรณ์ NAND ภายในขนาดเล็กสำหรับระบบปฏิบัติการและแอปพลิเคชัน (250-500Meg) และการ์ด SD ที่มีการ์ด SDHC SDHC ขนาด 8Gb สำหรับข้อมูล

สามารถตัดไฟของยูนิตได้ตลอดเวลา

ระบบจะต้องจัดเก็บข้อมูลลงในการ์ด SD ข้อมูลนี้สำคัญมาก ... เป็นจุดประสงค์ทั้งหมดของระบบ ระบบมักจะถูกตัดการเชื่อมต่อจากเครือข่ายใด ๆ ในสถานที่ห่างไกลและข้อมูลจะถูกดึงผ่าน sneakernet ทุก 4-8 สัปดาห์

ปัจจุบันเราเพิ่งได้รับ VFAT บนการ์ด SD นั่นเป็นหลักเพื่อให้ลูกค้าทดสอบครั้งแรกสามารถคัดลอกข้อมูลออกได้อย่างง่ายดายด้วยตนเองบนแล็ปท็อป Win7 ของพวกเขา

อย่างไรก็ตามตอนนี้ฉันกังวลว่าเป็นเรื่องของเวลาจนกว่าไฟฟ้าดับในเวลาที่ผิดทำให้ข้อมูลสูญหาย

วิธีที่ดีที่สุดในการกำหนดค่าระบบดังกล่าวเพื่อป้องกันข้อมูลสูญหายคืออะไร JFFS2 ดูเหมือนสิ่งที่ฉันต้องการในแง่ของวิธีการเขียนข้อมูล (และความต้องการด้านประสิทธิภาพไม่สูงเลย) แต่มันฟังดูค่อนข้างคึกคักที่จะใช้ block2mtd ฯลฯ ฉันยังไม่แน่ใจว่าการปรับระดับการสึกหรอของการ์ดจะมีปฏิกิริยาอย่างไร กับมัน

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

แก้ไข

ตอนนี้ฉันกำลังคิดที่จะออกจากระบบไฟล์ VFAT และจัดสรรไฟล์ขนาดวันต่อครั้งที่เต็มไปด้วย 0xFF ซึ่งควรจำกัดความเสี่ยงต่อความล้มเหลวของวงจรไฟฟ้าเป็นอย่างมาก จากนั้นฉันก็สามารถผนวกระเบียนภายในบล็อกที่ถูกสร้างล่วงหน้าเท่านั้นและหวังว่าการ์ด SD จะไม่ได้โง่อย่างที่พวกเขาต้องการลบ / สวมระดับการเขียนไปยังภูมิภาค 0xFF

ฉันสามารถใช้เวลากลางคืน แต่มี VFAT Nomtime ที่เทียบเท่าเพื่อป้องกันการเขียนลงในเขตเวลาที่ปรับเปลี่ยนหรือไม่? ฉันต้องการวิธีป้องกันการปรับปรุงข้อมูลเมตาเลยจนกว่าจะมีการสร้างไฟล์วันใหม่

แก้ไข 2

มีคนในการแลกเปลี่ยนสแต็คทางอิเล็กทรอนิกส์เตือนฉันว่ายังมีข้อมูล ECC ใน NAND ดังนั้นจึงไม่มีวิธีใดที่จะป้องกันความจำเป็นในการลบ

ดังนั้น JFFS2 ผ่าน block2mtd จะเหมาะสมในสถานการณ์นี้หรือไม่?

แก้ไข 3

มันแย่กว่าที่ฉันคิด การ์ด SD ที่ฉันมีจะลบบล็อคข้อมูลแม้ว่าคุณจะเขียนเนื้อหาเดียวกันลงในดิสก์ บล็อกการลบคือ 64KB และใหญ่เกินไปที่จะเขียนล่าช้า ฉันจะเก็บข้อมูลได้มากถึง 128KB ในแฟลช NAND (ซึ่งฉันสามารถควบคุมพฤติกรรมการเขียนของ) ในรูปแบบของวารสารแล้วเขียนบล็อก 128KB ไปยังไฟล์ที่จัดแนว 128KB ในพาร์ติชัน VFAT บนการ์ด SD (ใน กรณีการ์ด SD อื่น ๆ มีการลบบล็อก 128KB)


1
"หวังว่าการ์ด SD จะไม่งี่เง่า ... " <--- ROFLOL ไม่น่าจะ!
Derobert

จนกว่าคุณจะพบทางออกที่สมบูรณ์สำหรับปัญหาที่คุณมีให้ใช้syncคำสั่งหลังจากเขียนไปยังการ์ด SD แต่ละครั้งมันจะเขียนบิตต่าง ๆ หลังจากที่คุณเปลี่ยน / สร้างโดยไม่เก็บไว้ใน RAM เพื่อให้การเปลี่ยนแปลงของคุณอยู่ในการ์ด และจะไม่หายไปจากการสูญเสียพลังงาน
Hanan N.

syncอาจทำให้เรื่องแย่ลงเนื่องจากมันจะเพิ่มเวลาของข้อมูลเมตาที่กำลังอัปเดตในช่วงกลาง
Ben Voigt

คำตอบ:


5

ด้วยวิธีที่คุณสามารถแก้ไขปัญหานี้ได้คือการแก้ไขปัญหา "พลังงานที่สามารถตัดได้ตลอดเวลา" เป็นไปไม่ได้ที่จะเพิ่มพลังงานแบตเตอรี่แม้แต่นาทีเดียว?

หรือคุณอาจใช้การ์ด SD สองแผ่นก็ได้ เขียนข้อมูลไปยังการ์ดเดียวซิงค์เขียนไปยังการ์ดอื่น แต่ละบล็อคของข้อมูลของคุณจะต้องมีการตรวจสอบและหมายเลขบล็อก แต่ถึงแม้จะมีความล้มเหลวของพลังงานที่น่าเสียดาย แต่การ์ดหนึ่งการ์ดควรถูกต้อง

ปัญหาพื้นฐานของคุณกำลังจะถูกปรับระดับบนการ์ด SD ซึ่ง AFAIK ขึ้นอยู่กับผู้ขายการ์ด (และอาจเป็นแบทช์ก็สามารถเปลี่ยนได้ทุกเวลา) มันอาจไม่จัดการกับไฟฟ้าดับอย่างถูกต้อง ขึ้นอยู่กับว่ามันทำอะไรนั่นอาจไม่ได้หมายถึงการทำลายบล็อกที่คุณกำลังเขียน

  1. สมมติว่าการ์ดขนาดเล็กมีขนาดเล็ก - บล็อก 3 (แฟลช) บล็อก 1 ได้รับการเขียนมากกว่า 2 หรือ 3 ฉันจะเรียกบล็อกทางกายภาพตามหมายเลขและบล็อกตรรกะ A, B, C ด้วยตัวอักษร ตอนนี้ A = 1, B = 2, C = 3
  2. คุณออกเขียนเพื่อบล็อก A การ์ด SD เป็นเหมือนอ่า! เราจำเป็นต้องสวมเลเวลที่นี่มิฉะนั้นบล็อค 1 จะเสื่อมสภาพก่อน 2 และ 3 ตัดสินใจที่จะสลับบล็อก 1 และ 2
  3. มันอ่านบล็อก 1 ในตำแหน่ง RAM i (บนการ์ด SD ไม่ใช่ RAM ระบบ) อัพเดตส่วนที่คุณต้องการเปลี่ยน
  4. มันอ่านบล็อก 2 ในตำแหน่ง RAM ii
  5. มันจะลบบล็อก 1
  6. มันเขียนตำแหน่ง RAM ii เพื่อบล็อก 1
  7. มันปรับปรุงตารางการทำแผนที่เป็น B = 1
  8. มันจะลบบล็อก 2
  9. มันเขียนตำแหน่งแรม i ถึงบล็อก 2
  10. มันปรับปรุงตารางการทำแผนที่เป็น A = 2

แน่นอนว่า "อัปเดตตารางการแมป" ไม่ใช่เรื่องเล็กน้อยเสมอไป และลำดับของ 5-10 อาจจะแตกต่างกัน (ถ้าพวกเขาทั้งหมดเสร็จสมบูรณ์มันไม่สำคัญว่าการลบจะต้องมาก่อนที่จะเขียนแน่นอน) แต่ความล้มเหลวของพลังงานเกิดขึ้นคุณสามารถไขลานไม่เพียง แต่เกิดความเสียหาย (ตามที่คุณคาดหวัง) แต่ B หรือหากไฟฟ้าขัดข้องเกิดขึ้นระหว่างการอัพเดตการแมปใครจะรู้ว่าเกิดความเสียหายประเภทใด


1
หน่วยเหล่านี้จะต้องอยู่ในสภาพแวดล้อมที่ค่อนข้างลำบากเป็นเวลาหลายปีและเมื่อติดตั้งแล้วหน่วยเหล่านี้จะถูกส่งไปยังประเทศต่างๆที่เราไม่ต้องการให้มีคุณสมบัติสำหรับแบตเตอรี่ เราอาจจะทิ้ง MMC / SD และสร้างโซลูชัน NAND-flash ของเราเองก่อนที่จะใช้แบตเตอรี่
darron

ในกรณีของเรา "แก้ปัญหา" พลังที่สามารถตัดได้ตลอดเวลา "" แก้ปัญหาเดือดลงไปที่ "หยุดคนขับรถบรรทุกไม่ให้หลับไปหลังพวงมาลัยและขับเข้าไปในอุปกรณ์ของเรา" "รถบรรทุกชนเข้า" เป็นเรื่องเกี่ยวกับโหมดความล้มเหลวที่พบบ่อยที่สุด
เอสเอฟ

1
ไม่จำเป็นต้องใช้พลังงานแบตเตอรี่สักครู่ ปริมาณพลังงานที่ต้องใช้ในการเลิกเมานท์การ์ด SD อย่างปลอดภัยควรอยู่ในช่วงที่ตัวเก็บประจุสามารถเก็บได้
Ben Voigt

4

มีการพูดถึงสิ่งที่คล้ายกันใน electronics.stackexchange.com: ฉันจะป้องกันการ์ด SD จากพลังงานที่ไม่คาดคิดได้อย่างไร

คำตอบด้านข้างที่ทำงานควบคู่กับโซลูชันซอฟต์แวร์คือการดูฮาร์ดแวร์ (มีคำถามเกี่ยวกับ ESE เกี่ยวกับเรื่องนี้เช่นกัน แต่ฉันไม่สามารถหาได้ตอนนี้มันไม่ได้เกี่ยวกับการ์ด SD เพียงอย่างเดียวเกี่ยวกับอุปกรณ์ที่สูญเสียพลังงาน และวิธีการตรวจสอบสิ่งนี้และดำเนินการกับมัน)

เรื่องสั้นคือคุณอาจไม่มีพลังงานแบตเตอรี่ แต่แหล่งจ่ายไฟของคุณมีตัวเก็บประจุขนาดใหญ่ที่สวยพอที่จะจ่ายพลังงานให้ราบรื่น โดยพื้นฐานแล้วพลังไม่เพียง แต่ออกไป แรงดันลดลง อาจมีการป้องกัน IC / วงจรสีน้ำตาลออกซึ่งยืนยันสัญญาณ RESET ในระบบฝังตัวของคุณเมื่อแรงดันไฟฟ้าลดลงต่ำกว่าจุดที่กำหนด มาเธอร์บอร์ดพีซีก็มีเช่นกันและพวกเขาก็ตอบสนองต่อสัญญาณ 'POWEROK' จาก PSU สิ่งนี้หมายความว่าเมื่อไฟฟ้าดับคอมพิวเตอร์จะหยุดอย่างแรงสักสองสามมิลลิวินาทีก่อนที่แรงดันไฟฟ้าจะลดลงต่ำกว่าระดับที่ปลอดภัย ในช่วงเวลานี้อุปกรณ์ต่อพ่วงเช่นการ์ด SD ยังคงเปิดใช้งานอยู่ แต่ไม่มีการทำธุรกรรมเพิ่มเติมจากคอมพิวเตอร์

เป็นไปได้มากว่าการ์ด SD มีเวลาเพียงพอในการทำธุรกรรมที่ค้างอยู่รวมถึงการปรับระดับการสึกหรอก่อนที่พลังงานจะหมด การปรับปรุงแหล่งจ่ายไฟของคุณด้วยตัวเก็บประจุที่มีขนาดใหญ่พอหรือใช้หนึ่งตัวใกล้กับการ์ด SD อาจช่วยให้มั่นใจได้ แต่คุณสามารถทดลองใช้แพลตฟอร์มของคุณได้ตามปกติ มีโอกาสมากที่จะรักษาพลังงานไว้สำหรับเวลาที่เพียงพอ

หากปัญหาด้านฮาร์ดแวร์ของปัญหาไม่ใช่ปัญหาคุณสามารถแก้ไขปัญหาเฉพาะซอฟต์แวร์ได้ ความยุ่งยากของการใช้การ์ดสองใบสำหรับความซ้ำซ้อนไม่เลวและการใช้ระบบไฟล์มาตรฐานเช่น VFAT นั้นมีความเสี่ยงน้อยกว่าที่จะทำให้อัลกอริธึมการปรับระดับการสึกหรอของการ์ดสับสน

อย่างไรก็ตามมันอาจเป็นไปได้ว่าคุณจะไม่มีปัญหามากมาย สมมติว่าบล็อกบนการ์ดของคุณสามารถอยู่รอดได้ 100 เขียน (อนุรักษ์นิยม - แต่พยายามรับการ์ดคุณภาพดี!) และการใช้การ์ด 8GB คุณจะได้เขียน 800GB เมื่อบล็อกแรกตาย (แน่นอนทางสถิติ)


คำถามเริ่มต้นขึ้นเพราะฉันได้รับความเสียหาย SD การ์ดขนาดใหญ่แล้วในการปิดไฟเหตุการณ์ ค่อนข้างบ่อยจริง ๆ บางทีเหตุการณ์ความล้มเหลวทางไฟ 1 ใน 20 เหตุการณ์นั้นเป็นหายนะและอาจเป็นไปได้ว่า 1 ใน 4 ได้รับความเสียหายอย่างน้อย ในที่สุดฉันก็เปลี่ยนเป็นการจัดเก็บข้อมูลมูลค่าหนึ่งวันในแฟลช NAND ภายในและคัดลอกไปยัง SD ในเวลาเที่ยงคืน (การดำเนินการ 1 วินาทีหรือมากกว่านั้น) ฉันต้องการปรับปรุงสิ่งต่าง ๆ ในอนาคต ฉันได้รับหมวกมูลค่า 400 ยูเอฟบนรางรถไฟแล้ว ... ไม่พอเห็นได้ชัด ... บางทีอาจจะไม่ได้รับการจัดการที่เหมาะสม
darron

นั่นเป็นอัตราการเกิดที่ค่อนข้างสูง! ถึงเวลาที่จะได้รับโพรบออสซิลโลสโคปแล้วดูสิ่งนี้ในทางปฏิบัติ methinks แม้ว่าจะเป็นไปได้ว่าคุณสามารถแก้ไขได้ด้วยซอฟต์แวร์วิธีที่ดีที่สุดในแง่ของการใช้พลังงานคือการทำให้แน่ใจว่าคุณไม่มีปัญหาฮาร์ดแวร์ บางทีคุณอาจป้องกันความเสี่ยงการเดิมพันของคุณและถามในelectronics.stackexchange.comเช่นกัน?
Alexios

@darron คุณมีวิธีแก้ปัญหาอะไรบ้างสำหรับปัญหาการเก็บข้อมูลใน SD card ของคุณ? คุณยังเขียนถึง NANDFlash จากนั้นคัดลอกวันละครั้งหรือไม่? ฉันมีการออกแบบด้วยการ์ด SD เป็น RFS หลัก (ไม่แยก NANDFlash) และฉันเห็นปัญหาข้อมูลเสียหายทั้งที่มีและไม่มีเงื่อนไขไฟฟ้าขัดข้องกะทันหัน
fred basset

4

เรามีปัญหากับ SD, ระบบไฟล์รูท ext2 ของเราซึ่งเสียหายจากการใช้พลังงานที่ไม่คาดคิด ก่อนอื่นเราทำให้ระบบทำงานด้วยรูทเมาท์แบบอ่านอย่างเดียว เนื่องจากเราต้องการที่เก็บข้อมูลแบบเขียนได้ (แต่เราไม่ใช่การบันทึกข้อมูล) เราจึงตั้งค่าพาร์ติชันที่สองเป็นแบบเขียนได้ เพื่อลดความเสียหายของ FS ที่เกิดขึ้นกับพลังงานที่ไม่คาดคิดเราได้สร้างพาร์ติชั่น ext3 ขึ้นมาแม้ว่ามันจะทำให้เกิดการเขียนทางกายภาพอย่างน้อยสองเท่าของการ์ด ชุดค่าผสมนี้ (แต่ฉันยอมรับว่าการเขียนพาร์ติชั่นที่สองของเรานั้นมีไม่บ่อยนักเมื่อเทียบกับ data logger) ดูเหมือนว่าจะทำงานได้โดยไม่มีปัญหา จนถึงตอนนี้ (ระบบที่ติดตั้งประมาณ 30 เดือนในสิ่งอำนวยความสะดวกระดับมืออาชีพ)


3

สำหรับความปลอดภัยของข้อมูลในสภาพแวดล้อมที่มีความเป็นไปได้ในการลดการใช้พลังงานและความปลอดภัยของข้อมูลโดยรวมคุณควรเพิ่มจุดให้มากขึ้น

ใช้เซลล์ MLC NO สำหรับการจัดเก็บเพียง SLC เท่านั้นที่มีเวลาเก็บข้อมูลที่เพียงพอ จากนั้นการ์ด SLC เหล่านั้นสามารถมีเฟิร์มแวร์สมาร์ทการ์ดบางอันไม่สามารถอยู่ภายใต้สภาวะใด ๆ เสียหายจากการสูญเสียพลังงาน พวกเขารับรู้ถึงการตัดไฟโดยการวัดและรักษาความปลอดภัยว่าบล็อกสุดท้ายจะถูกเขียนอย่างสมบูรณ์

การ์ดเหล่านั้นมีราคาแพงกว่าและช้ากว่าเซลล์ MLC เล็กน้อย ดูผู้ขายอย่าง swissbit สำหรับการ์ด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.