[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Umgang mit Dubletten
[Thread Prev] | [Thread Next]
- Subject: Re: Umgang mit Dubletten
- From: Raphael Becker <rabe@xxxxxxxxx>
- Date: Thu, 20 Aug 2009 23:24:49 +0200
- To: uugrn@xxxxxxxxxxxxxxx
On Thu, Aug 20, 2009 at 06:47:19PM +0200, Werner Holtfreter wrote: > Also Softlinks! Aber wie? Vielleicht sollte man mehrfach benoetigte > Dateien grundsaetzlich in ein Verzeichnis "SHARED" auslagern, um > unbedachter Loeschung vorzubeugen? Wie waere es mit folgender Idee: Jede Datei, die als "schuetzenswert" gilt wird anhand ihres Contents indexiert, dabei bieten sich Hashverfahren wie md5 oder sha256 an. Dateien bleiben grundsaetzlich da liegen, wo sie logisch hingehoeren, also in eine wie-auch-immer thematische Verzeichnisstruktur, z.B. im Homeverzeichnis. Ein regelmaessig laufender Job durchsucht regelmaeÃ?ig alle relevanten Dateien und speichert dabei je einen Datensatz <hashwert>|<timestamp>|<timestamp>|/pfad/datei in einem Index ab, wobei die Timestamps den Zeitpunkt der Indexierung und den Timestamp der Datei selbst sind. Dieser Index wird z.B. taeglich erneuert und fortgeschrieben. Ein zweiter Job ermittelt nun - pro filesystem - alle Dateien, die noch nicht im Repository liegen. Das Repository besteht aus Dateien, die als Dateiname nur den Wert der Checksumme des Dateiinhalts haben, sortiert in eine Verzeichnishierachie basierend auf den ersten 3 Stellen des Hashwertes. Beispiel: e55d56d38035824cf1e2ead96e7688a72f3dac068d97e98d25fa819349a0cfae /home/rabe/UUGRN/Aufnahmeantrag_UUGRN.pdf Das Basisverzeichnis dieses Repositorys sei ./.repo relativ zu jedem Mointpoint, also zB /.repo /usr/.repo /home/.repo Unterhalb sei das repo nach den ersten 3 Stellen der Checksummen untergliedert, damit nicht zu viele Dateien in einem Verzeichnis liegen, ueber den Daumen gepeilt sind (bei Gleichverteilung) 256 Files pro Hierachieebene sinnvoll. Virtuell sei angenommen, dass /a/bc/abcdef.... eine sinnvolle Verteilung ergaebe, dann wuerde obige Datei als Hardlink unter ./.repo/e/55/e55d56d38035824cf1e2ead96e7688a72f3dac068d97e98d25fa819349a0cfae zum liegen kommen (16*256 = 4096 Verzeichnisse * ca 256 "Dateien pro Verzeichnis" = ca 1Mio Dateien) Der Pruefjob wuerde nun also den aktuellen Index vergleichen mit dem Inhalt des Repositorys und im Repository noch fehlende Checksummen durch Hardlink auf (eine/die) entsprechende Datei "fixieren". Ein vom Index vollkommen unabhaengiger Konsistenzcheck koennte regelmaessig das Repository durchlaufen und fuer alle dort hart verlinkten Dateien deren Content-Checksumme mit dem Dateiname vergleichen und somit modifizierte Dateien im Repository passend umbenennen oder verschieben. Zudem braeuchte man fuer das Backup nur hinzugekommene Dateien im Repository sichern. Wird eine Datei zB aus dem Homeverzeichnis irrtuemlich geloescht oder modifiziert, kann man anhand des aufgezeichneten Index den Hashwert eines Dateinamens zu einem bestimmten Zeitpunkt (oder Zeitraum) ermitteln und kann die fehlende Datei durch einfaches Kopieren aus dem Repository wieder herstellen. Abwandlung: Kommt es auf den Platz nicht an und/oder soll ein zentrales Repository ueber Filesystem- oder Rechnergrenzen hinweg angelegt werden, zB als "ewiges Archiv", kann anstelle der Hardlinks auch eine Kopie angelegt werden. Anhand des Indexes wuerde man dann fehlende Dateien im Repo nicht per Hardlink "sichern", sondern einfach als Kopie. Das haette ausserdem den Effekt, dass das Repository nicht inkonsistent werden *kann* weil die Dateien im Homeverzeichnis ja beim ueberschreiben das Repository nicht direkt beeinflussen, der Pruefjob waere also obsolet. Nebeneffekt: Zeichnet man die Checksummen der Dateien als Dateiname auf, kann man beim Lesen (Recoverytest) des Backups auch unmittelbar pruefen, dass die Daten im Backup fehlerfrei vom Medium gelesen werden koennen bzw. beim Schreiben des Backups vollstaendig und fehlerfrei geschrieben wurden. Denkbar waere, fuer das Backup die einzelnen Dateien mit bzip2 zu packen und entsprechend umzubenennen, etwa e55d56d38035824cf1e2ead96e7688a72f3dac068d97e98d25fa819349a0cfae.bz2 Der Konsistenzcheck muesste hier allerdings die Dateien jeweils entpacken, was natuerlich wesentlich CPU-intensiver ist. Wichtig dafuer ist, dass man fuer die Wiederherstellung einer Datei aus dem Backup den aufgezeichneten Index benoetigt. Denkbar waere, einen (abgeschlossenen) Index selbst als Checksumme in das Repository zu kopieren und das im (aktuellen) Index entsprechend festzuhalten. Zusaetzlich koennte man diese "speziellen" Sicherungen des Indexes durch immutable-Flags ("chattr +r foo" oder "chflags noschg foo") gegen Ueberschreiben, Loeschen etc zu schuetzen und zugleich als Erkennungsmerkmal fuer "diese Datei enthaelt einen Index" zu verwenden. Weitere Methoden zur Signierung oder Verschluesselung von Dateien im Repository seien hier nur erwaehnt aber nicht weiter ausgefuehrt. Zusammengefasst zielt das Ganze darauf ab, dass jede Form von Archiv oder Sicherung auf eine thematische Sortierung verzichten sollte und stattdessen streng anhand von eindeutigen Merkmalen wie Checksummen operieren sollte, wenn moeglich *ausserhalb* der Umgebung, auf der aktiv gearbeitet wird. Nur eine Idee. Achso, Thema Doubletten: Die Treten im Repo nicht auf, koennen aber im Homeverzeichnis entstehen. Aber automatisch darf man sie nicht einfach durch Hardlinks de-duplizieren wenn nicht sicher gestellt ist, dass die Datei Read-Only ist, sonst aendert sich der Inhalt der Datei ungewollt auch fuer andere Stellen (bei Hardlinks). Gruss Raphael -- Raphael Becker <rabe@xxxxxxxxx> http://rabe.uugrn.org/ https://www.xing.com/profile/Raphael_Becker GnuPG: E7B2 1D66 3AF2 EDC7 9828 6D7A 9CDA 3E7B 10CA 9F2D .........|.........|.........|.........|.........|.........|.........|.. -- http://mailman.uugrn.org/mailman/listinfo/uugrn Wiki: http://wiki.uugrn.org/wiki/UUGRN:Mailingliste Archiv: http://lists.uugrn.org/