Korruptionssicheres SD-Kartendateisystem für Embedded Linux?

36

Vor kurzem hatten wir eine ziemlich unangenehme Situation mit unserem Kunden - Raspberry Pi-basierter "Kiosk", der zur Anzeige von Fernerkundungsdaten verwendet wurde (nichts Besonderes als ein Kioskmodus-Browser, der eine sich selbst aktualisierende Webseite vom Datenerfassungsserver anzeigt), konnte aufgrund von nicht gestartet werden Beschädigung des Dateisystems. Ext4, Manual fsck erforderlich, das System wird Teil der wichtigen Präsentation von morgen sein, Service sofort erforderlich. Natürlich können wir nicht verlangen, dass der Kunde das System ordnungsgemäß herunterfährt, wenn er es über Nacht ausschaltet. Das System muss einer solchen Misshandlung einfach standhalten.

Ich möchte solche Situationen in Zukunft vermeiden und das Betriebssystem auf ein Dateisystem verschieben, das dies verhindert. Es gibt eine Reihe von Dateisystemen, die für MTD-Geräte vorgesehen sind. Um sie auf einer SD-Karte (einem Standard-Block-Gerät) auszuführen, ist ein schwerwiegendes Hüpfen erforderlich. Es gibt auch einige andere Dateisysteme (Journale usw.), die sich einer guten Beständigkeit gegen Korruption rühmen. Ich brauche noch einen vernünftigen Vergleich ihrer Vor- und Nachteile.

Welches in Linux verfügbare Dateisystem bietet den besten Schutz gegen Korruption bei unerwarteten Stromausfällen und erfordert nicht, dass Sie durch unmögliche Rahmen wie yaffs2 springen , um auf SD zu installieren.

Verschleißausgleich ist ein Plus, aber keine Voraussetzung - SD-Karten haben normalerweise ihre eigenen Mechanismen, wenn auch nicht perfekt, obwohl das System "blitzschonend" sein sollte (Systeme wie NTFS können eine SD-Karte innerhalb eines Monats ermorden).

SF.
quelle
1
Persönlich würde ich in die andere Richtung gehen und beim Ausschalten an einer sicheren Abschaltung arbeiten. Wahrscheinlich würde ich eine Kappe verwenden, um genügend Leistung zu erbringen, um eine Abschaltung durchzuführen.
Scott Seidman
Es würde mich freuen, wenn jemand das Modul entwerfen würde, das gerade genug Strom für ein sauberes Herunterfahren liefert, zusammen mit der erforderlichen Systemunterstützung, um die Warnung zu beachten und das Modul tatsächlich herunterzufahren. Es scheint, als ob es ein vernünftiger Begleiter für Pi, BeagleBone und andere kleine Linux-Maschinen sein sollte, aber es scheint nicht als Produkt zu existieren, das für Benutzer dieser Maschinen gekennzeichnet ist.
RBerteig
@ScottSeidman: Das ist RPi, ziemlich leistungshungrig - denke 800mA bei 5V für 15s. Keine echte Kondensatorsache, es sei denn, Sie investieren in eine ganze Batterie Supercaps.
SF.
@RBerteig: Eine Box mit einem wiederaufladbaren Akku, der richtigen Elektronik zum Aufladen, zur Stabilisierung der Ausgangsspannung (möglicherweise durch Erhöhen der Batteriespannung), zum Senden eines Abschaltsignals, zum Abschalten der Ausgangsleistung nach Abschluss des Abschaltens, zum Abschalten selbst, bis die Eingangsleistung wiederhergestellt ist - Sicher, es ist alles machbar, aber wenn Sie das nicht in großen Mengen herstellen, verdoppeln sich die Kosten für das RPI (obwohl das TV-Gerät in diesem Fall zehnmal teurer ist ...)
SF.
1
@SF. - Beachten Sie, dass es bei einem robusten Dateisystem gegen Stromausfall zwei Probleme gibt. Das erste ist, dass der FS selbst robust ist, das zweite ist, dass die zugrunde liegende Hardware nicht über das Löschen von Daten auf die Festplatte lügt. Ich weiß, dass rotierende Festplatten in den letzten Jahren gelogen haben, um ihre offensichtliche Leistung zu steigern. Sie sollten sicherstellen, dass Ihre SD-Karten nicht dasselbe tun.
Michael Kohne

Antworten:

17

Die beste Beständigkeit gegen Korruption auf einer einzelnen SD-Karte bietet BTRFS im RAID1- Modus mit automatischem Scrub-Lauf für jeden vordefinierten Zeitraum.

Die Vorteile:

  1. Beibehaltung der RW-Fähigkeit im Dateisystem
  2. modernes, voll ausgestattetes Dateisystem mit sehr nützlichen Optionen für ein RPi, wie transparente Komprimierung und Schnappschüsse
  3. unter anderem auf Flash-Speicher ausgelegt

So geht's:

