なぜデータが書き込まれるまでddが待機しないのですか?


20

時々、画像をフラッシュドライブに書き込むと、次のようになります。

$ 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が点滅し始めます)。

なぜこれが起こるのですか?


3
/dev/sdcシステムに実際のデバイスがあり、ファイルに書き込んでいないのは確かです/dev/sdcか?デバイスを使用する場合はls --color /dev- /dev/sdc黄色にする必要があります。
ローレンス

回答:


21

代わりにこれを使用してください:

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が発行されると、データはすぐにキャッシュに書き込まれ、書き込み完了ステータスがプロセスに送信されます。バッファが必要なとき、またはバスに空き時間があれば、データはキャッシュからハードディスクに書き込まれます。


1
あなたの答えと私の答えがほぼ完全に異なるアプローチをカバーしているのが好きです。いいですね、+ 1。
ChrisInEdmonton

1
@ChrisInEdmonton dito +1
カオス

この質問ではすべての回答が適切です。
フランシスコタピア

@chaos明確にするために:これはカーネルのデフォルトの動作です。- 何もキャッシュしないconv=fsyncようにブロックデバイスに書き込むとき、それがデフォルトであるということddですか?これに対する良い答えを探して:unix.stackexchange.com/questions/312687/...
ジョナサンKomar

10

これは、Linuxおよび他のほとんどのオペレーティングシステムが読み取りと書き込みの両方をキャッシュするために発生します。ほとんどの場合、これにより、オペレーティングシステムの応答性が向上します。

キャッシュされたデータが書き込まれたことを確認する場合はsync、ご存じのようにを使用します。Linuxは、調整可能な多数の設定を公開しています。この記事では、いくつかの設定の概要を説明します。たとえば、vm.dirty_background_bytesを0に設定して、カーネルがフラッシャースレッドをすぐに開始するようにすることができます。


7

sync(8)-Linux manページ

カーネルは、データをメモリに保持して、ディスクの読み取りと書き込みを(比較的遅い)行わないようにします。これによりパフォーマンスが向上しますが、コンピューターがクラッシュすると、データが失われたり、ファイルシステムが破損する可能性があります。同期により、メモリ内のすべてがディスクに書き込まれます。

注:(unmountまたはイジェクト)sync通常のファイルシステムの使用でこれを「隠す」コールを自動的に呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.