ブロックデバイスとして検出されるコンパクトフラッシュカードがあります/dev/sdb
。 FAT16パーティションがあります。 FAT16ファイルシステムをマウントし、umount
ファイルシステムとファイルシステムに何かを書き込むと、実際のファイル書き込みは次の場所で行われますumount
。
# mount | grep sdb
/dev/sdb1 on /media type vfat (rw)
# time cp image.bin /media/
real 0m0.179s
user 0m0.000s
sys 0m0.104s
# time umount /media
real 0m18.185s
user 0m0.004s
sys 0m0.032s
#
USBフラッシュドライブでも同様の動作を見たことがあります。ファイルがファイルシステムに即座に書き込まれるのか、ファイルシステムの分離中に書き込まれるのかはどのように決定しますか?
答え1
ファイル同期がオンになっている場合、またはファイルシステムが同期オプションでマウントされている場合、書き込みはすぐに完了します。
これは通常システム全体のパフォーマンスには悪いため、書き込み呼び出しが返されたときに重要なデータをストレージデバイスにコミットする必要がある場合にのみこれを実行してください。ファイルコピーは重要とは見なされないため、カーネルバッファは内部で書き込み、データを定期的にメディアにフラッシュします。
sync
次のコマンドを使用して、オペレーティングシステムにこれらのすべてのキャッシュをフラッシュするように要求できます。
答え2
カーネルはメモリにデータをキャッシュします。読むデータが重要です(誰かがこれを待っています)。書くゆっくりと実行できます(誰も急いではなく、データを再利用/再修正できます)。デバイスは同時に読み書きできるので、できるだけ長く書き込みを延期することをお勧めします。したがって、データは、エスケープがない場合にのみ(スペースが必要な場合)カーネルによって「自発的に」記録されます。今)。ファイルを同期的に開き(変更が発生したらすぐに書き込み)、ファイルを呼び出してデータをfsync(2)
強制的に出力することで、カーネルが強制的に動作するようにできます。デバイスをマウント解除するときは、そのデバイス用にキャッシュされたすべてのデータを明確に事前に記録する必要があります。
上記は、機械がいつでもクラッシュして記録されていない多くのデータを残す可能性があるため、不気味になります。したがって、sync(1)
カーネルにキャッシュされたすべてのファイルデータを書き込むプログラムがあります。上記のように、データの損失を防ぐために、通常は定期的に(通常5秒ごとに)実行されるように設定されています。ディストリビューションの設定や調整方法を正確に確認するには、ディストリビューションのマニュアルを確認する必要があります。