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.