ระบบไฟล์การ์ด SD ที่ป้องกันการเสียหายสำหรับ Linux ในตัว?


36

เมื่อเร็ว ๆ นี้เรามีสถานการณ์ที่ค่อนข้างไม่พึงประสงค์กับลูกค้าของเรา - "คีออส" แบบคีออสก์ที่ใช้ในการแสดงข้อมูลการสำรวจระยะไกล (ไม่มีอะไรแปลกไปกว่าเบราว์เซอร์โหมดคีออสก์ที่แสดงเว็บเพจปรับปรุงตนเองจากเซิร์ฟเวอร์เก็บข้อมูล) ความเสียหายของระบบไฟล์ Ext4, ต้องใช้ Manual fsck, ระบบจะเป็นส่วนหนึ่งของงานนำเสนอที่สำคัญของวันพรุ่งนี้, ต้องการการบริการทันที แน่นอนว่าเราไม่สามารถกำหนดให้ลูกค้าต้องปิดระบบได้อย่างดีเมื่อปิดเครื่องในตอนกลางคืน ระบบจะต้องทนต่อการกระทำผิดดังกล่าว

ฉันต้องการหลีกเลี่ยงสถานการณ์เช่นนี้ในอนาคตและฉันต้องการย้ายระบบปฏิบัติการไปยังระบบไฟล์ที่จะป้องกันสิ่งนี้ มีระบบไฟล์มากมายสำหรับอุปกรณ์ MTD ที่ให้พวกเขาทำงานบนการ์ด SD (อุปกรณ์บล็อกมาตรฐาน) ต้องมีการกระโดดห่วงอย่างจริงจัง นอกจากนี้ยังมีระบบไฟล์อื่น ๆ (journalling ฯลฯ ) ที่มีการต่อต้านการทุจริตที่ดี ฉันยังคงต้องเห็นการเปรียบเทียบข้อดีและข้อเสียของพวกเขาอย่างสมเหตุสมผล

ระบบไฟล์ใดที่มีอยู่ใน Linux จะให้ความต้านทานต่อความเสียหายที่ดีที่สุดจากความล้มเหลวของพลังงานที่ไม่คาดคิดและไม่จำเป็นต้องกระโดดผ่านห่วงที่เป็นไปไม่ได้เช่นyaffs2เพื่อติดตั้งไปยัง SD

การสวมใส่สมดุลเป็นข้อดี แต่ไม่ใช่ข้อกำหนด - การ์ด SD มักจะมีกลไกของตัวเองหากน้อยกว่าที่สมบูรณ์แบบแม้ว่าระบบควรจะ "อ่อนโยนต่อแฟลช" (ระบบเช่น NTFS สามารถฆ่าการ์ด SD ได้ภายในหนึ่งเดือน)


1
โดยส่วนตัวแล้วฉันจะไปในทางอื่นและทำงานในการปิดระบบอย่างปลอดภัยใน poweroff อาจใช้ฝาปิดเพื่อให้อุ้มพอที่จะเรียกใช้การปิดระบบ
Scott Seidman

ฉันชอบที่จะเห็นคนออกแบบโมดูลที่ให้พลังงานเพียงพอสำหรับการปิดระบบที่สะอาดพร้อมกับการสนับสนุนระบบที่จำเป็นในการฟังคำเตือนและปิดตัวลงจริง ดูเหมือนว่ามันควรจะเป็นคู่หูที่เหมาะสมกับ Pi, BeagleBone และเครื่องลีนุกซ์ขนาดเล็กอื่น ๆ แต่ดูเหมือนว่ามันจะไม่ปรากฏว่าเป็นผลิตภัณฑ์ที่ทำเครื่องหมายให้กับผู้ใช้ของเครื่องเหล่านั้น
RBerteig

