Warum haben zwei synchronisierte Verzeichnishierarchien unterschiedliche Größen?

7

Ich verwende rsync, um zwei Ordner zu synchronisieren

rsync -arzv --times --delete-after --relative -e ssh user@host:path/./media/ ~/path/

und es heißt, alles ist gut, aber das Ziel berichtet:

$ du -s path/media/
18335196    site_media/media/

und die Quellenberichte:

$ du -s path/media/
18473500        site_media/media/

Wenn ich mich mit dem Problem befasse, haben alle Dateien die gleiche Größe, aber die Verzeichnisse unterscheiden sich in der Größe. Warum? Beide sind Ubuntu von VM, die Quelle ist am 11.04 und das Ziel ist am 12.04 LTS

Ich verstehe, warum sie nicht die gleichen Zahlen ergeben. Ich möchte verstehen, warum die Ordner unterschiedliche Größen angeben.

Bootscodierer
quelle

Antworten:

4

Da es sich um zwei verschiedene VMs handelt, auf denen verschiedene Hauptversionen von Ubuntu ausgeführt werden, würde ich vermuten, dass die Blockgröße des Dateisystems der Schuldige ist. duGibt an, wie viel von der Festplatte verwendet wird, nicht die Summe der Dateigrößen. Eine subtile, aber wichtige Unterscheidung.

Wenn Sie eine Datei mit einer Größe von 1 Byte und einer Blockgröße von 1 KB haben, wird 1 duKB als verwendet gemeldet. Wenn die Blockgröße 4 KB beträgt, werden die verwendeten 4 KB gemeldet. Wenn diese Datei 1025B groß ist, werden 2 KB für die Blockgröße von 1 KB und 4 KB für die Blockgröße von 4 KB gemeldet. Wenn die Datei 4097B groß ist, wird sie bei der Blockgröße von 1 KB als 5 KB und bei der Blockgröße von 4 KB als 8 KB gemeldet.

Diese Sequenz demonstriert dieses Verhalten:

$ touch foo ; du -h foo
  0B    foo
$ echo -n 1 > foo ; du -h foo
4.0K    foo

Verwenden Sie diesen Befehl, um die Blockgröße Ihrer Dateisysteme anzuzeigen:

tune2fs -l /dev/sda1 | grep -i 'block size'

(Offensichtlich durch /dev/sda1das entsprechende Blockgerät ersetzen .)

Wenn es anders ist, gibt es Ihre Diskrepanz.

Eine bessere Möglichkeit, die Richtigkeit zu überprüfen, rsyncbesteht darin, Ihre Dateien zu hashen und zu vergleichen. Hier ist ein Beispiel:

find path/media -exec openssl sha1 {} + | sort > ~/hashes

Dann diffdie hashesDateien.

Bahamat
quelle
2

Es gibt viele Ursachen für Unterschiede bei der Verwendung du. Überprüfen Sie manals Referenz. Ich habe ein solches Problem auch bei aix gesehen. Im Handbuch gibt es eine Option --apparent-size, die diese Unterschiede recht gut beschreibt. Beachten Sie auch die Blockgröße, für die die Größe berechnet wird du(Standard ist 1024 Byte, kann jedoch je nach System variieren). Sie müssen damit mit einem Befehl fertig werden, der die genaue Größe der Dateien ( lsoder find) anzeigt. So habe ich das gelöst.

Iľja
quelle
1

Eine andere Möglichkeit ist, dass rsyncdas --archiveFlag standardmäßig keine Hardlinks beibehält. Wenn Sie Hardlinks verwenden, könnte dies auch Ihr Problem sein.

Allmächtige Entität
quelle
0

Die Chancen stehen gut, dass Sie schon lange Dateien in Ihren Verzeichnissen hinzufügen und löschen. Der Speicherplatz aus nicht verknüpften Dateien in einem Verzeichnis wird recycelt, aber möglicherweise können zukünftige Ergänzungen diesen freien Speicherplatz nicht direkt nutzen.

Ich nehme an, Sie haben nicht alle Dateiverknüpfungen und Verknüpfungen gespiegelt, die jemals stattgefunden haben - es wäre für die Quelle leicht, zehn- oder zwanzigmal mehr Dateien verknüpft und nicht verknüpft zu haben als das Ziel - und das Ziel ist daher nicht so fragmentiert.

Wenn Sie einige sehr komplizierte Verzeichnis-Calisthenics durchführen, können Sie möglicherweise die Größe der Verzeichnisse in der Quelle reduzieren. es würde ungefähr so ​​aussehen:

mkdir foo
mv media/* foo
rmdir media
mv foo media

Beachten Sie, dass dies nicht annähernd genug Speicherplatz spart, damit es sich lohnt. Es ist nur ein lustiges Spielzeug, wenn das ...

Sarnold
quelle
1
Hilft das Verschieben eines Verzeichnisses im selben Dateisystem? AFAIK, in diesem Fall werden nur Zuordnungstabelleneinträge geändert. Wenn ich Dateien in einem Verzeichnis defragmentieren wollte, würde ich stattdessen eine Kopie erstellen.
Iľja