Ich führe mein RaspberryPi unter ArchARM Linux aus und meine Karte befindet sich im SD-Reader. Ändern Sie diese Anweisungen daher entsprechend für andere Distributionen und / dev-Schnittstellen.

Hier ist ein Beispiel für ein Partitionslayout:

/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

Um btrfs in RAID1 zu bekommen, erstellen Sie das Dateisystem wie folgt:

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

Dann hast du rsync -aAXvdazu dein zuvor gesichertes System.

Um von BTRFS in raid1 zu booten, müssen Sie initramfs ändern . Daher müssen Sie die folgenden Schritte ausführen, während Ihr System noch auf Ihrem alten Dateisystem ausgeführt wird.

Raspberry verwendet normalerweise kein mkinitcpio, daher müssen Sie es installieren. Anschließend müssen Sie dem MODULES-Array in der Datei mkinitcpio.conf "btrfs" hinzufügen und initramfs mit neu erstellen

mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION

Führen Sie Folgendes aus, um zu erfahren, was anstelle von YOUR_KERNEL_VERSION eingegeben werden soll

ls /lib/modules

Wenn Sie den Kernel aktualisieren, MÜSSEN Sie initramfs vor dem Neustart neu erstellen.

Anschließend müssen Sie die Startdateien von RPi ändern.

In cmdline.txt müssen Sie haben

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

und in config.txt müssen Sie hinzufügen

initramfs initrd 0x01f00000

Sobald Sie das alles erledigt und Ihr btrfs RAID1-System erfolgreich gebootet haben, müssen Sie nur noch ein periodisches Scrub (alle 3-7 Tage) mit systemd timer (bevorzugt) oder cron (dcron) wie folgt einrichten:

btrfs scrub start /

Es wird auf Ihrem Dateisystem ausgeführt, das die Prüfsummen aller Dateien vergleicht und diese repariert (durch die richtige Kopie ersetzt), wenn es eine Beschädigung feststellt.

Die Kombination von BTRFS RAID1, Single Medium und Raspberry Pi macht dieses ziemlich arkane Zeug. Es dauerte einige Zeit und Arbeit, um alle Teile zusammenzufügen, aber hier ist es.

Lockheed
quelle
Sollte ich das 'scrub' auch nach jedem Booten hinzufügen?
SF.
@SF. Nein, das ist nicht nötig. Ein regelmäßiges Peeling alle X Tage ist ausreichend. Am besten während der Stunden mit dem geringsten Verbrauch.
Lockheed
Entschuldigung, ich verstehe das nicht. Muss ich /bootinitramfs noch ändern, wenn ich eine fette Partition behalte ?
Bex
Bex, ja. Es hat mit der raid1-Funktion von btrfs zu tun, nicht mit der fat / boot-Partition.
Lockheed
UPDATE: Ab sofort kann man versuchen, den Dup-Modus anstelle von RAID1 zu verwenden: "mkfs.btrfs --data dup --metadata dup", aber ich bin nicht zu 100% sicher, dass er so ausfallsicher ist wie RAID1 auf einem einzelnen Laufwerk.
Lockheed
10

Ein Flash-Speicher ist aus mehreren Gründen wünschenswerter als ein magnetischer Speicher, aber für diese Anwendung würde ich hauptsächlich sagen, weil es keine beweglichen Teile gibt. Abgesehen davon glaube ich nicht, dass es da draußen ein "korruptionssicheres" Dateisystem gibt, aber es gibt einige robuste Dateisysteme (ext4 ist eines davon) sowie einige Taktiken, die helfen, Korruption abzumildern.

RAM Disk

Wenn das Bild des RPi nicht haben zu ändern, und es klingt wie es nicht der Fall ist, wenn nichts versuchen , (oder sollte zu versuchen) auf die Festplatte schreiben, dann versuchen , ein Root - Dateisystem unter Verwendung erstellt werden in den RAM entpackt . Die Idee dabei ist, dass Sie beim Booten ein komprimiertes Root-Dateisystem haben, das in den RAM entpackt wird. Alle Änderungen werden an der RAM-Disk vorgenommen, sodass praktisch keine Daten auf die SD-Karte geschrieben werden, sondern nur beim Booten gelesen werden. Dies sollte die Lese- / Schreibvorgänge auf Ihrem Laufwerk verringern und die Lebensdauer des Laufwerks erhalten. Dies ist ähnlich wie beim Booten von Linux von einer CD und eines der ersten Dinge, die beim Booten von Linux passieren .

MDMoore313
quelle
10

Ich würde einen anderen Weg gehen und nur ein schreibgeschütztes Dateisystem verwenden. Ich bekomme mein Himbeer-Pi nie stabil genug, wenn ich ein Lese- / Schreib-Root-Dateisystem auf der SD-Karte verwende. Sie können entweder einfach Ihren Root über den Kernel cmdline (ro) booten oder ein initramfs mit Piggyback verwenden, einschließlich Ihres gesamten Systems.

