フラッシュのチャンクでDebian10を実行するシングルボードアプライアンスがあります。 UBIFSが使用され、rorootsとrw/varの2つのボリュームに分割されます。電源の入れ直し/リセットの条件下では、0バイトのファイルになってしまう可能性があることがわかりました。 「設定」は/ var/opt/myAppに保持します。/varのマウントオプションを変更してsync
を含めると、これらのインシデントがなくなるようです。
私は通常のアドバイスが同期よりも非同期が好まれるということを知っていますが、例外が何であるかについての説明がほとんどなく、通常は「通常、しかし常にではありません」で洞窟に入れられます。
別の解決策は、データをディスクに書き込むすべての呼び出しサイトを変更して、ファイルを閉じるときにフラッシュするだけでなく、同期することです(私はPythonで多くのことを行います)。コーディング/完全性のために、sync
としてマウントすることは、作業が少ないように見え、場所に同期ガードを追加することを見逃さないようにしました。
さらに、アプライアンスがUSBサムドライブにデータを保存できるようにします。データが書き込まれた直後にヤンクアウトされたときの損失を減らすために、これらの同期もマウントする必要があると思います。
これは、sync
の使用を正当化するのに適した例外的な構成ですか?または、別のソリューションを使用する必要がありますか?
これが私の意見です:事前に冗長性をお詫びします。
特にubifs
について話しているときは、常にsync
/同様のオプションのいずれかを使用する必要があります。
ubifs
はwrite-back caching
をサポートします
つまり、ファイルに書き込まれた変更は直接フラッシュされません。それらは最初にページキャッシュに保存され、後でフラッシュに書き込まれます。 (UBIFSのNANDフラッシュのwrite buffers
の詳細を読む)
これにより、書き込み回数が減り、ファイルシステムのパフォーマンスが向上します。
これはfsのasynchronous
動作であることに注意してください。
質問で述べたように、-syncオプションを指定してUBIFSをマウントすると、ファイルシステムがsynchronous
になります(変更は毎回フラッシュに書き込まれます)が、パフォーマンスが低下します。
Ubifsのようなasynchronous
ファイルシステムを使用している場合、書き込みがフラッシュに書き込まれるようにする責任はアプリケーション開発者にあります。 write(2)のmanページの内容は次のとおりです。
$ man 2 write
NOTES
A successful return from write() does not make any guarantee that data
has been committed to disk. In fact, on some buggy implementations, it
does not even guarantee that space has successfully been reserved for
the data. The only way to be sure is to call fsync(2) after you are
done writing all your data.
使用する
sync
-fs全体を同期します。最適ではないかもしれません
fsync
-主に仕事をします
fdatasync
-メタデータ(権限)ではなく、データの変更のみがフラッシュされます。 fsync
よりも最適かもしれません(わからない)
また読む fsyncについてよく読む
したがって、最後に、あなたのオプション:
sync
オプションを使用してアプリケーションを改善します。最後に考えたのは、jffs2
のような同期fsに切り替えたいかもしれません(ただし、NANDフラッシュを使用している場合は完全に同期していません)。私はこれがあなたの質問への答えではないことを知っていますが、ええと、これを書いた方がいいかもしれません。