Sử dụng an toàn thẻ SD khi mất điện bất cứ lúc nào


10

Chúng tôi đang làm việc trên một hệ thống Linux nhúng nhỏ (2.6,35-ish) với một thiết bị NAND bên trong nhỏ cho HĐH và các ứng dụng (250-500Meg) và thẻ SD với thẻ SD SDHC 8Gb cho dữ liệu.

Sức mạnh của đơn vị có thể bị cắt bất cứ lúc nào.

Hệ thống phải lưu trữ dữ liệu vào thẻ SD. Dữ liệu này khá quan trọng ... đó là toàn bộ mục đích của hệ thống. Các hệ thống thường hoàn toàn bị ngắt kết nối khỏi bất kỳ mạng nào ở các địa điểm từ xa và dữ liệu được truy xuất thông qua sneakernet cứ sau 4-8 tuần.

Hiện tại, chúng tôi chỉ đơn giản là có VFAT trên thẻ SD. Điều đó chủ yếu là để các khách hàng thử nghiệm đầu tiên có thể dễ dàng sao chép dữ liệu thủ công vào máy tính xách tay Win7 của họ.

Tuy nhiên, bây giờ tôi lo lắng rằng đó chỉ là vấn đề thời gian cho đến khi mất điện không đúng lúc gây mất dữ liệu.

Cách tốt nhất để cấu hình một hệ thống như vậy để ngăn ngừa mất dữ liệu là gì? JFFS2 nghe có vẻ như những gì tôi muốn về cách nó ghi dữ liệu (và nhu cầu về hiệu suất không cao chút nào), nhưng nghe có vẻ khá bẩn khi sử dụng block2mtd, v.v. Tôi cũng không chắc cách thức độ mòn của thẻ sẽ tương tác với nó.

Cách tốt nhất để làm điều này là gì?

BIÊN TẬP

Bây giờ tôi đang nghĩ đến việc rời khỏi hệ thống tập tin VFAT và phân bổ các tệp có kích thước ngày tại một thời điểm, chứa 0xFF, điều đó sẽ hạn chế đáng kể việc tiếp xúc với các lỗi trong chu kỳ nguồn. Sau đó, tôi chỉ có thể nối các bản ghi trong các khối được xử lý trước đó và hy vọng rằng thẻ SD không ngu ngốc đến mức chúng sẽ xóa / xóa mức ghi vào các vùng 0xFF.

Tôi có thể sử dụng noatime, nhưng có một thời gian danh nghĩa VFAT tương đương để ngăn ghi vào trường thời gian đã sửa đổi không? Tôi cần một số cách để ngăn chặn mọi cập nhật siêu dữ liệu cho đến khi tệp của một ngày mới được tạo.

CHỈNH SỬA 2

Một người nào đó trên sàn giao dịch ngăn xếp điện tử nhắc nhở tôi rằng cũng có dữ liệu ECC trên NAND, vì vậy không có cách nào để ngăn chặn nhu cầu xóa.

Vì vậy, liệu JFFS2 qua block2mtd có phù hợp trong tình huống này không?

EDIT 3

Nó tệ hơn tôi nghĩ. Thẻ SD tôi có sẽ xóa các khối dữ liệu ngay cả khi bạn ghi chính xác cùng một nội dung vào đĩa. Các eraseblocks là 64KB, và nó quá lớn để hoàn toàn trì hoãn việc viết. Tôi sẽ lưu trữ tới 128KB dữ liệu trong flash NAND (mà tôi có thể kiểm soát hành vi ghi của), trong một loại nhật ký, sau đó ghi các khối 128KB vào tệp được căn chỉnh 128KB trong phân vùng VFAT trên thẻ SD (trong trường hợp các thẻ SD khác có eraseblocks 128KB).


1
"hy vọng rằng thẻ SD không quá ngu ngốc" <--- ROFLOL. Không có khả năng!
derobert

Cho đến khi bạn tìm thấy giải pháp đầy đủ cho vấn đề bạn gặp phải, hãy sử dụng synclệnh sau mỗi lần ghi vào thẻ SD, nó sẽ ghi các bit ngay lập tức sau khi bạn thay đổi / tạo chúng mà không lưu trữ chúng trong RAM để thay đổi của bạn ít nhất là trên thẻ và sẽ không mất điện.
Hanan N.

synccó lẽ sẽ làm cho vấn đề tồi tệ hơn, vì nó làm tăng tỷ lệ thời gian mà siêu dữ liệu là cập nhật giữa.
Ben Voigt

Câu trả lời:


5

Chà, cách bạn có thể khắc phục điều này là khắc phục vấn đề "có thể cắt điện bất cứ lúc nào". Có thể thêm thậm chí một phút năng lượng pin?

Ngoài ra, có thể bạn có thể sử dụng hai thẻ SD. Ghi dữ liệu vào một thẻ, đồng bộ hóa, ghi vào thẻ khác. Mỗi khối dữ liệu của bạn sẽ cần một tổng kiểm tra và số khối, nhưng sau đó ngay cả với một số sự cố mất điện khá không may, một trong những thẻ phải đúng.

