Hệ thống tệp không bao giờ bị hỏng (mất dữ liệu chấp nhận được)


9

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.


1
Tại sao không gắn kết hệ thống tập tin của bạn chỉ đọc và tạo một hệ thống tập tin nhỏ cho bất cứ điều gì bạn muốn viết vào?
Chris Xuống

ZFS cũng có thể là một tùy chọn (kiểm tra tính toàn vẹn dữ liệu tốt).
Ouki

Đây hệ thống tệp nhỏ để ghi
Illishar

Vâng, tôi cũng đã xem xét ZFS. Tuy nhiên, hỗ trợ cho nó không chính xác là nhảy vào mặt tôi khi tôi nhìn vào bản phân phối của mình. Và tôi không thực sự quan tâm đến tính toàn vẹn dữ liệu. Tôi chỉ muốn nó gắn kết và làm việc.
Illishar

bạn đã xem btrfs.wiki.kernel.org/index.php/Main_Page bạn nên chỉnh sửa câu hỏi của mình với nghiên cứu của bạn để chúng tôi có thể giúp bạn hiệu quả hơn
Kiwy

Câu trả lời:


2

Có một chút mâu thuẫn hoặc ít nhất là sự mơ hồ, trong câu chuyện của bạn ở đây:

Tôi vẫn thà mất tất cả còn hơn là đối mặt với 'không thể gắn kết', 'chờ 10 phút này fsck'

Ngụ ý - mặc dù bạn không thực sự nói điều đó - rằng đây là vấn đề bạn đang thực sự gặp phải. Nhưng sau đó:

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.

Có nghĩa là bạn không có bất kỳ fsck nào , vì e2fsprogs-libsnó là một phụ thuộc cho việc e2fsprogscung cấp e2fsck. Vì vậy, có lẽ bạn vẫn đang trong giai đoạn lập kế hoạch ở đây và thậm chí chưa thử nghiệm hệ thống với, ví dụ ext4, nhưng thay vào đó đã nhảy đến kết luận rằng bạn nên bắt đầu với JFS? Có bất kỳ lý do cụ thể cho điều đó?

Tôi đã nhận thấy trên trao đổi pi mâm xôi (bộ lưu trữ chính của pi cũng là thẻ SD) rằng một số lượng đáng kể người dùng dường như rất thất vọng bởi các vấn đề thuộc loại này, mặc dù phần lớn (bao gồm cả tôi) chưa bao giờ có nó tất cả. Lúc đầu, tôi cho rằng đây là những người không biết gì về việc hệ thống nên được tắt sạch, nhưng đó không phải là điểm khó nắm bắt khi được giải thích, và có những người báo cáo mặc dù hệ thống đã bị tắt đúng cách .

Bạn đã nói rằng bạn cần điều này để có thể chịu đựng được việc cắt điện (đủ công bằng), nhưng tôi đề cập đến điều này bởi vì nó ngụ ý rằng có một số pis, hoặc một số thẻ SD, hoặc một số kết hợp cả hai, dễ bị làm hỏng hệ thống tập tin do một số sự kiện (đột biến?) xảy ra thường xuyên khi rút phích cắm hoặc khi nó được đặt lại. Tôi cũng KHÔNG thấy - và đã có nhiều thời gian để nhiều người thử - MỌI báo cáo của ai đó nói rằng họ đã chuyển sang btrfs hoặc jfs hoặc bất cứ điều gì và bây giờ vấn đề đã được giải quyết.

Một điều bí ẩn khác về điều này là ngay cả khi mọi người đang giật dây, điều này không thường xuyên dẫn đến một hệ thống tập tin không thể sử dụng. Chắc chắn tôi đã thực hiện nó rất nhiều lần với số pi và điểm số nếu không phải hàng trăm lần với một hộp linux thông thường (nguồn bị cắt, hệ thống trở nên không phản hồi, tôi kiệt sức và tức giận, v.v.) và trong khi tôi đã thấy mất dữ liệu nhỏ, tôi chưa bao giờ thấy một hệ thống tập tin bị hỏng đến mức không thể sử dụng được sau một fsck nhanh chóng.

Một lần nữa, giả sử tất cả các báo cáo này là đúng (tôi không hiểu tại sao số người sẽ nói dối về nó), có một điều gì đó xảy ra nhiều hơn là không hoàn toàn không đếm được, nhưng dường như chỉ ảnh hưởng đến một tỷ lệ nhỏ người dùng, ngụ ý lại một số loại lỗi phần cứng phổ biến.

