Ngăn chặn hỏng dữ liệu trên ổ đĩa ext4 / Linux khi mất điện


9

Tôi có một số bảng nhúng chạy bios Megatrends của Mỹ với hệ điều hành nhúng Linux. Vấn đề tôi gặp phải là các ide flash công nghiệp sẽ bị hỏng khi mất điện. Tôi có chúng được định dạng là ext4. Bất cứ khi nào điều này xảy ra, tôi thường có thể sửa đèn flash bằng fsck, nhưng điều này sẽ không thể thực hiện được trong các triển khai của chúng tôi. Tôi đã nghe nói rằng việc vô hiệu hóa bộ đệm ghi sẽ giúp ích, nhưng tôi không thể tìm ra cách để làm điều đó. Ngoài ra, tôi còn nên làm gì nữa không?

Thêm thông tin

Ổ đĩa là một mô-đun flash ide 4gb. Tôi có một phân vùng là ext4. Hệ điều hành được cài đặt trên phân vùng đó và grub là bộ tải khởi động của tôi.

fdisk -l hiển thị / dev / sda là mô-đun flash của tôi với / dev / sda1 làm phân vùng chính của tôi.

Sau khi mất điện, tôi thường không thể thực hiện hoàn toàn thông qua các tập lệnh khởi động.

Khi tôi gắn ổ đĩa trên một PC khác, tôi chạy fsck / dev / sda1. Nó luôn hiển thị các tin nhắn như

"zero datetime on node 1553 ... fix (y)?"

Tôi sửa chúng và nó khởi động tốt cho đến khi mất điện tiếp theo.

Khi tôi đến văn phòng vào ngày mai, tôi sẽ đăng sản lượng thực tế của fdisk -l

Đây là tất cả những gì tôi biết về cách hệ thống hoạt động. Tôi không phải là một anh chàng hệ thống, tôi là một Kỹ sư phần mềm có thói quen đi vào những tình huống nằm ngoài mô tả công việc của anh ấy. Tôi biết cách định dạng ổ đĩa, cài đặt bộ tải khởi động, viết phần mềm và hack trên hệ điều hành.

Đây là đầu ra từ dumpe2fs

#sudo dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   VideoServer
Last mounted on:          /
Filesystem UUID:          9cba62b0-8038-4913-be30-8eb211b23d78
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              245760
Block count:              977949
Reserved block count:     48896
Free blocks:              158584
Free inodes:              102920
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      239
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Fri Feb  4 15:12:00 2011
Last mount time:          Sun Oct  2 23:48:37 2011
Last write time:          Mon Oct  3 16:34:01 2011
Mount count:              2
Maximum mount count:      26
Last checked:             Tue Oct  4 07:44:50 2011
Check interval:           15552000 (6 months)
Next check after:         Sun Apr  1 07:44:50 2012
Lifetime writes:          21 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      249d2b79-1e20-49a3-b324-6cb631294a63
Journal backup:           inode blocks

Câu trả lời:


6

Bộ đệm ghi thường không liên quan gì đến BIOS, chủ yếu không có tùy chọn để chuyển đổi cài đặt bộ đệm đĩa trong đó. Với linux, sử dụng hdparm -W 0sẽ giúp.

Cài đặt không đổi, vì vậy nếu bạn không có hdparm để chơi xung quanh trong các hệ thống sản xuất của mình, bạn sẽ có thể vô hiệu hóa bộ đệm ghi đĩa trên một hệ thống khác và cắm lại đĩa.

BTW: Tôi muốn thứ hai ý tưởng về một hệ thống tập tin gốc không thể ghi được (vì vậy hệ thống của bạn có thể khởi động ở dạng "chế độ phục hồi" và cho phép truy cập từ xa ngay cả khi hệ thống tệp có thể ghi không thể gắn được vì một số lý do). Và nếu bạn có thể thay đổi thiết kế phần cứng, hãy cân nhắc sử dụng các thiết bị mtd thay vì các đĩa IDE / SATA với hệ thống tệp nhận biết flash như jffs2 . Chúng tôi đã sử dụng kết hợp này với một số thiết bị nhúng (chủ yếu là các giải pháp bộ định tuyến VPN trong lĩnh vực này) trong vài năm với kết quả tốt.

