Hệ thống tập tin thẻ SD chống tham nhũng cho Linux nhúng?


36

Gần đây, chúng tôi đã gặp phải một tình huống khá khó chịu với khách hàng của mình - "kiosk" dựa trên Raspberry Pi được sử dụng để hiển thị dữ liệu viễn thám (không có gì lạ hơn trình duyệt chế độ kiosk hiển thị trang web tự cập nhật từ máy chủ thu thập dữ liệu) không khởi động được do hệ thống tập tin tham nhũng. Ext4, Yêu cầu fsck thủ công, hệ thống sẽ là một phần của bài thuyết trình quan trọng vào ngày mai, yêu cầu dịch vụ ngay lập tức. Tất nhiên, chúng tôi không thể yêu cầu khách hàng tắt hệ thống một cách độc đáo khi tắt nó vào ban đêm; hệ thống chỉ đơn giản là chịu được sự ngược đãi đó.

Tôi muốn tránh những tình huống như vậy trong tương lai và tôi muốn chuyển HĐH sang một hệ thống tập tin sẽ ngăn chặn điều này. Có một loạt các hệ thống tập tin dành cho các thiết bị MTD, trong đó việc để chúng chạy trên thẻ SD (một thiết bị khối tiêu chuẩn) đòi hỏi một số bước nhảy nghiêm trọng. Ngoài ra còn có một số hệ thống tập tin khác (tạp chí, v.v.) tự hào về khả năng chống tham nhũng tốt. Tôi vẫn cần xem một số so sánh hợp lý về ưu và nhược điểm của họ.

Hệ thống tập tin nào có sẵn trong Linux sẽ cung cấp khả năng chống tham nhũng tốt nhất đối với các sự cố mất điện đột xuất và không yêu cầu nhảy qua các vòng không thể như yaffs2 để cài đặt vào SD.

Cân bằng hao mòn là một lợi thế, nhưng không phải là một yêu cầu - Thẻ SD thường có cơ chế riêng, nếu không hoàn hảo, mặc dù hệ thống phải "nhẹ nhàng cho flash" (các hệ thống như NTFS có thể giết chết thẻ SD trong vòng một tháng).


1
Cá nhân, tôi sẽ đi theo một cách khác và làm việc tắt máy an toàn khi tắt nguồn, có thể sử dụng nắp để cung cấp đủ sức để chạy tắt máy.
Scott Seidman

Tôi rất thích thấy ai đó thiết kế mô-đun cung cấp năng lượng vừa đủ để tắt máy sạch sẽ, cùng với sự hỗ trợ hệ thống cần thiết để chú ý đến cảnh báo và thực sự tắt. Có vẻ như nó phải là một người bạn đồng hành hợp lý với Pi, BeagleBone và các máy Linux nhỏ khác, nhưng dường như nó không tồn tại như một sản phẩm được đánh dấu cho người dùng của các máy đó.
RBerteig

@ScottSeidman: Đây là RPi, khá ngốn điện - hãy nghĩ 800mA ở 5V trong 15 giây. Không hẳn là một thứ tụ điện trừ khi bạn đầu tư vào toàn bộ pin của siêu xe.
SF.

@RBeree chắc chắn tất cả đều có thể thực hiện được nhưng nếu bạn không sản xuất số lượng lớn đó, nó sẽ tăng gấp đôi chi phí của RPi (mặc dù trong trường hợp của ki-ốt đó, TV đắt hơn 10 lần ...)
SF.

1
@SF. - Lưu ý rằng có hai vấn đề mạnh mẽ đối với hệ thống tệp powerfail. Thứ nhất là bản thân FS rất mạnh mẽ, thứ hai là phần cứng cơ bản không nói dối về việc xả dữ liệu vào đĩa. Tôi biết rằng các đĩa quay đã được sử dụng để nói dối trong những năm gần đây để tăng hiệu suất rõ ràng của chúng, bạn sẽ muốn đảm bảo rằng thẻ SD của bạn không hoạt động giống nhau.
Michael Kohne

Câu trả lời:


17

BTRFS cung cấp khả năng chống tham nhũng tốt nhất trên một thẻ SD trong chế độ RAID1 với chế độ chà tự động chạy trong mọi khoảng thời gian được xác định trước.

Những lợi ích:

  1. khả năng duy trì RW đến hệ thống tập tin
  2. hệ thống tập tin hiện đại, đầy đủ tính năng với các tùy chọn rất hữu ích cho RPi, như nén và chụp nhanh trong suốt
  3. được thiết kế với bộ nhớ flash trong tâm trí (trong số những thứ khác)

Đây là cách làm:

Tôi chạy RaspberryPi trên ArchARM linux và thẻ của tôi nằm trong trình đọc SD, vì vậy hãy sửa đổi các hướng dẫn đó cho phù hợp với các bản phân phối và giao diện khác.

Dưới đây là một bố cục phân vùng ví dụ:

/dev/mmcblk0p1: fat32 boot partition
/dev/mmcblk0p2: to be used as btrfs partition
/dev/mmcblk0p3: to be used as btrfs partition (mirrored with the above)
/dev/mmcblk0p4 (optional): swap

