web-dev-qa-db-ja.com

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

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

最初のddを行ってデータを確認し、システムを再起動してキャッシュをフラッシュし、消去を行った後、ddに絞り込んだ後、もう一度ddを実行したところ、すべてがゼロになりました。

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

私はGNUのマンページで、ddがnolagフラグを指定してiflag optをサポートしていることを読みましたが、busyboxはそのオプションをサポートしていないため、問題外です。

私の質問は、ddをキャッシュからではなくディスクから再度読み取るように強制するにはどうすればよいですか?

23
ardent

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

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

あらゆる種類のキャッシュを削除します。

詳細については、/usr/src/linux/Documentation/sysctl/vm.txtdrop_cachesをご覧ください。

(注:これまでのところiflag=directをまだサポートしていないbusybox ddに関する質問でした。)

11
frostschutz

@sendmoreinfoの答えに基づいて:

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

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

10
Ole Tange

ダイレクトI/O(オープンモードO_DIRECT)は動作するはずですが、カーネルやddがサポートしていない可能性があります。

8
sendmoreinfo

Iflag = directの答えが少し繁栄します。プログレスバーも提供します:

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

Iflag/oflagがないと、pvは終了したと報告し、ハングしたように見えます。しかし、デバイスへのddはまだキャッシュで機能しています。

6
awltux