Cập nhật: gốc rễ của vấn đề của bạn dường như là bạn đang chạy một hệ thống tập tin ext4 với việc ghi nhật ký bị vô hiệu hóa - has_journalbị thiếu trong Filesystem featuresdanh sách. Chỉ cần tắt tất cả các dịch vụ, kiểm tra xem có bất cứ thứ gì vẫn mở tệp đang sử dụng hay không lsof +f -- /, chỉ đọc lại phân vùng gốc của bạn với mount -o remount,ro /, bật nhật ký tune2fs -O has_journal /dev/sda1và thiết lập chế độ nhật ký "đã đặt hàng" làm tùy chọn gắn kết mặc định bằng cách sử dụng tune2fs -o journal_data_ordered /dev/sda1- bạn sẽ phải đăng lại chạy fsck (tốt nhất là từ hệ thống cứu hộ) và nhắc lại root / khởi động lại sau thao tác này.

Với các cài đặt này, siêu dữ liệu được đảm bảo có thể phục hồi được từ tạp chí ngay cả trong trường hợp mất điện đột ngột. Dữ liệu thực tế cũng được ghi liên tục vào đĩa, mặc dù bạn có thể thấy dữ liệu của vài giây trước khi mất điện khi khởi động. Nếu điều này không được chấp nhận, bạn có thể cân nhắc sử dụng tune2fs -o journal_data /dev/sda1tùy chọn gắn kết với hệ thống tệp của mình - điều này sẽ bao gồm tất cả dữ liệu được ghi vào đĩa trong tạp chí - điều này rõ ràng sẽ mang lại cho bạn tính nhất quán dữ liệu tốt hơn nhưng với chi phí phạt hiệu suất và mức độ hao mòn cao hơn trên ổ SSD của bạn.


Vì vậy, bộ đệm ghi là vấn đề của tôi hoặc cái gì khác?
Jonathan Henson

Chà, làm sao tôi biết, đó là hệ thống của bạn sau tất cả :-) Bạn nên cung cấp một số chi tiết về các tùy chọn gắn kết hệ thống tệp được sử dụng (bạn có bật phạm vi không? Loại dữ liệu / chế độ nhật ký nào?) Và loại tham nhũng bạn nhìn thấy (đầu ra fsck sẽ là tốt nhất) để phân tích chi tiết hơn.
the-wợi

Được rồi cảm ơn. Tôi là một kỹ sư phần mềm bất lực mà bạn biết :). Tôi sẽ nhận được một số chi tiết. Tôi sẽ thêm một số chi tiết trong vòng một phút.
Jonathan Henson

Tôi không biết phạm vi là gì và tôi không chắc chế độ Nhật ký là gì.
Jonathan Henson

Ah tôi thấy. Chỉ cần đăng những dòng đầu tiên của đầu ra dumpe2fs /dev/sda1(hoặc bất cứ tên thiết bị / phân vùng nào của bạn cho hệ thống này) - chúng nên chứa tất cả thông tin liên quan. Và các tùy chọn gắn kết cho hệ thống tập tin gốc từ / etc / fstab cũng sẽ giúp ích.
the-wợi

5

Gợi ý ghi bộ đệm là một khởi đầu tốt nhưng điều này nghe có vẻ như là một lỗ hổng thiết kế kiến ​​trúc. Trên hệ thống nhúng, đèn flash bên trong có thể KHÔNG được gắn R / W trừ trường hợp hiếm. Bạn thực sự nên thực hiện hầu hết các công việc trong một hệ thống tập tin bộ nhớ và đồng bộ hóa các thay đổi trở lại với đèn flash RW theo một số lệnh người dùng hoặc khoảng thời gian thông thường. Nó thực sự không phổ biến khi một hệ thống nhúng sử dụng một hệ thống tệp thông thường (như ext4) trong chế độ rw trong khi hoạt động bình thường. Nếu có một số yêu cầu ứng dụng mà bạn cần nhiều dung lượng lưu trữ, bạn nên xem xét phân vùng hệ thống của mình có khác không và thiết kế nó sao cho phân vùng dữ liệu có thể được fsck -y'ed là một phần của khởi động.

