フラッシュドライブに画像を書き込むと、次のことが発生することがあります。
$ Sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s
基本的に、Linuxはすべてをキャッシュし、何も書き込まず、dd
は終了します。 sync
と入力すると、データの書き込みが開始されます(フラッシュドライブのLEDが点滅し始めます)。
なぜこれが起こるのですか?
代わりにこれを使用してください:
_Sudo dd if=install57.fs of=/dev/sdc conv=fsync
_
これにより、システムコールのたびに fsync()
が呼び出されます write()
。これにより、dd
は何もキャッシュしなくなります。 fsync(_man 2 fsync
_)のマンページのこの部分を参照してください。
_fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache
pages for) the file referred to by the file descriptor fd to the disk device (or other
permanent storage device) where that file resides. The call blocks until the device reports
that the transfer has completed. It also flushes metadata information associated with the
file (see stat(2)).
_
これはカーネルのデフォルトの動作です。 Linuxカーネルは、次のように書き込みキャッシュと読み取りキャッシュを管理します。write()
syscallが発行されると、データはすぐにキャッシュに書き込まれ、書き込み完了ステータスがプロセスに送信されます。バッファが必要な場合、またはバスに空き時間がある場合、データはキャッシュからハードディスクに書き込まれます。
これは、Linuxおよび他のほとんどのオペレーティングシステムが読み取りと書き込みの両方をキャッシュするために発生します。ほとんどの場合、これによりオペレーティングシステムの応答性が向上します。
キャッシュされたデータが確実に書き込まれるようにする場合は、ご存知のとおり、sync
を使用します。 Linuxは、調整可能なかなりの数の設定を公開しています。 この記事 は、いくつかの設定の概要を示します。たとえば、vm.dirty_background_bytesを0に設定して、カーネルがフラッシャースレッドをすぐに開始できるようにすることができます。
カーネルは、(比較的遅い)ディスクの読み取りと書き込みを回避するために、データをメモリに保持します。これによりパフォーマンスは向上しますが、コンピューターがクラッシュすると、データが失われたり、ファイルシステムが破損したりする可能性があります。同期により、メモリ内のすべてがディスクに書き込まれます。
注:unmount
(またはイジェクト)は自動的にsync
を呼び出し、通常のファイルシステムの使用ではこれを「非表示」にします。