Dateisystem, das niemals kaputt geht (Datenverlust akzeptabel)


9

Es gibt mehrere existierende Themen, die sich mit diesem Thema befassen, aber was ich suche, ist etwas anders. Ich habe eine SD-Karte unter einem eingebetteten Linux und sie leidet unter Stromausfall. Möglicherweise kann ich die Hardware irgendwann ändern, ordnungsgemäß schließen usw., aber im Moment möchte ich nur ein Dateisystem finden, das den Stromausfall ohne viel Aufhebens übersteht. Datenverlust ist akzeptabel. Ich würde es vorziehen, nicht mehr als die Datei zu verlieren, die ich gerade schreibe, aber ich würde trotzdem lieber alles verlieren, als mich einem "nicht mounten", "Warten auf diese 10 Minuten fsck" oder "nicht in der Lage, neue zu erstellen" zu stellen Datei aufgrund dieser Inode etwas etwas Fehler '. Das Programm muss weitergehen!

Ich bemühe mich sehr, dies sicherzustellen. Ich verwende industrielle Komponenten, habe Hardware-Watchdogs, Software-Watchdogs, interne, externe, Init-Neustarts der Programme, Daemons, die ständig den Speicher überprüfen, Dateideskriptoren und so weiter. Ich habe Watchdogs, die meine Watchdogs beobachten, die wiederum von anderen Watchdogs überwacht werden ... aber ich kann nicht garantieren, dass die SD-Karte einbinden und funktionieren kann?

Im Moment ist es am besten, JFS auf der SD-Karte zu verwenden und fsck und fsck.jfs in meine Installation aufzunehmen. (Hinzufügen von 600 KB +, um meinen RAM und meinen Flash zu essen. Was schlecht ist.) Und fsck bei jedem Start ausführen (möglicherweise viel Startzeit hinzufügen. Was etwas schlecht ist.). Es scheint allerdings ein bisschen traurig zu sein.

Kennt jemand einen besseren Weg oder ein besseres Dateisystem?

UPDATE: e2fsprogs-libs (Abhängigkeit von jfsutils) scheint in meiner Distribution höllisch schwer zu kompilieren zu sein. Ich werde mich mit ZFS befassen (es ist jedoch nicht in meiner Distribution enthalten. Und es scheint viel zu tun, was ich nicht brauche.)

UPDATE2: Weitere Informationen zu meinem System und meinen Tests: Der SD-Kartenspeicher ist ein sekundärer, optionaler Speicher. Bei den SD-Karten handelt es sich um industrielle microSD-Geräte mit 2 bis 8 GB. Die SD-Karte wird mit einem Befehl mount -t über meinen RC gemountet. Optionen "noatime" aber nicht "sync". Meine Distribution ist ein benutzerdefiniertes uClinux mit Analog Device-Geschmack, einem 3.10-Kernel und einer 1.21-Busybox. Mein primärer Speicher ist ein SPI-Flash mit jffs2. Ich hatte noch nie Probleme damit. Ich weiß nicht einmal, ob eine fsck.jffs2 verfügbar ist. Nand Flash auf der anderen Seite ... aber das ist eine andere Geschichte. Der Zweck der SD-Karte besteht darin, Messdaten zu speichern. Das 'Monitor'-Programm hängt die Ergebnisse an eine Datei an und verfügt über strategische Synchronisierungsplatzierungen. Wenn die Datei eine bestimmte Größe überschreitet, wird eine neue erstellt. Wenn eine bestimmte Anzahl von Dateien erreicht wurde, wird die älteste gelöscht. Wenn die aktuelle Messdatei aufgrund eines Stromausfalls verloren geht, ist dies keine Katastrophe. Die Dateien haben normalerweise eine Größe von 50-100 KB und 1 Ergebnis ist normalerweise 1 KB. Dies ist nur die erste Entwicklungsphase. Nichts ist behoben. Dies ist das erste Mal, dass ich mich mit Nicht-Flash-Dateisystemen in eingebetteten Systemen befasse. (Ich habe ext4 auf meinen x86-Servern.)