Nếu bạn cần một số điểm khởi đầu, tôi sẽ xem xét cách mọi người thiết lập hệ thống Diskless Linux:

http://frank.harvard.edu/~coldwell/diskless/

và bắt đầu từ đó. Ý tưởng chung là các tệp nhị phân và dữ liệu hệ thống của bạn có thể được gắn ở chế độ chỉ đọc để hệ thống tệp của bạn không bị hỏng. Tuy nhiên, bạn cần có khả năng ghi vào các khu vực nhất định, vì vậy bạn cần một cái gì đó thường là bộ nhớ hệ thống tập tin / tmp, / var / tmp. Ngay cả khi một số thứ nhất định cần có thể ghi, bạn chỉ cần tạo một tập lệnh để gắn phân vùng dưới dạng r + w và sau đó cam kết thay đổi, sau đó quay lại chỉ đọc.

Một ví dụ thực sự tuyệt vời về điều này là phần cứng Cyclades, linux nhúng của nó và bất cứ khi nào bạn thực hiện thay đổi cấu hình, bạn phải thực thi một tập lệnh lưu thực sự hoàn lại các cấu hình và ghi chúng ra flash.


Có các tệp cấu hình cần được chỉnh sửa bởi ứng dụng cũng như / etc / mạng và tệp tên máy chủ. Bạn có thể cho tôi một đề xuất tức là một cái gì đó như, bạn cần một phân vùng với loại như vậy và loại khác cho các tệp cấu hình của bạn thuộc loại khác, v.v. Tôi thực sự không có ý tưởng về những điều này. Tôi viết phần mềm và kỳ vọng sẽ biết chính xác (không phải là tôi không biết viết phần mềm * nix, nhưng tôi chắc chắn không biết nhiều như một anh chàng hệ thống chuyên dụng) làm thế nào phần cứng hoạt động bởi chủ nhân của tôi.
Jonathan Henson

Chắc chắn, tôi đã cập nhật câu trả lời để bao gồm một số thông tin thêm. Đây là một chủ đề khá phức tạp để giải quyết trong một câu hỏi mặc dù nó liên quan đến rất nhiều nội bộ linux. Bạn có thể muốn thử và ký hợp đồng với ai đó đã thực hiện các hệ thống không cần đĩa / pxe / nhúng để hiểu các yêu cầu ứng dụng của bạn và kiến ​​trúc sư một giải pháp đáng tin cậy.
đa thức

Trường hợp xấu nhất, bạn có thể sử dụng phân vùng hệ thống (không bao giờ ghi được) và hai phân vùng cấu hình. Nếu phân vùng chính không thể đọc được hoặc không đầy đủ, hãy khởi động từ phụ, định dạng lại chính và sao chép phụ vào đó. Cập nhật sơ cấp và thứ cấp trong các hoạt động không chồng chéo.
David Schwartz

Ok, tôi đã cập nhật câu trả lời của tôi. Tôi có thể sẽ lấy lời khuyên của bạn và đưa nó cho một giáo sư cũ của tôi từ chương trình sau đại học của tôi. Trong khi đó, có nhanh và bẩn ít nhất sẽ đưa tôi vào một vị trí tốt hơn mà không bao gồm mông của tôi trong chảo rán không?
Jonathan Henson

Tắt bộ nhớ đệm ghi hoặc chạy 'đồng bộ hóa' một cách thường xuyên có thể sẽ giúp ích trong thời gian ngắn.
đa thức
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.