ddがキャッシュしない、またはキャッシュから読み取らないように強制

ddがキャッシュしない、またはキャッシュから読み取らないように強制

私はddのbusyboxバージョンを使用して組み込みシステムを開発しています。一部の外部ユーティリティでドライブの消去をテストしようとしていますが、ddが消去した後にディスクから読み取らずにキャッシュされたデータを表示します。

最初のddを実行し、データを見て、システムを再起動してキャッシュをフラッシュして消去し、ddを再実行したときに結果がすべて0であったため、ddに絞り込みました。

ただし、工場出荷時の設定でddを実行し、ドライブを消去してから再起動せずにddを実行すると、再起動するまでゼロはすべて表示されません。

ddがnocacheフラグと一緒にiflag optをサポートしているというGNUのマニュアルページを読んでいますが、busyboxはそのオプションをサポートしていないので不可能です。

私の質問は、ddにキャッシュの代わりにディスクから再度読み込むように強制する方法です。

答え1

@sendmoreinfoの答えに基づいて:

dd if=/dev/device iflag=direct bs=1M

読み取りキャッシュには影響しません。

答え2

あなたは試すことができます

sync
echo 3 > /proc/sys/vm/drop_caches

さまざまなキャッシュを削除します。

/usr/src/linux/Documentation/sysctl/vm.txt詳細よりdrop_caches

注:問題はiflag=direct当時サポートされていないbusybox ddに関するものです。 busybox v1.33.0(2020-12-29)に追加されました。busybox dd: O_DIRECT I/O サポート。使用例については他の回答をご覧ください。

答え3

iflag=direct 回答の小さなハイライトも進行状況バーを提供します。

dd iflag=direct if=~/source.iso | pv | dd oflag=direct of=/dev/sdb bs=8M

iflag / oflagがない場合、pvは完了したと報告してから停止しているように見えますが、デバイスのddはまだキャッシュ内で動作しています。

答え4

直接I / O(オープンモードO_DIRECT)は機能するはずですが、カーネルお​​よび/またはddそれをサポートしていない可能性があります。

関連情報