Ich habe mit vfat angefangen. Das Standard-Dateisystem. (Ich dachte mir, dass die Fabriken einen Grund haben könnten, sich dafür zu entscheiden. Und wenn die Dinge funktionieren, ist mir das eigentlich egal.) Ich habe noch nie Probleme mit Stromausfällen in meinen eingebetteten vfat-Geräten gesehen. Ich habe jedoch Probleme mit FAT in WinCE. Als mein 'Monitor'-Programm jedoch 100-200 Dateien erreichte, weigerte es sich, weitere zu erstellen. Es scheint, dass FAT ein spezielles Dateilimitproblem im Stammverzeichnis und ein etwas größeres in Unterverzeichnissen hat. Ich muss in der Lage sein, 500-1000 Dateien in 1 Verzeichnis zu erstellen. Vfat geht also nicht.

Dann habe ich zu ext2 gewechselt. Ich habe beim Start allerdings kein fsck eingefügt. (Ich wusste nicht, dass ich das tun musste.) Innerhalb eines Tages konnte mein 'Monitor'-Programm aufgrund eines' Inode Something Something'-Fehlers keine weiteren Dateien erstellen. Katastrophe!

Meine aktuelle Lösung ist ext2 mit einem "e2fsck -y" beim Start. Bisher scheint es vielversprechend. Aber das e2fsck und das ganze Konzept von 'fsck beim Start' nervt mich. Das e2fsck selbst gibt mehr als 350 KB meines primären Flashs und RAMs aus. (Wenn es nicht läuft.) Was bedeutet, dass es mein größtes Programm ist. Es ist größer als eine Busybox. Es konkurriert fast mit meinem Kernel.

Ich habe über ext3 nachgedacht. Es wurden Metadaten aufgezeichnet, die nicht schaden würden. Ich bin mir nicht sicher, wie viel es helfen wird. Mit meinen kleinen Dateien und kontrollierten Synchronisierungen sollte ich abgedeckt sein, denke ich? Es hat eine geordnete Schreibsequenz. Dies bedeutet, dass die Daten auch etwas aufgezeichnet sind. Dies kann jedoch zu nicht deterministischen Verzögerungen führen. Welches ist schlecht in meiner Situation. (Es ist wahrscheinlich kein Problem.) Es gibt auch eine geplante Synchronisierungsfunktion. Z.B. Commit alle 5 Sek. Was meine eigenen Synchronisierungen stört, denke ich. Zu viele Schreibvorgänge sind schlecht für SD-Karten. Sogar industrielle. Ich kann keine Dokumentation zum Deaktivieren finden. Und ext3 erfordert immer noch, dass fsck bei jedem Start ausgeführt wird! Aber ext3 ist immer noch eine Möglichkeit.

Ext4. Behebt viele Leistungsprobleme von ext3. Ich brauche aber keine wirkliche Leistung. Und meine Distribution scheint keine eingebaute mkfs.ext4 und keine fsck.ext4 zu haben. Vielleicht ist das kein Problem. Es könnte aber sein. Z.B. Die e2progs-libs (Abhängigkeit von jfsutils) scheinen viele Kompilierungsprobleme zu haben.

JFS, XFS, BRFSS. Alles unterstützt von meinem Kernel. Derzeit nicht in meiner User Space Toolbox enthalten. Alles scheint ziemlich große, komplexe Systeme zu sein. Und alle scheinen beim Start ein 'fsck'-Äquivalent zu benötigen?

Ich habe auch darüber nachgedacht, mein eigenes Dateisystem zu werfen: Schreiben Sie immer 2 Kopien der Dateitabelle. Beim Durchlaufen wird der mit der richtigen CRC und der neuesten Sequenznummer ausgewählt. Erstellen Sie eine zweistufige Schreibsequenz. Temporär zuweisen, beim Festschreiben korrigieren. Kein fsck nötig. Ich befürchte, dass es ein bisschen naiv sein könnte.

UPDATE3: Übrigens, eingebettete Systeme (zumindest dieses) sind autonom, unbeaufsichtigt, unerreichbar und müssen jahrelang laufen. Programme wie fsck, die möglicherweise menschliche Interaktion erfordern, machen mir Angst.