Vấn đề cơ bản của bạn sẽ là hao mòn cân bằng trên thẻ SD, mà AFAIK phụ thuộc vào nhà cung cấp thẻ (và thậm chí có thể là lô, họ có thể thay đổi bất cứ khi nào). Nó có thể không xử lý mất điện chính xác. Và tùy thuộc vào những gì nó làm, điều đó có thể không chỉ có nghĩa là làm hỏng khối bạn đang viết.

  1. Giả sử các khối thẻ nhỏ tầm 3 (flash) tầm thường. Khối 1 đã nhận được nhiều ghi hơn 2 hoặc 3. Tôi sẽ gọi các khối vật lý theo số và các khối logic A, B, C bằng chữ cái. Ngay bây giờ, A = 1, B = 2, C = 3.
  2. Bạn phát hành một ghi cho khối A. Thẻ SD giống như aha! chúng ta cần cân bằng hao mòn ở đây, khối 1 khác sẽ bị hao mòn trước 2 và 3. Nó quyết định hoán đổi khối 1 và 2.
  3. Nó đọc khối 1 vào vị trí RAM i (trên thẻ SD, không phải RAM hệ thống). Nó cập nhật phần bạn muốn thay đổi.
  4. Nó đọc khối 2 vào vị trí RAM ii
  5. Nó xóa khối 1
  6. Nó ghi vị trí RAM ii đến khối 1.
  7. Nó cập nhật bảng ánh xạ để nói B = 1
  8. Nó xóa khối 2.
  9. Nó ghi vị trí RAM i vào khối 2.
  10. Nó cập nhật bảng ánh xạ để nói A = 2

Tất nhiên, "cập nhật bảng ánh xạ" không phải lúc nào cũng tầm thường. Và thứ tự của 5 trận10 có thể khác nhau (nếu tất cả đều hoàn thành, điều đó không thành vấn đề, dĩ nhiên là phải xóa trước khi viết, tất nhiên). Nhưng một sự cố mất điện xảy ra, bạn có thể kết thúc với không chỉ A bị hỏng (như bạn mong đợi) mà cả B cũng vậy. Hoặc, nếu mất điện xảy ra trong quá trình cập nhật bản đồ, ai biết được loại tham nhũng nào sẽ gây ra.


1
Các thiết bị này phải sống trong môi trường tương đối khắc nghiệt trong nhiều năm và khi được lắp đặt, chúng sẽ được chuyển đến nhiều quốc gia khác nhau mà chúng tôi không phải sử dụng pin đủ điều kiện. Có lẽ chúng tôi sẽ bỏ MMC / SD và xây dựng giải pháp flash NAND của riêng mình trước khi sử dụng pin.
darron

Chà, trong trường hợp của chúng tôi, giải pháp "sửa chữa 'có thể bị cắt bất cứ lúc nào", giải pháp sôi sục để "ngăn tài xế xe tải ngủ sau tay lái và lái vào thiết bị của chúng tôi." "Một chiếc xe tải đâm vào nó" thực sự là về chế độ thất bại phổ biến nhất.
SF.

1
Một phút pin không cần thiết. Lượng điện năng cần thiết để ngắt kết nối thẻ SD một cách an toàn phải nằm trong phạm vi mà tụ điện có thể lưu trữ.
Ben Voigt

4

Một cái gì đó tương tự đã được thảo luận trong Electronics.stackexchange.com: Làm cách nào để bảo vệ thẻ SD trước sự cố mất điện đột xuất?

Một câu trả lời ngang dọc hoạt động song song với các giải pháp phần mềm là xem xét phần cứng (có một câu hỏi trên ESE về vấn đề này, nhưng tôi không thể tìm thấy nó ngay bây giờ; và làm thế nào để phát hiện điều này và hành động trên nó).

Câu chuyện ngắn là: bạn có thể không có pin, nhưng bộ nguồn của bạn có một số tụ điện khá lớn để làm trơn nguồn cung cấp. Về cơ bản, điện không chỉ đi ra ngoài. Tắt điện áp. Có thể có một IC / mạch bảo vệ màu nâu xác nhận tín hiệu RESET trên hệ thống nhúng của bạn khi điện áp xuống dưới một điểm nhất định. Bo mạch chủ PC cũng có những cái đó và chúng phản hồi tín hiệu 'POWEROK' từ PSU. Điều này có nghĩa là, khi mất điện, máy tính sẽ bị dừng một cách mạnh mẽ vài mili giây trước khi điện áp giảm xuống dưới mức an toàn. Trong thời gian này, các thiết bị ngoại vi như thẻ SD vẫn được cấp nguồn, nhưng không có thêm giao dịch nào đến từ máy tính.