@ScottSeidman: นี่เป็น RPi ซึ่งค่อนข้างหิวพลังงาน - คิดว่า 800mA ที่ 5V สำหรับ 15 วินาที ไม่ใช่สิ่งที่เป็นตัวเก็บประจุเว้นแต่คุณจะลงทุนในแบตเตอรี่ซุปเปอร์แคปทั้งหมด
เอสเอฟ

@Rertertig: กล่องที่มีแบตเตอรี่แบบชาร์จไฟได้, อุปกรณ์อิเล็กทรอนิกส์ที่เหมาะสมในการชาร์จ, รักษาเสถียรภาพแรงดันไฟฟ้าออก (อาจจะเป็นขั้นตอนขึ้นมาจากแบตเตอรี่ของตัวเอง), ส่งสัญญาณการปิดเครื่อง, ตัดกำลังไฟฟ้าออกหลังจากปิดเครื่องเสร็จสมบูรณ์, ปิดตัวเอง แน่นอนว่ามันเป็นไปได้ทั้งหมด แต่ถ้าคุณไม่ได้ผลิตมันเป็นจำนวนมากมันเกี่ยวกับค่าใช้จ่ายของ RPi เป็นสองเท่า (แม้ว่าในกรณีของตู้นั้นโทรทัศน์จะมีราคาแพงกว่า 10 เท่า ... )
เอสเอฟ

1
@SF - โปรดทราบว่ามีปัญหาสองประการเกี่ยวกับระบบไฟล์ powerfail ที่แข็งแกร่ง อย่างแรกคือ FS นั้นมีความทนทานส่วนที่สองคือฮาร์ดแวร์ที่อยู่ภายในไม่ได้เกี่ยวกับการล้างข้อมูลไปยังดิสก์ ฉันรู้ว่าดิสก์หมุนวนถูกนำไปวางในช่วงไม่กี่ปีที่ผ่านมาเพื่อเพิ่มประสิทธิภาพให้ชัดเจนคุณจะต้องแน่ใจว่าการ์ด SD ของคุณไม่ทำงานเหมือนกัน
Michael Kohne

คำตอบ:


17

ความต้านทานที่ดีที่สุดต่อการทุจริตในการ์ด SD เดียวจะถูกนำเสนอโดยBTRFS ในโหมดRAID1 ที่มีการขัดอัตโนมัติจะดำเนินการทุกช่วงเวลาที่กำหนดไว้ล่วงหน้า

ประโยชน์ที่ได้รับ:

  1. ความสามารถในการรักษา RW กับระบบไฟล์
  2. ระบบไฟล์ที่ทันสมัยโดดเด่นพร้อมตัวเลือกที่มีประโยชน์มากสำหรับ RPi เช่นการบีบอัดและสแนปชอตแบบโปร่งใส
  3. ออกแบบโดยคำนึงถึงหน่วยความจำแฟลช (เหนือสิ่งอื่นใด)

นี่คือวิธีที่จะทำ:

ฉันรัน RaspberryPi ของฉันบน ArchARM linux และการ์ดของฉันอยู่ในตัวอ่าน SD ดังนั้นให้แก้ไขคำแนะนำเหล่านั้นตามลำดับสำหรับ distros และ / dev อินเตอร์เฟสอื่น ๆ

นี่คือตัวอย่างโครงร่างพาร์ติชัน:

/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

ในการรับ btrfs ลงใน RAID1 คุณต้องสร้างระบบไฟล์ดังนี้:

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

จากนั้นคุณrsync -aAXvก็ไปที่ระบบสำรองข้อมูลก่อนหน้านี้ของคุณ

ที่จะได้ไปบูตจาก BTRFS ใน RAID1, คุณจะต้องแก้ไข initramfs ดังนั้นคุณต้องทำสิ่งต่อไปนี้ในขณะที่คุณยังคงมีระบบของคุณทำงานบนระบบไฟล์เก่าของคุณ

Raspberry ไม่ปกติใช้ mkinitcpio ดังนั้นคุณต้องติดตั้ง จากนั้นคุณต้องเพิ่ม“ btrfs” ลงในอาร์เรย์ MODULES ใน mkinitcpio.conf และสร้าง initramfs อีกครั้งด้วย

mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION

หากต้องการทราบว่าต้องพิมพ์อะไรแทน YOUR_KERNEL_VERSION ให้เรียกใช้

ls /lib/modules

หากคุณอัปเดตเคอร์เนลคุณต้องสร้าง initramfs ก่อนที่คุณจะเริ่มต้นใหม่

จากนั้นคุณต้องแก้ไขไฟล์บูตของ RPi

ใน cmdline.txt คุณต้องมี

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

และใน config.txt คุณจะต้องเพิ่ม

initramfs initrd 0x01f00000

เมื่อคุณทำทุกอย่างเสร็จสิ้นแล้วและทำการบูทเข้าสู่ระบบ btrfs RAID1 ของคุณเรียบร้อยแล้วสิ่งเดียวที่เหลืออยู่ก็คือการตั้งค่าสครับเป็นระยะ (ทุก 3-7 วัน) ด้วย systemd timer (ที่ต้องการ) หรือ cron (dcron) ดังนี้:

btrfs scrub start /

มันจะทำงานบนระบบไฟล์ของคุณเปรียบเทียบ checksums ของไฟล์ทั้งหมดและแก้ไขพวกเขา (แทนที่ด้วยสำเนาที่ถูกต้อง) หากพบความเสียหายใด ๆ

การรวมกันของ BTRFS RAID1, สื่อเดี่ยวและ Raspberry Pi ทำให้สิ่งที่น่าพิศวงนี้ ต้องใช้เวลาและทำงานเพื่อรวบรวมชิ้นส่วนทั้งหมด แต่ที่นี่เป็น


ฉันควรเพิ่ม 'การขัด' หลังจากบูตเครื่องด้วยหรือไม่
เอสเอฟ

@SF ไม่ไม่จำเป็น สครับเป็นระยะทุก ๆ วันก็เพียงพอแล้ว โดยเฉพาะอย่างยิ่งในช่วงชั่วโมงของการใช้งานน้อยที่สุด
lockheed

ขออภัยฉันไม่เข้าใจ - ถ้าฉันเก็บ/bootพาร์ติชันที่มีไขมันฉันยังต้องแก้ไข initramfs หรือไม่
Bex

Bex ใช่ มันเกี่ยวกับคุณสมบัติ raid1 ของ btrfs ไม่ใช่พาร์ติชั่นสำหรับบูต
lockheed

@@@ อัปเดต: @@@ ณ ตอนนี้เราสามารถลองใช้โหมดดูอัลแทน RAID1: "mkfs.btrfs --data dup --metadata dup" แต่ฉันไม่แน่ใจ 100% ว่ามันยืดหยุ่นเหมือน RAID1 บนไดรฟ์เดียว
lockheed

10

ที่เก็บแฟลชเป็นที่พึงปรารถนามากกว่าที่เก็บแม่เหล็กด้วยเหตุผลหลายประการ แต่สำหรับแอปพลิเคชั่นนี้ฉันจะพูดเป็นหลักเพราะไม่มีชิ้นส่วนที่เคลื่อนไหว ที่ถูกกล่าวว่าฉันไม่คิดว่าจะมีระบบแฟ้ม 'หลักฐานการทุจริต' ออกมี แต่มีบางระบบไฟล์ที่แข็งแกร่ง (ext4 เป็นหนึ่ง) ออกมีเช่นเดียวกับกลยุทธ์บางอย่างเพื่อช่วยลดความเสียหาย

แรมดิสก์