1
Warum mounten Sie Ihr Dateisystem nicht einfach schreibgeschützt und erstellen ein kleines Dateisystem für alles, in das Sie schreiben möchten?
Chris Down

ZFS könnte auch eine Option sein (gute Datenintegritätsprüfungen).
Ouki

Dies ist das kleine Dateisystem zum Schreiben
Illishar

Ja, ich habe mir auch ZFS angesehen. Die Unterstützung dafür springt mir jedoch nicht gerade ins Gesicht, wenn ich mir meine Distribution ansehe. Und ich bin nicht wirklich besorgt über die Datenintegrität. Ich möchte nur, dass es montiert wird und funktioniert.
Illishar

Haben Sie sich btrfs.wiki.kernel.org/index.php/Main_Page angesehen , sollten Sie Ihre Frage mit Ihren Recherchen bearbeiten, damit wir Ihnen effizienter helfen können
Kiwy

Antworten:


2

In Ihrer Geschichte hier gibt es eine gewisse Inkonsistenz oder zumindest Mehrdeutigkeit:

Ich würde immer noch lieber alles verlieren, als mich einem "nicht in der Lage zu montieren" zu stellen, "warte auf diese 10 Minuten fsck"

Impliziert - obwohl Sie es nicht wirklich sagen -, dass dies ein Problem ist, das Sie tatsächlich haben. Aber dann:

e2fsprogs-libs (Abhängigkeit von jfsutils) scheint in meiner Distribution höllisch schwer zu kompilieren zu sein.

Das heißt, Sie haben überhaupt kein fsck , da e2fsprogs-libses sich um eine Abhängigkeit handelt, für e2fsprogsdie dies vorgesehen ist e2fsck. Vielleicht befinden Sie sich hier noch in der Planungsphase und haben das System beispielsweise noch nicht einmal getestet ext4, sondern sind zu dem Schluss gekommen, dass Sie mit JFS beginnen sollten? Gibt es dafür einen besonderen Grund?

Ich habe beim Himbeer-Pi-Austausch festgestellt (der primäre Speicher des Pi ist auch eine SD-Karte), dass eine beträchtliche Anzahl von Benutzern von Problemen dieser Art sehr frustriert zu sein scheint, obwohl die Mehrheit (einschließlich ich) sie noch nie hatte alle. Zuerst nahm ich an, dass dies Leute waren, die nicht wussten, dass das System sauber heruntergefahren werden sollte, aber das ist nicht schwer zu verstehen, wenn es erklärt wird, und es gibt Leute, die dies melden , obwohl das System ordnungsgemäß heruntergefahren wurde .

Sie haben bereits gesagt, dass Sie dies benötigen, um Stromausfälle tolerieren zu können (was fair genug ist), aber ich erwähne dies, weil dies impliziert, dass es einige Pis oder einige SD-Karten oder eine Kombination aus beiden gibt, für die dies nur anfällig ist Beschädigung des Dateisystems aufgrund eines Ereignisses (Spannungsspitzen?), das regelmäßig auftritt, entweder wenn der Stecker gezogen wird oder wenn er wieder eingesteckt wird. Ich habe es auch NICHT gesehen - und es gab genügend Zeit für viele Leute, es zu versuchen - JEDE Berichte von jemandem, der sagt, er habe zu btrfs oder jfs oder was auch immer gewechselt und jetzt ist das Problem gelöst.

Das andere mysteriöse daran ist, dass selbst wenn Leute an der Schnur ziehen, dies nicht regelmäßig zu einem unbrauchbaren Dateisystem führen sollte. Sicherlich habe ich es ein paar Mal mit dem Pi gemacht und punktet, wenn nicht hunderte Male mit einer normalen Linux-Box (der Strom wurde unterbrochen, das System reagiert nicht mehr, ich bin erschöpft und wütend usw.) und obwohl ich einen geringfügigen Datenverlust gesehen habe, habe ich noch nie ein Dateisystem gesehen, das so beschädigt war, dass es nach einem kurzen fsck unbrauchbar wurde.

