Có một số chủ đề hiện có xoay quanh vấn đề này, nhưng những gì tôi tìm kiếm hơi khác nhau. Tôi có thẻ SD trên Linux nhúng và nó bị mất điện. Tôi có thể có thể sửa đổi phần cứng tại một số điểm, đóng cửa đúng cách, v.v. Nhưng ngay bây giờ, tôi chỉ muốn tìm một hệ thống tệp tồn tại mà không bị mất điện. Mất dữ liệu là chấp nhận được. Tôi không muốn mất nhiều hơn tệp mà tôi hiện đang viết, nhưng tôi vẫn muốn mất tất cả hơn là đối mặt với 'không thể gắn kết', 'chờ trong 10 phút này fsck' hoặc 'không thể tạo mới tập tin do inode này một cái gì đó lỗi '. Chương trình PHẢI tiếp tục!
Tôi đang nỗ lực rất nhiều để đảm bảo điều này. Tôi đang sử dụng các thành phần cấp công nghiệp, tôi có các cơ quan giám sát phần cứng, cơ quan giám sát phần mềm, bên trong, bên ngoài, khởi động lại các chương trình, trình nền liên tục kiểm tra bộ nhớ, mô tả tệp và không có gì, tôi có các cơ quan giám sát xem các cơ quan giám sát của mình ... Nhưng tôi dường như không thể đảm bảo rằng thẻ SD có thể gắn kết và hoạt động?
Đặt cược tốt nhất của tôi ngay bây giờ, là sử dụng JFS trên thẻ SD, bao gồm fsck và fsck.jfs trong cài đặt của tôi. (Thêm 600kb + ăn ram và flash của tôi. Điều này thật tệ.) Và chạy fsck mỗi khi khởi động (có thể thêm nhiều thời gian khởi động. Điều này hơi tệ.) Có vẻ hơi buồn.
Có ai biết một cách tốt hơn hoặc một hệ thống tập tin tốt hơn?
CẬP NHẬT: e2fspross-libs (phụ thuộc vào jfsutils) dường như rất khó biên dịch trong bản phân phối của tôi. Tôi sẽ xem xét ZFS (mặc dù nó không có nguồn gốc từ bản phân phối của tôi. Và nó dường như làm được rất nhiều thứ mà tôi không cần.)
CẬP NHẬT2: Một số thông tin thêm về hệ thống của tôi và các thử nghiệm của tôi: Bộ lưu trữ thẻ SD là bộ lưu trữ phụ, tùy chọn. Thẻ SD là loại công nghiệp 2Gb-8Gb. Thẻ SD được gắn thông qua RC của tôi bằng lệnh mount -t. Tùy chọn "noatime" nhưng không "sync". Phân phối của tôi là một uClinux có hương vị thiết bị tương tự tùy chỉnh, với hạt nhân 3.10 và hộp bận 1.21. Bộ nhớ chính của tôi là một đèn flash spi với jffs2. Tôi chưa bao giờ có bất kỳ vấn đề với điều đó. Tôi thậm chí không biết nếu có sẵn một fsck.jffs2. Mặt khác, Nand flash ... nhưng đó là một câu chuyện khác. Mục đích của thẻ SD, là lưu trữ dữ liệu đo lường. Chương trình 'màn hình' sẽ nối kết quả vào một tệp và có các vị trí đồng bộ hóa chiến lược. Khi tệp vượt quá kích thước đã cho, một tệp mới sẽ được tạo. Khi đã đạt đến một số lượng tệp nhất định, tệp cũ nhất sẽ bị xóa. Nếu tệp đo hiện tại bị mất do mất điện, đó không phải là thảm họa. Các tập tin thường ở mức 50-100kb và 1 kết quả thường là 1kb. Đây chỉ là giai đoạn phát triển ban đầu. Không có gì là cố định. Đây là lần đầu tiên tôi làm việc với các hệ thống tập tin không flash trong các hệ thống nhúng. (Tôi đã có ext4 tại các máy chủ x86 của mình.)
Tôi bắt đầu với vfat. Hệ thống tập tin mặc định. (Tôi đoán rằng các nhà máy có thể có lý do để chọn nó. Và nếu mọi thứ hoạt động tôi không thực sự quan tâm đến điều đó.) Tôi chưa bao giờ thấy bất kỳ vấn đề mất điện nào trong các thiết bị vfat nhúng của mình. Tôi đã gặp vấn đề với FAT trong WinCE. Tuy nhiên, khi chương trình 'màn hình' của tôi đạt 100-200 tệp, nó đã từ chối tạo thêm nữa. Có vẻ như FAT có một vấn đề giới hạn tệp đặc biệt trong thư mục gốc và một vấn đề lớn hơn một chút trong các thư mục con. Tôi cần để có thể tạo 500-1000 tệp trong 1 dir. Vì vậy, vfat sẽ không làm.
Sau đó tôi chuyển sang ext2. Tôi đã không chèn một fsck khi khởi động. (Không biết tôi phải làm như vậy.) Trong vòng một ngày, chương trình 'màn hình' của tôi không thể tạo thêm tệp do lỗi 'inode gì đó'. Thảm họa!
Giải pháp hiện tại của tôi là ext2 với "e2fsck -y" khi khởi động. Cho đến nay nó có vẻ đầy hứa hẹn. Nhưng e2fsck và toàn bộ khái niệm 'fsck khi khởi động' đang cằn nhằn tôi. Bản thân e2fsck đang tiêu tốn hơn 350kb flash và ram chính của tôi. (Khi nó không chạy.) Điều đó có nghĩa đó là chương trình lớn nhất của tôi. Nó lớn hơn busybox. Nó gần như là đối thủ của tôi.
Tôi đã xem xét ext3. Nó đã ghi lại dữ liệu meta, sẽ không bị tổn thương. Tôi nghi ngờ về việc nó sẽ giúp được bao nhiêu. Với các tập tin nhỏ và đồng bộ hóa được kiểm soát của tôi, tôi nên được bảo hiểm? Nó có một trình tự viết theo thứ tự. Có nghĩa là dữ liệu cũng phần nào được ghi lại. Điều này tuy nhiên có thể dẫn đến độ trễ không xác định. Đó là xấu trong tình huống của tôi. (Đây có lẽ không phải là vấn đề.) Nó cũng có tính năng đồng bộ theo lịch trình. Ví dụ. cam kết cứ sau 5 giây. Tôi nghĩ rằng đó là can thiệp vào đồng bộ hóa của riêng tôi. Quá nhiều ghi là xấu cho thẻ SD. Ngay cả những người công nghiệp. Tôi không thể tìm thấy bất kỳ tài liệu nào về cách vô hiệu hóa điều này. Và ext3 vẫn yêu cầu fsck phải được chạy ở mỗi lần khởi động! Nhưng ext3 vẫn là một khả năng.
Ext4. Sẽ khắc phục rất nhiều vấn đề về hiệu năng của ext3. Tôi không thực sự cần hiệu suất mặc dù. Và bản phân phối của tôi dường như không có mkfs.ext4 và fsck.ext4 dựng sẵn. Có lẽ đó không phải là vấn đề. Nó có thể mặc dù. Ví dụ. các e2pross-libs (phụ thuộc vào jfsutils) dường như có rất nhiều vấn đề biên dịch.
JFS, XFS, BRFSS. Tất cả được hỗ trợ bởi kernel của tôi. Hiện tại không bao gồm trong hộp công cụ không gian người dùng của tôi. Tất cả dường như là khá lớn, hệ thống phức tạp. Và tất cả họ dường như yêu cầu một 'fsck' tương đương khi khởi động?
Tôi cũng đã cân nhắc việc ném hệ thống tệp của riêng mình: Luôn viết 2 bản sao của bảng tệp. Khi di chuyển ngang, nó chọn một cái có CRC chính xác và số thứ tự mới nhất. Thực hiện một trình tự viết 2 giai đoạn. Phân bổ tạm thời, sửa chữa tại cam kết. Không cần fsck. Tôi sợ rằng nó có thể là một chút ngây thơ mặc dù.
CẬP NHẬT3: BTW, bản chất của các hệ thống nhúng (ít nhất là hệ thống này) là chúng tự trị, không giám sát, ngoài tầm với và chúng phải chạy trong nhiều năm. Các chương trình như fsck có thể yêu cầu sự tương tác của con người làm tôi khó chịu.