Angenommen, ich mounte einen Cloud-Speicher (in meinem Fall Amazon Cloud Drive) mit einem FUSE-Client unter /mnt/cloud
. Da das direkte Lesen und Schreiben von Dateien /mnt/cloud
über das Internet langsam ist, möchte ich die Dateien, aus denen ich lese und die ich schreibe, im Cloud-Speicher zwischenspeichern. Da ich möglicherweise viele Daten gleichzeitig schreibe, sollte sich der Cache auf meiner Festplatte und nicht im RAM befinden. Ich möchte jedoch nicht den gesamten Cloud-Speicher auf meiner Festplatte replizieren, da meine Festplatte möglicherweise zu klein ist.
Ich möchte also eine zwischengespeicherte Ansicht in /mnt/cloud
mount at haben /mnt/cloud_cache
, die einen anderen Pfad verwendet, /var/cache/cloud
beispielsweise als Caching-Speicherort.
Wenn ich jetzt lese /mnt/cloud_cache/file
, soll Folgendes passieren:
Überprüfen Sie, ob file
um zwischengespeichert ist /var/cache/cloud/file
.
- Wenn zwischengespeichert: Check-
file
in-Cache ist aktuell, indem Modtime und / oder Checksumme von abgerufen werden/mnt/cloud
. Wenn es aktuell ist, servieren Sie die Datei aus dem Cache, andernfalls fahren Sie mit Schritt 2 fort. - Wenn nicht zwischengespeichert oder Cache - out-of-date: Kopieren
/mnt/cloud/file
auf/var/cache/cloud/file
und serviert es aus dem Cache.
Wenn ich schreibe, /mnt/cloud_cache/file
soll das passieren:
- Schreiben Sie
/var/cache/cloud/file
in ein Tagebuch,file
in das zurückgeschrieben werden muss , und zeichnen Sie es auf/mnt/cloud
- Warten Sie,
/var/cache/cloud/file
bis das Schreiben abgeschlossen ist und / oder vorherige Zurückschreiben/mnt/cloud
abgeschlossen ist - Kopieren
/var/cache/cloud/file
nach/mnt/cloud
Ich habe die folgenden Anforderungen und Einschränkungen:
- Kostenlos und Open Source
- Möglichkeit zum Festlegen eines beliebigen Cache-Speicherorts
- Möglichkeit zum Zwischenspeichern eines beliebigen Speicherorts (wahrscheinlich ein FUSE-Mount-Punkt)
- Transparentes Caching, dh using,
/mnt/cloud_cache
ist für den Caching-Mechanismus transparent und funktioniert wie jedes andere gemountete Dateisystem - Aufzeichnen, was zurückgeschrieben werden muss (im Cache werden möglicherweise viele Daten abgelegt, die im Laufe der Tage an den ursprünglichen Speicherort zurückgeschrieben werden müssen)
- Automatisches Löschen von zwischengespeicherten Dateien, die zurückgeschrieben wurden oder auf die seit einiger Zeit nicht mehr zugegriffen wurde
- Konsistenz (dh das Reflektieren von externen Änderungen an
/mnt/cloud
) ist nicht besonders wichtig, da wahrscheinlich immer nur ein Client gleichzeitig darauf zugreift/mnt/cloud
, aber es wäre schön, wenn dies geschehen würde.
Ich habe einige Zeit damit verbracht, nach vorhandenen Lösungen zu suchen, aber nichts Befriedigendes gefunden.
- FS-Cache und CacheFS ( https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt ) scheinen nur mit
nfs
oderafs
Dateisystemen zu funktionieren, und ich weiß nicht, wie ich eine andere FUSE-Datei zwischenspeichern soll System oder ein beliebiges allgemeines Verzeichnis. - bcache ( https://bcache.evilpiepirate.org/ ) scheint nur mit Blockgeräten zu funktionieren, dh es konnte kein anderes FUSE-Dateisystem zwischengespeichert werden
- gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Ich denke, das macht genau das, was ich will, aber es ist in Google Cloud Storage integriert. Damit es im Allgemeinen funktioniert, müsste ich es hacken und alle Zugriffe auf GCS in lokale Dateizugriffe auf dem angegebenen Einhängepunkt oder Zugriffe auf Amazon Cloud Drive ändern