Unter der Annahme, dass all diese Berichte wahr sind (ich verstehe nicht, warum die Anzahl der Leute darüber lügen würde), ist wieder viel mehr los, als nur nicht sauber abzumelden, aber es scheint nur einen kleinen Prozentsatz der Benutzer zu betreffen, was wiederum impliziert eine Art häufiger Hardwarefehler.

Auf dem pi schreibe ich -yan /forcefsckin einem Boot - Skript, so dass beim nächsten Start wird ausgeführt werden , automatisch und alle Probleme behoben, und zwar unabhängig davon , ob dies notwendig erscheint oder nicht. Auf einem 700-MHz-Single-Core dauert dies ~ 10 Sekunden für ein 12-GB-Dateisystem mit ~ 4 GB Daten. "10 Minuten" klingt also nach einer unglaublich langen Zeit, zumal Sie bereits gesagt haben "Dies ist das kleine Dateisystem zum Schreiben!".

Sie können auch syncin regelmäßigen Abständen anrufen .

Schließlich sollten Sie die Frage mit sachlicheren, spezifischeren Details der tatsächlich aufgetretenen Probleme und weniger Übertreibung aktualisieren . Andernfalls sieht es einfach zu sehr nach einem vorzeitigen XY-Problem aus , das wahrscheinlich von Leuten mit viel Erfahrung und potenziellen Ratschlägen für Sie schnell übersprungen wird.


Tatsächlich kann mein e2fsck ohne die Abhängigkeit von e2fsprogs-libs kompilieren. Darüber habe ich mich auch gewundert. (Es ist nicht die Busybox-Version.) Aber ich würde es vorziehen, sie überhaupt nicht zu haben ... Ich werde die Frage mit einigen weiteren Informationen aktualisieren.
Illishar

Ich bin nur überrascht, dass es ohne libext2fs funktioniert (oder haben Sie eine statische Version erstellt? Oder ist dies nur eine Frage der unterschiedlichen Verpackung? Jedenfalls ...). Ich würde mich wegen des verbesserten Journalling und der schnelleren fsck-Überprüfung , falls möglich, und möglicherweise wegen der syncMount-Option für ext4 gegenüber ext2 entscheiden . Während dies und das Journaling Ihre Schreibzyklen verlängern, ist es schwer zu erkennen, wie ein alternatives Dateisystem (z. B. ein theoretisches, das Online-Überprüfungen durchführt) die Notwendigkeit umgehen kann, mehr oder weniger dasselbe zu tun, wenn Robustheit das Ziel ist. Viel Glück und wenn Sie eine Lösung finden, fügen Sie Ihre Antwort hinzu.
Goldlöckchen

2

Das Programm muss weitergehen!

Nun, dies ist eine häufige Anforderung und Linux-Systeme sind die beste Wahl, wenn es um die Auswahl eines stabilen Systems geht.

Ihre Bemühungen scheinen auch nicht in die richtige Richtung zu gehen. Was können Sie jedoch tun, um ein stabiles System zu erhalten?

In der ersten Ebene können Sie Ihr Dateisystem verbessern:

  • Verwendung yournal_data_orderedin einem ext3/ext4Dateisystem beim Erstellen oder Ändern mit tune2fs.
  • Bei JFSVerwendung --replay_journal_onlybei der Überprüfung.
  • FSCKFIX=yesAktivieren Sie die automatische Reparatur, indem Sie die Initscripts festlegen.

Wenn dies nicht ausreicht, können Sie Ihr System starten, ohne die fehlerhafte Festplatte zu mounten. Erstellen ramdiskSie stattdessen eine neue, während Sie Ihre fehlerhafte Festplatte manuell überprüfen und reparieren. Dies kann auch durch Skripte automatisiert werden.

In der nächsten Stufe müssen Sie Ihr eingebettetes System verlassen und einige Themen zur Hochverfügbarkeit lesen


Für das Initscript ist die automatische Überprüfung etwas, das das OP vermeiden möchte. Das Dateisystem müsste also die Online-Überprüfung des Dateisystems unterstützen.
Bratchley

1
mit yournal_data_orderedoder replay_journal_onlyes dauert nur Sekunden zu überprüfen, das ist der Unterschied.

1
Ja bitte. Kennen Sie ein Dateisystem, das die Online-Überprüfung unterstützt?
Illishar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.