Wie erhalte ich die physische (synchronisierte) Festplattennutzung, ohne den Systemcache zu berücksichtigen?

Wie erhalte ich die physische (synchronisierte) Festplattennutzung, ohne den Systemcache zu berücksichtigen?

Ich verwende es, duum kontinuierlich die Datenmenge zu überwachen, die auf die von mir duplizierten USB-Laufwerke geschrieben wird.

Ich vergleiche die Festplattennutzung von Quell- und Ziellaufwerken und zeige dem Benutzer den Kopierfortschritt an.

Das Problem besteht darin, dass dugemeldet wird, dass auf dem Ziellaufwerk 100 % Daten vorhanden sind, obwohl ich sehe, dass sich noch viele Daten im Systemcache befinden, die LED des Laufwerks blinkt und die Laufwerke nicht zum Entfernen bereit sind.

Ich führe und nacheinander aus rsync, um sicherzustellen, dass die Daten wirklich da sind, bevor ich den Benutzer das Ziellaufwerk entfernen lasse. Ich kann den Fortschritt jedoch nicht überwachen. Der Benutzer sieht also 100 % lange, bevor die Laufwerke wirklich synchronisiert sind.syncumountsync

Ich würde gerne den „tatsächlichen“ Kopiervorgang überwachen können, denn darauf kommt es an – es hat keinen Sinn, zu sehen, wie eine rsync1 GB große Datei in 25 Sekunden vollständig kopiert wird, während ich weitere 5 Minuten warten muss, während syncdas Ganze auf das Laufwerk geschrieben wird (ich übertreibe, aber Sie verstehen, was ich meine).

So überwache ich rsyncden Fortschritt in einer Schleife für jedes Laufwerk:

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

$PROGRESSist eine Gleitkommazahl zwischen 0 und 1, die das Verhältnis zwischen der Nutzung des Quelllaufwerks und der Nutzung des Ziellaufwerks angibt.

Wie kann ich dies ändern, sodass nur Daten berücksichtigt werden, die bereits mit dem Laufwerk synchronisiert sind und nicht nur im Systemcache warten?

Bearbeiten:

Ich habe festgestellt, dass ddich Schreibvorgänge ausführen kann, ohne den Systemcache zu verwenden. Ich habe einen Test durchgeführt und tatsächlich werden beim Kopieren einer Datei auf diese Weise dutatsächliche Werte gemeldet, und meine Fortschrittsanzeigen sind endlich genau:

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

Dies verwendet den Lesecache, deaktiviert jedoch den Schreibcache, sodass der Vorgang leichter zu verfolgen ist, ohne dass übermäßige Lesevorgänge ausgeführt werden müssen. Das Problem besteht darin, dass ich die Verzeichnisstruktur manuell neu erstellen muss dd, um stattdessen zu verwenden rsync. Ich muss mich nicht um die Dateiattribute oder Änderungsdaten kümmern.

Ich schätze, ich könnte eine Kombination aus verwenden find, mkdirund ddum zuerst den Verzeichnisbaum neu zu erstellen und dann die Dateien einzeln zu kopieren. Ich frage mich, ob dieser Ansatz irgendwelche Nachteile hat.

Antwort1

Der beste Weg, damit umzugehen, ist anscheinend die Verwendung vondirekte DateiausgabeAuf diese Weise dusind die Messwerte viel genauer.

Leider ist nur dddas möglich, daher müssen wir zwei Probleme umgehen:

  1. ddweiß nicht, was mit Verzeichnissen zu tun ist
  2. ddkann immer nur eine Datei gleichzeitig kopieren

Definieren wir zunächst die Eingabe- und Ausgabeverzeichnisse:

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

Gehen wir nun cdzum Quellverzeichnis, um findrelative Verzeichnisse anzuzeigen, die wir leicht bearbeiten können:

cd "$SOURCE"

Duplizieren Sie den Verzeichnisbaum von $SOURCEnach$TARGET

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

Duplizieren Sie Dateien von $SOURCEbis $TARGETunter Auslassung des Schreibcaches (aber unter Verwendung des Lesecaches!)

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

Dadurch bleiben Dateiänderungszeitpunkte, Eigentümer und andere Attribute nicht erhalten – aber für mich ist das ok.

verwandte Informationen