Để nhận btrfs vào RAID1, bạn tạo hệ thống tập tin như sau:

mkfs.btrfs -m raid1 -d raid1 /dev/mmcblk0p2 /dev/mmcblk0p3

Sau đó, bạn rsync -aAXvđể nó hệ thống sao lưu trước đó của bạn.

Để có được nó khởi động từ BTRFS trong raid1, bạn cần sửa đổi initramfs . Do đó, bạn cần thực hiện các thao tác sau trong khi bạn vẫn có hệ thống chạy trên hệ thống tệp cũ.

Raspberry thường không sử dụng mkinitcpio nên bạn phải cài đặt nó. Sau đó, bạn cần thêm Mảng btrfs vào mảng MODULES trong mkinitcpio.conf và tạo lại initramfs với

mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION

Để biết nên gõ gì thay vì CỦA BẠN_KERNEL_VERSION, hãy chạy

ls /lib/modules

Nếu bạn cập nhật kernel, bạn PHẢI tạo lại initramfs TRƯỚC KHI bạn khởi động lại.

Sau đó, bạn cần sửa đổi các tệp khởi động của RPi.

Trong cmdline.txt, bạn cần phải có

root=/dev/mmcblk0p2 initrd=0x01f00000 rootfstype=btrfs

và trong config.txt, bạn cần thêm

initramfs initrd 0x01f00000

Khi bạn đã thực hiện tất cả những điều đó và khởi động thành công vào hệ thống RAID1 btrfs của bạn, điều duy nhất còn lại là thiết lập quá trình chà định kỳ (cứ sau 3 - 7 ngày) với bộ đếm thời gian systemd (ưa thích) hoặc cron (dcron) như vậy:

btrfs scrub start /

Nó sẽ chạy trên hệ thống tệp của bạn so sánh tổng của tất cả các tệp và sửa chúng (thay thế bằng bản sao chính xác) nếu phát hiện thấy bất kỳ tham nhũng nào.

Sự kết hợp của BTRFS RAID1, phương tiện đơn và Raspberry Pi tạo nên thứ tuyệt vời này. Phải mất một thời gian và công sức để đặt tất cả các mảnh lại với nhau, nhưng đây là.


Tôi có nên thêm 'chà' sau mỗi lần khởi động không?
SF.

@SF. Không nó không cần thiết. Chà định kỳ mỗi X ngày là đủ. Tốt nhất là trong giờ sử dụng ít nhất.
khóa vào

Xin lỗi, tôi không hiểu - nếu tôi giữ một /bootphân vùng chất béo , tôi vẫn cần phải sửa đổi initramfs chứ?
Bex

Bex, vâng. Nó phải làm với tính năng raid1 của btrfs, không phải phân vùng mỡ / boot.
khóa vào

@@@ CẬP NHẬT: @@@ Hiện tại, người ta có thể thử sử dụng chế độ song công thay vì RAID1: "mkfs.btrfs --data dup --metadata dup" nhưng tôi không chắc chắn 100% nó có khả năng phục hồi như RAID1 trên một ổ đĩa duy nhất.
khóa vào

10

Lưu trữ flash tốt là mong muốn hơn lưu trữ từ tính, vì nhiều lý do, nhưng đối với ứng dụng này tôi sẽ nói chủ yếu vì không có bộ phận chuyển động. Điều đó đang được nói, tôi không nghĩ rằng có một hệ thống tập tin 'chống tham nhũng' ngoài kia, nhưng có một số hệ thống tập tin mạnh mẽ (ext4 là một) ngoài đó, cũng như một số chiến thuật để giúp giảm thiểu tham nhũng.

Đĩa RAM

Nếu hình ảnh của RPi không phải thay đổi và có vẻ như không, nếu không có gì sẽ cố gắng (hoặc nên cố gắng) ghi vào đĩa, thì hãy thử sử dụng hệ thống tập tin gốc được tạo để giải nén vào RAM . Ý tưởng ở đây là bạn có một hệ thống tập tin gốc được nén khi khởi động được giải nén vào RAM. Tất cả các thay đổi xảy ra với đĩa RAM, do đó, không có cách ghi nào vào Thẻ SD, chỉ đọc khi khởi động. điều này sẽ cắt giảm việc đọc / ghi vào ổ đĩa của bạn, duy trì tuổi thọ của nó. Điều này tương tự với những gì được thực hiện khi bạn khởi động linux từ đĩa CD và là một trong những điều đầu tiên xảy ra khi linux khởi động .


10

Tôi sẽ đi một cách khác và sẽ chỉ sử dụng một hệ thống tập tin chỉ đọc. Tôi không bao giờ có được raspberry pi đủ ổn định khi sử dụng hệ thống tập tin gốc đọc-ghi trên sdcard. Bạn có thể chỉ cần khởi động root của mình thông qua kernel cmdline (ro) hoặc sử dụng initramfs với piggyback bao gồm cả hệ thống hoàn chỉnh của bạn.

