システム キャッシュを無視して、物理 (同期) ディスクの使用状況を取得するにはどうすればよいですか?

システム キャッシュを無視して、物理 (同期) ディスクの使用状況を取得するにはどうすればよいですか?

du複製している USB ドライブに書き込まれるデータの量を継続的に監視するために使用しています。

ソース ドライブとターゲット ドライブのディスク使用量を比較し、コピーの進行状況をユーザーに表示します。

問題は、duシステム キャッシュにはまだ大量のデータが残っており、ドライブの LED が点滅していて、ドライブを取り外す準備ができていないにもかかわらず、ターゲット ドライブに 100% のデータが存在すると報告されることです。

ユーザーがターゲット ドライブを削除できるようにする前に、データが実際に存在することを確認するために、、を順番に実行します。ただしrsync、進行状況を監視することはできません。そのため、ドライブが実際に同期されるずっと前に、ユーザーには 100% が表示されます。syncumountsync

本当に重要なのは「実際の」コピーの進行状況を監視できることです。1 rsyncGB のファイルを 25 秒で完全にコピーするのを見ても意味がありません。そのファイルをドライブにフラッシュするのにさらに 5 分待たなければなりませんsync(誇張していますが、意味はわかります)。

rsync各ドライブの進行状況をループで監視する方法は次のとおりです。

PROGRESS="$(echo "$(du -s "/MEDIA/TARGET" 2>/dev/null  | cut -f 1) / $(du -s "/MEDIA/SOURCE" 2>/dev/null | cut -f 1) " | bc -l)"

$PROGRESS0 から 1 までの浮動小数点数で、ソース ドライブの使用率とターゲット ドライブの使用率の比率を示します。

システム キャッシュで待機しているデータだけでなく、すでにドライブに同期されているデータのみを考慮するようにこれを変更するにはどうすればよいですか?

編集:

ddシステム キャッシュを省略して書き込みを実行できることが分かりました。テストを行ったところ、実際にこの方法でファイルをコピーするとdu実際の値が報告され、進行状況の表示が最終的に正確になりました。

dd if=/media/SOURCE/file of=/media/TARGET/file bs=4M oflag=direct

これは読み取りキャッシュを使用しますが、書き込みキャッシュを無効にしているため、過剰な読み取りを実行せずにプロセスを追跡しやすくなります。問題は、 のdd代わりに を使用するには、rsyncディレクトリ構造を手動で再作成する必要があることです。ファイル属性や変更日を考慮する必要はありません。

、 、を組み合わせて、まずディレクトリ ツリーを再作成し、次にファイルを 1 つずつコピーできると思いますfind。この方法には欠点があるのでしょうか?mkdirdd

答え1

これに対処する最善の方法は、直接ファイル出力こうすることで、du読み取り値がより正確になります。

残念ながら、それだけしかdd許可されていないため、次の 2 つの問題を回避する必要があります。

  1. ddディレクトリをどう扱えばよいかわからない
  2. dd一度にコピーできるファイルは1つだけです

まず、入力ディレクトリと出力ディレクトリを定義しましょう。

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

cd次に、ソース ディレクトリに移動して、find簡単に操作できる相対ディレクトリを報告します。

cd "$SOURCE"

ディレクトリツリーをからに複製し$SOURCEます$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

$SOURCE書き込みキャッシュを省略してからにファイルを複製します$TARGET(ただし、読み取りキャッシュは利用します)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

これによって、ファイルの変更時刻、所有権、その他の属性は保持されませんが、私にとっては問題ありません。

関連情報