Beides ist mit meinem hausgemachten Build-System OpenADK möglich. ( http://www.openadk.org )


quelle
RO-Dateisystem hilft ... aber löst das Problem nicht vollständig.
Piskvor
7

Nun, das Problem, das Sie hier haben, ist, dass die Verwendung eines "modernen" Dateisystems wie ext * wahrscheinlich Ihre SD-Karte zermürbt. Aus meiner Erfahrung geschieht das innerhalb eines Jahres oder im nächsten Jahr, wenn Sie das höhere Ende nehmen.

Das Problem ist, dass moderne Dateisysteme immer Blöcke verschieben, um eine Fragmentierung der Daten zu verhindern. Das ist eine gute Sache bei sich drehenden Festplatten, bei denen Sie alle Ihre Daten zusammenstellen möchten, wenn Sie sie in den Cache laden. Der Nachteil ist, dass es mehr Schreibvorgänge gibt, die nicht zwischengespeichert werden können, da das Aufräumen erledigt wird, wenn nicht viel I / O passiert.

Dies passiert auch, wenn Sie viel protokollieren, was Sie möglicherweise beim Debuggen Ihres eingebetteten Geräts tun möchten. Die Protokollierungsschreibvorgänge sind die schlechtesten Schreibvorgänge, da viele kleine Schreibvorgänge regelmäßig stattfinden, was zu einer starken Fragmentierung führt.

Wie Sie sagen, verarbeitet Ihr System auch Sensordaten. Es ist sehr wahrscheinlich, dass Sie diese auf dem Flash speichern, sobald sie verfügbar sind. Und sie sind so schlecht wie die Protokolldaten.

Ich bin auf dasselbe Problem gestoßen, auf das Sie gestoßen sind, und hier sind meine Schlussfolgerungen. Ich habe versucht, nach SD-Karten zu suchen, die als "robuster" verkauft werden, dh mit mehr Schreibvorgängen als die anderen, aber ich habe im Gegensatz zu den Benchmarks auf der SSD keinen Benchmark auf dem Markt gefunden, der sich darauf konzentriert. Da sich alle nur auf die Geschwindigkeit konzentrieren, ist es unmöglich, die Anzahl der Schreibvorgänge pro Speicherblock und die auf der SDCard verwendete Technologie zu kennen.

Ich habe jedoch bemerkt, dass die Sandisken mit "industrieller" Qualität eine längere Lebensdauer hatten, als sie namenlos sind. Was nicht überrascht, wenn Sie mehr bezahlen, bekommen Sie mehr.

Bei aktivierter intensiver Protokollierung fand ich jedoch keine SD-Karte mit einer Lebensdauer von mehr als ein paar Jahren. In einem Jahr ist der Tod am größten.

Die Lösung, die ich mir ausgedacht habe, sind die Lösungen von @ BigHomie und @ wbx: Verwenden Sie ein schreibgeschütztes extX-Dateisystem (da keine Journalerstellung mehr erforderlich ist, können Sie sogar auf das gute alte ext2 zurückgreifen). Und wenn Sie Protokolle in der Sitzung behalten oder temporäre Dateien schreiben möchten, können Sie immer eine RAMDISK verwenden.

Es gibt nur Tutorials und Skripte, mit denen Sie die Ramdisk mit Daten aus den schreibgeschützten Bereichen füllen können, damit Sie sie für die Sitzung bearbeiten können.

NB: Meine Erfahrung bestand darin, Angstrom Linux auf einem Beaglebone zu verwenden, während 20 Sensorgeräte ausprobiert wurden. Die Protokollierung dieses Systems war unter Verwendung des Journal-Systems von systemd sehr ausführlich.

zmo
quelle
4

Linux bietet viele Dateisysteme. ext4 ist diejenige , die ich in mehr Vertrauen haben. Im Zweifelsfall sollte ext4 für jede Partition verwendet werden , die Lese- und Schreibsystem eingebunden werden.

Das ext2- Dateisystem ist viel zerbrechlicher. Es ist ein perfektes Dateisystem für Systeme, die es schreibgeschützt bereitstellen oder die Bereitstellung ordnungsgemäß aufheben können. Bei einem Stromausfall auf ext2 ist Korruption jedoch sehr wahrscheinlich .

Die andere Option könnte jfs in Betracht ziehen , obwohl das jfs-Dateisystem in einigen Linux-Versionen nicht zuverlässig ist. Korruption ist bei jfs weniger wahrscheinlich als bei ext4 . JFS hat auch eine schnelle Ladezeit und Dateisystemprüfzeit.


quelle
2
Ja, ext4 ist großartig und ich benutze es für die meisten meiner Server. ABER diese frage handelt von dateisystemen für das root-system auf sd-karten . Dies ist eine andere Umgebung. Ist Ihr Rat allgemein oder raten Sie wirklich zur Verwendung von ext4-Karten?
Guettli