Cả hai đều có thể tạo với hệ thống xây dựng tự chế OpenADK của tôi. ( http://www.openadk.org )


Hệ thống tập tin RO giúp ... nhưng không giải quyết được vấn đề hoàn toàn.
Piskvor

7

Chà, vấn đề bạn gặp phải ở đây là việc sử dụng một hệ thống tập tin "hiện đại" như ext * có khả năng làm hao mòn Thẻ SD của bạn; từ kinh nghiệm của tôi xảy ra trong vòng một năm hoặc năm tiếp theo nếu bạn học cao hơn.

Vấn đề là các hệ thống tập tin hiện đại luôn di chuyển các khối xung quanh để ngăn chặn sự phân mảnh dữ liệu. Đó là một điều tốt trên các đĩa quay, nơi bạn muốn có tất cả dữ liệu của mình được đối chiếu khi tải nó vào bộ đệm. Nhược điểm là việc viết nhiều hơn không thể được lưu trong bộ nhớ cache khi việc dọn dẹp đang được xử lý khi không có nhiều I / O xảy ra.

Điều này cũng xảy ra khi bạn xử lý nhiều nhật ký, điều mà bạn có thể muốn làm khi gỡ lỗi thiết bị nhúng của mình. Viết nhật ký là loại văn bản tồi tệ nhất, bởi vì đó là rất nhiều bài viết nhỏ xảy ra thường xuyên, tạo ra rất nhiều phân mảnh.

Như bạn nói hệ thống của bạn cũng đang xử lý dữ liệu của cảm biến, rất có khả năng bạn lưu trữ chúng trên đèn flash khi chúng đến. Và chúng cũng tệ như dữ liệu nhật ký.

Tôi đã đi vào cùng một vấn đề mà bạn đang gặp phải, và đây là kết luận của tôi. Tôi đã cố gắng tìm kiếm Thẻ SD sẽ được bán là "mạnh mẽ hơn", tức là có thể xử lý nhiều ghi hơn các loại khác, nhưng tôi không tìm thấy điểm chuẩn nào trên thị trường tập trung vào đó, không giống như các điểm chuẩn trên SSD. Vì tất cả chỉ tập trung vào tốc độ, không thể biết số lần ghi trên mỗi khối bộ nhớ và công nghệ được sử dụng trong SDCard.

Mặc dù vậy, tôi đã nhận thấy các loại cát "công nghiệp" có tuổi thọ cao hơn mà không có tên. Điều đó không gây ngạc nhiên, khi bạn trả nhiều tiền hơn, bạn sẽ nhận được nhiều hơn.

Nhưng cuối cùng, với tính năng ghi nhật ký được kích hoạt, tôi thấy rằng không có Thẻ SD nào có tuổi thọ dài hơn một vài năm, một năm là nơi xảy ra nhiều cái chết nhất.

Giải pháp tôi đưa ra là các giải pháp của @ BigHomie và @wbx ': sử dụng hệ thống tập tin ExtX chỉ đọc (vì việc ghi nhật ký không còn cần thiết, thậm chí bạn có thể dự phòng cho ext2 cũ tốt). Và nếu bạn muốn giữ nhật ký trong phiên hoặc ghi các tệp tạm thời, bạn luôn có thể sử dụng RAMDISK.

Có tồn tại các hướng dẫn và tập lệnh giúp đưa dữ liệu vào đĩa dữ liệu từ bên trong các phần chỉ đọc để bạn có thể chỉnh sửa chúng cho phiên.

Lưu ý: trải nghiệm của tôi đã sử dụng Angstrom Linux trên Beaglebone, trong số 20 thiết bị cảm biến chạy thử. Ghi nhật ký của hệ thống đó rất dài dòng, sử dụng hệ thống nhật ký của systemd.


4

Linux cung cấp nhiều hệ thống tập tin. ext4 là cái tôi tin tưởng hơn. Khi nghi ngờ, ext4 nên được sử dụng cho bất kỳ phân vùng nào sẽ được gắn đọc-ghi.

Hệ thống tập tin ext2 mỏng manh hơn nhiều. Nó là một hệ thống tập tin hoàn toàn tốt cho các hệ thống có thể gắn kết nó chỉ đọc hoặc ngắt kết nối chính xác. Nhưng tham nhũng là rất có thể với một sự cố mất điện trên ext2 .

Tùy chọn khác có thể xem xét jfs mặc dù hệ thống tập tin jfs không đáng tin cậy trong một số phiên bản Linux. Tham nhũng ít xảy ra với jfs hơn với ext4 . Jfs cũng có thời gian gắn kết nhanh và thời gian kiểm tra hệ thống tệp.


2
Vâng, ext4 là tuyệt vời và tôi sử dụng nó cho hầu hết các máy chủ của tôi. NHƯNG câu hỏi này là về hệ thống tập tin cho hệ thống gốc trên thẻ sd . Đây là một môi trường khác nhau. Lời khuyên của bạn là chung chung, hay bạn thực sự khuyên bạn nên sử dụng thẻ ext4?
guettli
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.