หากภาพ RPI ไม่ได้มีการเปลี่ยนแปลงและมันเสียงเหมือนมันไม่ได้ถ้าไม่มีอะไรจะพยายามที่จะ (หรือควรจะพยายามที่จะ) เขียนไปยังดิสก์แล้วลองใช้ระบบแฟ้มรากที่สร้างขึ้นเพื่อจะแตกออกเป็นแรม แนวคิดนี้คือคุณมีระบบไฟล์รูทที่บีบอัดเมื่อบู๊ตเครื่องซึ่งจะแตกออกเป็น RAM การเปลี่ยนแปลงทั้งหมดเกิดขึ้นกับดิสก์ RAM ดังนั้นจึงไม่มีการเขียนไปยังการ์ด SD อย่างมีประสิทธิภาพการอ่านเมื่อบูตเท่านั้น สิ่งนี้ควรลดจำนวนการอ่าน / เขียนลงในไดรฟ์ของคุณเพื่อรักษาชีวิตของมันไว้ นี้จะคล้ายกับสิ่งที่ทำเมื่อคุณบูตลินุกซ์จากซีดีและเป็นหนึ่งในสิ่งแรกที่เกิดขึ้นเมื่อบูทลินุกซ์


10

ฉันจะไปอีกทางและจะใช้ระบบไฟล์แบบอ่านอย่างเดียว ฉันไม่เคยทำให้ราสเบอร์รี่ปี่ของฉันเสถียรพอเมื่อใช้ระบบไฟล์รูทการอ่าน - เขียนบน sdcard คุณสามารถบูตรูทผ่านเคอร์เนล cmdline (ro) หรือใช้ initramfs กับ piggyback รวมถึงระบบทั้งหมดของคุณ

