Linuxでパーティション/ドライブのブロックキャッシュコンテンツを削除する方法は?

Linuxでパーティション/ドライブのブロックキャッシュコンテンツを削除する方法は?

(スタックオーバーフローから移動しました。)

複数のファイルをUSBフラッシュドライブにコピーする簡単なバックアッププロセスがあります。フラッシュドライブを再読み込みし、元のファイルと比較してコピーが成功したことを確認したいと思います。もう一度読むと、Linuxがキャッシュしたデータだけを返すのではなく、フラッシュドライブを読み取っていることを確認したいと思います。 (フラッシュドライブに内部キャッシュがあることをお勧めしますが、心配しません。)Linuxが特定のファイルシステム(または特定のドライブパーティション)に関するキャッシュされた情報を削除するようにプログラムでどのように保証できますか? (フラッシュドライブをマウント解除し、物理的に取り外して再挿入することはできますが、プログラム的な解決策を好みます。)

現在、ファイルシステムをアンマウントしてマウントしています。これにより、Linuxは「ファイルごとに」構成されたキャッシュデータを削除することが予想されます。ただし、これに影響されない「パーティション別」または「デバイス別」で構成される低レベルのブロックキャッシュがある可能性があります。

私は知っていますが、echo N >/proc/sys/vm/drop_cachesこれはすべてのファイルシステムのキャッシュブロックを削除します。これは必要以上に広く、他のファイルシステムでパフォーマンスの低下を引き起こす可能性があります。

これにはうまく機能するblockdevコマンドがありますが、キャッシュを削除するオプションはありません(Linux 5.17.12に準拠)。 (でも、--flushbufs私には必要ではありません。)

答え1

以下は考えられる解決策ですが、理想的ではありません。以前のバージョンのバックアッププロセスにより、バックアップ中のファイルツリーに対してISO 9660ファイルが作成されたことがわかりました。dd oflag=directブロックがキャッシュに保存されないように、次のコマンドを使用してISOをバックアップメディアにコピーできます。その後、利用可能なバックアップを確認するには、cmpメディアからブロックを読み取る必要があります。 ISOファイルをどこかにマウントすると、ツリー内の個々のファイルにアクセスできます。

書き込みはキャッシュを迂回するため、ドライブの「摩耗」を減らすために、一括書き込みにカーネルの巧妙なアルゴリズムを利用できない場合があります。これは、作成されたページ全体を含むブロックを転送すると回避できるようです。フラッシュドライブの書き込みページは通常64kiB以下であるため、dd bs=128K数年間持続するのに十分です。

そしてddテール部分ブロックもちゃんとコピーされたようです。

cp直接書き込みオプションがないようです。

関連情報