Rất có khả năng thẻ SD có đủ thời gian để hoàn thành bất kỳ giao dịch đang chờ xử lý nào, bao gồm cả mức độ hao mòn, trước khi mất điện. Cải thiện nguồn cung cấp năng lượng của bạn với một tụ điện đủ lớn hoặc sử dụng một nguồn gần thẻ SD có thể giúp đảm bảo điều này, nhưng bạn luôn có thể thử nghiệm với nền tảng của mình. Rất có khả năng nó giữ được năng lượng trong thời gian đủ.

Nếu khía cạnh phần cứng của vấn đề không phải là vấn đề, bạn có thể giải quyết vấn đề chỉ có phần mềm. derobert 's IDEs của việc sử dụng hai thẻ để dự phòng không phải là xấu, và sử dụng một hệ thống tập tin tiêu chuẩn như VFAT chạy ít nguy cơ gây nhầm lẫn thuật toán mặc san lấp mặt bằng của thẻ.

Dù sao, nó cũng có thể là bạn sẽ không có nhiều vấn đề. Giả sử một khối trên thẻ của bạn có thể tồn tại 100 lần ghi (bảo thủ - nhưng hãy cố gắng để có thẻ chất lượng tốt!) Và sử dụng thẻ 8GB, bạn sẽ viết được 800 GB vào thời điểm khối đầu tiên chết (tất nhiên là nói theo thống kê).


Câu hỏi đã được bắt đầu bởi vì tôi đã nhận được tham nhũng thẻ SD lớn khi tắt nguồn các sự kiện. Khá thường xuyên, thực sự. Có thể 1 trong 20 sự kiện mất điện là thảm khốc và có thể 1 trong 4 sự cố đã gây ra ít nhất MỘT SỐ thiệt hại. Cuối cùng tôi đã thay đổi thành lưu trữ giá trị dữ liệu của một ngày trên flash NAND nội bộ và sao chép vào SD vào lúc nửa đêm (hoạt động trong 1 giây hoặc lâu hơn). Tôi đang tìm cách cải thiện mọi thứ trong tương lai. Tôi đã có mũ trị giá 400uF trên đường sắt ... chưa đủ, rõ ràng ... có lẽ việc mất điện không được xử lý đúng cách.
darron

Đó là một tỷ lệ mới mắc khá cao! Thời gian để có được các đầu dò dao động và thấy điều này trong hành động, methinks. Mặc dù có khả năng bạn có thể làm việc xung quanh nó trong phần mềm, cách tốt nhất về mức tiêu thụ năng lượng là đảm bảo bạn không gặp trục trặc về phần cứng. Có lẽ bạn có thể phòng ngừa các vụ cá cược của mình và hỏi về Electronics.stackexchange.com không?
Alexios

@darron, bạn đã giải quyết vấn đề gì cho vấn đề lưu trữ thẻ SD của mình? Bạn vẫn đang viết thư cho NANDFlash sau đó sao chép lại mỗi ngày một lần? Tôi có một thiết kế với thẻ SD là RFS chính (không có NANDFlash riêng) và đang gặp vấn đề về hỏng dữ liệu, cả có và không có tình trạng mất điện đột ngột.
fret basset

4

Chúng tôi đã gặp sự cố với SD, hệ thống tệp gốc ext2 bị hỏng do mất điện đột xuất. Trước hết, chúng tôi làm cho hệ thống chạy với một root root chỉ đọc. Vì chúng tôi cần một số lưu trữ có thể ghi (nhưng chúng tôi không ghi nhật ký dữ liệu), chúng tôi thiết lập phân vùng thứ hai là có thể ghi. Để giảm thiểu thiệt hại của FS khi mất điện đột xuất, chúng tôi đã tạo một phân vùng ext3, mặc dù điều này sẽ gây ra ít nhất gấp đôi số lần ghi vật lý vào thẻ. Sự kết hợp này (nhưng tôi thừa nhận việc ghi phân vùng thứ hai của chúng tôi không thường xuyên so với trình ghi dữ liệu) dường như chạy mà không gặp vấn đề gì. Cho đến nay. (Hệ thống được cài đặt khoảng 30 tháng trong các cơ sở chuyên nghiệp)


3

Đối với Bảo mật dữ liệu trong một môi trường có khả năng cắt điện và bảo mật dữ liệu tổng thể, bạn nên trao đổi nhiều điểm hơn nữa.

SỬ DỤNG tế bào KHÔNG MLC để lưu trữ, chỉ SLC có thời gian lưu dữ liệu là đủ. Sau đó, các thẻ SLC đó có thể có phần sụn thông minh, một số không thể trong bất kỳ trạng thái nào bị hỏng do mất điện. Họ nhận ra việc cắt điện bằng cách đo và bảo đảm rằng khối cuối cùng được viết hoàn chỉnh.

Những thẻ đó đắt hơn và chậm hơn một chút so với các tế bào MLC. Xem các nhà cung cấp như swissbit cho thẻ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.