Trên pi tôi viết -yđể /forcefscktrong một kịch bản khởi động, do đó trên khởi động tiếp theo nó được chạy tự động và bất kỳ vấn đề được cố định, bất kể điều này dường như là cần thiết hay không. Trên lõi đơn 700 Mhz, việc này mất ~ 10 giây cho hệ thống tệp 12 GB chứa ~ 4 GB dữ liệu. Vì vậy, "10 phút" nghe có vẻ như là một khoảng thời gian dài vô cùng, đặc biệt là khi bạn đã nói "Đây hệ thống tệp nhỏ để ghi!".

Bạn cũng có thể xem xét việc gọi syncđều đặn.

Cuối cùng, bạn nên cập nhật câu hỏi với nhiều chi tiết thực tế, cụ thể hơn về các vấn đề bạn thực sự gặp phải và ít cường điệu hơn. Mặt khác, nó trông giống như một vấn đề XY quá sớm , có thể sẽ nhanh chóng bị bỏ qua bởi những người có nhiều kinh nghiệm và lời khuyên tiềm năng cho bạn.


Trên thực tế, e2fsck của tôi có thể biên dịch mà không cần phụ thuộc vào e2fspross-libs. Tôi cũng đã tự hỏi về điều đó. (Đây không phải là phiên bản busybox.) Nhưng tôi không muốn có nó ... Tôi sẽ cập nhật câu hỏi với một số thông tin khác.
Illishar

Tôi chỉ ngạc nhiên khi nó hoạt động với libext2fs (hoặc bạn đã xây dựng một phiên bản tĩnh? Hoặc có thể đây chỉ là vấn đề của bao bì khác nhau? Dù sao ...). Tôi sẽ chọn ext4 trên ext2 vì tính năng ghi nhật ký được cải thiện và kiểm tra fsck nhanh hơn , nếu khả thi và có thể là synctùy chọn gắn kết. Mặc dù điều đó và nhật ký sẽ làm tăng chu kỳ ghi của bạn, thật khó để thấy một hệ thống tập tin thay thế (ví dụ, một hệ thống lý thuyết kiểm tra trực tuyến) có thể tránh được việc phải làm nhiều hay ít điều tương tự, nếu tính mạnh mẽ là mục tiêu. Chúc may mắn và nếu bạn tìm thấy một giải pháp, thêm câu trả lời của bạn.
goldilocks

2

Chương trình PHẢI tiếp tục!

Vâng, đây là một yêu cầu chung và các hệ thống Linux là lựa chọn tốt nhất khi chọn Hệ thống ổn định.

Những nỗ lực của bạn dường như cũng không đi đúng hướng. Tuy nhiên, bạn có thể làm gì để có được một hệ thống ổn định?

Ở cấp độ đầu tiên, bạn có thể cải thiện hệ thống tệp của mình:

  • Sử dụng yournal_data_orderedtrên một ext3/ext4hệ thống tập tin, khi tạo hoặc sửa đổi với tune2fs.
  • Với công JFSdụng --replay_journal_onlykhi kiểm tra.
  • Cho phép tự động hoàn thành bằng cách thiết lập FSCKFIX=yestrong các bản inits.

Nếu điều này là không đủ, bạn có thể khởi động hệ thống của mình mà không cần gắn đĩa lỗi. Thay vào đó hãy tạo một bản mới ramdisktrong khi bạn tự kiểm tra và sửa chữa đĩa lỗi của mình. Điều này cũng có thể được tự động hóa bởi các kịch bản.

Ở cấp độ tiếp theo, bạn sẽ cần rời khỏi hệ thống nhúng của mình và đọc một số chủ đề về Tính sẵn sàng cao


Đối với initscript, tự động kiểm tra là điều mà OP muốn tránh. Vì vậy, hệ thống tập tin sẽ phải hỗ trợ kiểm tra hệ thống tập tin trực tuyến.
Bratchley

1
với yournal_data_orderedhoặc replay_journal_onlychỉ mất vài giây để kiểm tra, đó là sự khác biệt.

1
Vâng, làm ơn. Bạn có biết một hệ thống tập tin hỗ trợ kiểm tra trực tuyến?
Illishar
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.