Hallo zusammen,
ich entwickele momentan diverse Skripts für eine Backup-Lösung basierend auf einem 10.04.4 Server. Der Server fährt nachts automatisch hoch, bindet diverse Freigaben eines Windows 2003 SBS per CIFS ein und sichert diese mit rsnapshot.
Der nächste Schritt sind nun semi-automatische "Backups vom Backup" für weitere Redundanz und räumliche Trennung: Wird eine externe Festplatte per USB an den Server gesteckt, wird ein per udev-Regel angestoßenes Shellscript gestartet und synchronisiert daily.0 (den aktuellen rsnapshot-Datenbestand) per rsync mit der externen Platte:
rsync -vrtl --delete /pfad/zur/sicherung/daily.0/ /media/externe_platte_1/backup
Anschließend erstellt das Skript per
du -b -a /entsprechendes/verzeichnis | sed -f /logverzeichnis/backup_sed_list.sed | sort -g > /logverzeichnis/entsprechendes_logfile.txt
jeweils für den internen als auch den externen (soeben synchronisierten) Datenbestand eine Liste der Dateigrößen, entfernt dabei die überflüssigen/abweichenden Verzeichnisse/Pfade (z.B. die Abweichung zwischen "/home/user/backup/daily.0" und "/media/externe_platte/backup") per sed (mit zuvor generierter Regel-Datei) und sortiert das Ganze. Anschließend wird ein diff dieser beiden Listen erstellt.
Das Dateisystem ist sowohl intern als auch extern ext4, somit würde ich hier erwarten, dass beide Listen identisch sind.
Genau hier ergibt sich allerdings eine Abweichung bei der ich mir nicht sicher bin, ob das ein Problem ist bzw. wieso dies auftritt:
Der Datenbestand umfasst momentan insgesamt 387.126 Dateien in 11.277 Verzeichnissen. Die Größen sämtlicher Dateien sind identisch, die Größe von momentan insgesamt 100 Verzeichnissen unterscheiden sich soweit ich das sehe immer um 4.096 Byte oder ein Vielfaches davon. Ein Muster der betroffenen Verzeichnisse ist für mich hier nicht erkennbar.
ls -la ergibt in einem dieser Fälle z.B. folgendes:
Lokal:
insgesamt 48 dr-xr-xr-x 7 root root 4096 2010-11-28 17:54 . drwxr-xr-x 12 root root 4096 2012-02-21 17:27 .. dr-xr-xr-x 4 root root 4096 2010-07-08 18:02 apache_docroot dr-xr-xr-x 3 root root 4096 2009-08-08 15:47 egroupware_files dr-xr-xr-x 7 root root 4096 2009-12-16 15:34 ftp dr-xr-xr-x 2 root root 24576 2012-02-24 23:40 mysql_dumps dr-xr-xr-x 4 root root 4096 2009-09-06 17:51 svn_repositories
Extern:
insgesamt 52 dr-xr-xr-x 7 root root 4096 2010-11-28 17:54 . drwxr-xr-x 12 root root 4096 2012-02-21 17:27 .. dr-xr-xr-x 4 root root 4096 2010-07-08 18:02 apache_docroot dr-xr-xr-x 3 root root 4096 2009-08-08 15:47 egroupware_files dr-xr-xr-x 7 root root 4096 2009-12-16 15:34 ftp dr-xr-xr-x 2 root root 28672 2012-02-24 23:40 mysql_dumps dr-xr-xr-x 4 root root 4096 2009-09-06 17:51 svn_repositories
(PS: Was ich noch nicht herausfinden konnte: Was zählt "insgesamt"?)
Das Verzeichnis "mysql_dumps" ist auf der externen Platte also 4.096 Byte größer als im lokalen Dateisystem - die Dateien in diesem Verzeichnis haben absolut identische Größen, abgesehen von "." darin, die als Hardlink auf das eigene Verzeichnis wiederum die entsprechenden 4.096 Byte größer ist.
rsync scheint sich daran übrigens nicht zu stören: Führt man es mehrmals nacheinander aus, werden die Verzeichnisgrößen offenbar ignoriert - die Daten werden nicht nochmals kopiert.
Worauf bezieht sich diese "Verzeichnisgröße" überhaupt genau? Und wieso weicht Sie bei einer Kopie von ext4 auf ext4 manchmal ab? Das kann doch nur irgendetwas mit Inodes/Blockgrößen/überlappenden Blöcken/Sektoren etc. zu tun haben?
Gruß
Christian
/EDIT:
Ein paar Infos habe ich mittlerweile noch ergoogeln können:
Die Verzeichnisgröße ist in der Regel (ext2/3/4) initial ein Block = 4K = 4.096 Byte und wird ggf. erweitert/vergrößert, falls mehr Platz zur Speicherung von Informationen zu den sich darin befindlichen Dateien (Anzahl, Namen) benötigt wird. Weiterhin wird dieser allozierte Speicherplatz niemals kleiner, d.h. wenn ein Verzeichnis zu einem Zeitpunkt z.B. einige tausend Dateien mit langen Dateinamen enthielt und man diese später wieder löscht, behält das Verzeichnis trotzdem die vorher benötigten 4K-Blöcke reserviert. Nur beim Löschen und neu Anlegen eines Verzeichnisses wird wieder die initiale Größe von in der Regel 4K verwendet.
Gesetzt folgenden Fall:
Ein lokales Verzeichnis wird angelegt und 100.000 Dateien mit langen Dateinamen hineinkopiert. Dieses Verzeichnis (bzw. der benötigte Speicherplatz für die Informationen zum Inhalt) ist anstatt initial 4.096 Bytes nun 16.384 Bytes (4 x 4K-Blöcke, nehmen wir jetzt einfach mal so an) groß. Nun werden 99.999 Dateien in diesem Verzeichnis gelöscht - die Verzeichnisgröße bleibt 16K. Anschließend wird dieses Verzeichnis von A nach B kopiert.
Hier würde es Sinn machen, dass die Verzeichnisgröße in B wieder nur die initialen 4K beträgt, da das Verzeichnis neu angelegt wird und nur eine einzige Datei enthält, für deren Informationen ein Block locker ausreicht.
Bei mir ist es allerdings andersherum: Die Verzeichnisse werden größer...