ทั้งสองเป็นไปได้ที่จะสร้างด้วยระบบสร้างโฮมเมดของฉัน OpenADK ( http://www.openadk.org )


ระบบไฟล์ RO ช่วย ... แต่ไม่สามารถแก้ปัญหาได้ทั้งหมด
Piskvor

7

ปัญหาที่คุณมีอยู่ที่นี่คือการใช้ระบบไฟล์ "ทันสมัย" เช่น ext * มีแนวโน้มที่จะใส่การ์ด SD ของคุณลง จากประสบการณ์ของฉันที่เกิดขึ้นภายในหนึ่งปีหรือในปีหน้าถ้าคุณทำคะแนนสูงสุด

ปัญหาคือระบบไฟล์ที่ทันสมัยมักจะย้ายบล็อกไปรอบ ๆ เพื่อป้องกันการกระจายตัวของข้อมูล ซึ่งเป็นสิ่งที่ดีในดิสก์หมุนที่คุณต้องการให้ข้อมูลทั้งหมดของคุณเรียงเมื่อโหลดขึ้นในแคช ข้อเสียคือการเขียนเพิ่มขึ้นซึ่งไม่สามารถเก็บไว้ได้เนื่องจากมีการจัดการกับการเรียงลำดับข้อความเมื่อเกิด I ​​/ O ไม่มาก

มันยังเกิดขึ้นเมื่อคุณจัดการกับการบันทึกจำนวนมากซึ่งคุณอาจต้องทำเมื่อทำการดีบักอุปกรณ์ฝังตัวของคุณ การบันทึกการบันทึกเป็นประเภทการเขียนที่เลวร้ายที่สุดเพราะมีการเขียนเล็ก ๆ จำนวนมากเกิดขึ้นเป็นประจำซึ่งสร้างการกระจายตัวจำนวนมาก

อย่างที่คุณบอกว่าระบบของคุณกำลังจัดการข้อมูลของเซ็นเซอร์ด้วยเช่นกันมันเป็นไปได้มากที่คุณจะเก็บมันไว้ในแฟลชเมื่อมาถึง และพวกเขาก็ไม่ดีเท่ากับข้อมูลบันทึก

ฉันพบปัญหาเดียวกันกับที่คุณพบและนี่คือข้อสรุปของฉัน ฉันพยายามมองหาการ์ด SD ที่จะขายว่า "แข็งแกร่งกว่า" นั่นคือสามารถจัดการการเขียนได้มากกว่าการ์ดอื่น ๆ แต่ฉันไม่พบเกณฑ์มาตรฐานในตลาดที่มุ่งเน้นเรื่องนี้ซึ่งแตกต่างจากมาตรฐานของ SSD เนื่องจากพวกเขามุ่งเน้นที่ความเร็วเท่านั้นจึงเป็นไปไม่ได้ที่จะรู้จำนวนการเขียนต่อบล็อกหน่วยความจำและเทคโนโลยีที่ใช้ใน SDCard

แม้ว่าฉันจะสังเกตเห็นว่า sandisks เกรด "อุตสาหกรรม" มีอายุขัยยาวนานกว่าที่ไม่มีชื่อ ซึ่งไม่น่าแปลกใจเมื่อคุณจ่ายมากขึ้นคุณจะได้รับมากขึ้น

แต่ในที่สุดเมื่อเปิดใช้งานการบันทึกอย่างเข้มข้นฉันพบว่าไม่มีการ์ด SD ที่มีอายุการใช้งานนานกว่าสองปีซึ่งเป็นหนึ่งปีที่มีผู้เสียชีวิตมากที่สุด

โซลูชันที่ฉันพบคือโซลูชัน @ BigHomie และ @wbx ': ใช้ระบบไฟล์แบบอ่านอย่างเดียว extX (เนื่องจากไม่ต้องใช้การจดบันทึกอีกต่อไปคุณยังสามารถย้อนกลับไปสู่ ​​ext2 เก่าที่ดีได้) และถ้าคุณต้องการเก็บบันทึกไว้ในเซสชันหรือเขียนไฟล์ชั่วคราวคุณสามารถใช้ RAMDISK ได้ตลอดเวลา

มีบทช่วยสอนและสคริปต์เท่านั้นที่ช่วยเติม ramdisk ด้วยข้อมูลจากในส่วนอ่านอย่างเดียวเพื่อให้คุณสามารถแก้ไขได้สำหรับเซสชั่น

NB: ประสบการณ์ของฉันได้ใช้อังสตรอม Linux บน Beaglebone ท่ามกลางการทดลองใช้อุปกรณ์เซ็นเซอร์ 20 ตัว การบันทึกของระบบนั้นเป็นสิ่งที่ละเอียดมากโดยใช้ระบบบันทึกประจำวันของ systemd


4

Linux มีระบบไฟล์มากมาย ext4เป็นสิ่งที่ฉันมีความมั่นใจมากขึ้นเมื่อมีข้อสงสัยควรใช้ ext4 สำหรับพาร์ติชันใด ๆ ที่จะเมาท์อ่าน - เขียน

ext2ระบบแฟ้มเป็นมากขึ้นที่เปราะบาง มันเป็นระบบไฟล์ที่ดีอย่างสมบูรณ์แบบสำหรับระบบที่สามารถเมานต์แบบอ่านอย่างเดียวหรือยกเลิกการต่อเชื่อมได้อย่างถูกต้อง แต่ความเสียหายอาจเป็นไปได้อย่างยิ่งกับความล้มเหลวของอำนาจext2

ตัวเลือกอื่นอาจพิจารณาjfsแม้ว่าระบบไฟล์ jfs ไม่น่าเชื่อถือในบางรุ่น Linux และปราบปรามการทุจริตมีโอกาสน้อยที่มีjfsกว่าext4 Jfsยังมีเวลาเมานต์ด่วนและเวลาตรวจสอบระบบไฟล์


2
ใช่ ext4 นั้นยอดเยี่ยมและฉันใช้สำหรับเซิร์ฟเวอร์ส่วนใหญ่ของฉัน แต่คำถามนี้เป็นเรื่องเกี่ยวกับระบบไฟล์สำหรับระบบรากในSD การ์ด นี่คือสภาพแวดล้อมที่แตกต่างกัน คำแนะนำของคุณเป็นแบบทั่วไปหรือคุณแนะนำให้ใช้การ์ด ext4 หรือไม่?
guettli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.