Wie kann ich jedes Verzeichnis oder gemountete Dateisystem zum Lesen und Zurückschreiben transparent zwischenspeichern?

Wie kann ich jedes Verzeichnis oder gemountete Dateisystem zum Lesen und Zurückschreiben transparent zwischenspeichern?

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 jedoch /mnt/cloudlangsam ist, weil es über das Internet laufen muss, möchte ich die Dateien, die ich aus dem Cloud-Speicher lese und in den Cloud-Speicher schreibe, zwischenspeichern. Da ich möglicherweise viele Daten gleichzeitig schreibe, sollte der Cache auf meiner Festplatte und nicht im RAM liegen. 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 haben , die /mnt/cloudunter bereitgestellt ist /mnt/cloud_cacheund einen anderen Pfad verwendet, beispielsweise /var/cache/cloudals Cache-Speicherort.

Wenn ich jetzt lese /mnt/cloud_cache/file, möchte ich, dass folgendes passiert:

Überprüfen Sie, ob fileunter zwischengespeichert ist /var/cache/cloud/file.

  1. Falls zwischengespeichert: Überprüfen Sie, ob fileder Cache aktuell ist, indem Sie Modtime und/oder Prüfsumme von abrufen /mnt/cloud. Wenn es aktuell ist, stellen Sie die Datei aus dem Cache bereit, andernfalls fahren Sie mit 2 fort.
  2. Wenn nicht zwischengespeichert oder der Cache veraltet ist: /mnt/cloud/fileIn den Cache kopieren /var/cache/cloud/fileund aus dem Cache bereitstellen.

Wenn ich an schreibe /mnt/cloud_cache/file, möchte ich, dass Folgendes passiert:

  1. Schreiben Sie /var/cache/cloud/filein ein Tagebuch und zeichnen Sie es auf, filean das zurückgeschrieben werden muss/mnt/cloud
  2. Warten Sie, bis der Schreibvorgang /var/cache/cloud/fileabgeschlossen ist und/oder vorherige Schreibvorgänge /mnt/cloudabgeschlossen sind.
  3. Kopieren /var/cache/cloud/filenach/mnt/cloud

Ich habe folgende Anforderungen und Einschränkungen:

  • Kostenlos und Open Source
  • Möglichkeit, einen beliebigen Cache-Speicherort festzulegen
  • Möglichkeit zum Zwischenspeichern an einem beliebigen Ort (wahrscheinlich ein FUSE-Einhängepunkt)
  • Transparentes Caching, d. h. die Verwendung /mnt/cloud_cacheist für den Caching-Mechanismus transparent und funktioniert wie jedes andere gemountete Dateisystem
  • Führen Sie einen Überblick darüber, was zurückgeschrieben werden muss (der Cache enthält möglicherweise viele Daten, die im Laufe der Tage an den ursprünglichen Speicherort zurückgeschrieben werden müssen)
  • Automatisches Löschen zwischengespeicherter Dateien, die zurückgeschrieben wurden oder auf die seit einiger Zeit nicht zugegriffen wurde
  • Konsistenz (d. h. die Wiedergabe externer Änderungen an /mnt/cloud) ist nicht besonders wichtig, da wahrscheinlich /mnt/cloudimmer nur ein Client gleichzeitig zugreifen wird, aber schön wäre es, sie zu haben.

Ich habe ziemlich viel Zeit damit verbracht, nach vorhandenen Lösungen zu suchen, aber nichts Zufriedenstellendes gefunden.

  • FS-Cache und CacheFS (https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt) scheint nur mit nfsoder afsDateisystemen zu funktionieren und ich weiß nicht, wie ich es dazu bringe, ein anderes FUSE-Dateisystem oder ein allgemeines Verzeichnis zwischenzuspeichern.
  • bcache (https://bcache.evilpiepirate.org/) scheint nur mit Blockgeräten zu funktionieren, d. h. 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 allgemein funktioniert, müsste ich es hacken und alle Zugriffe auf GCS in lokale Dateizugriffe im angegebenen Einhängepunkt oder Zugriffe auf Amazon Cloud Drive ändern.

Antwort1

Versuchen Sie es mitKatzen, ein generisches Fuse-Caching-Dateisystem, an dem ich derzeit arbeite.

Antwort2

Es ist möglich, FS-Cache/CacheFS zum Zwischenspeichern eines per Fuse gemounteten Systems zu verwenden, indem Sie dazwischen eine NFS-Indirektion einfügen: Wenn Ihr Fuse-Mount auf /fusefs liegt, geben Sie es per NFS für sich selbst frei, indem Sie Folgendes in /etc/exportfs schreiben:

/fusefs localhost(fsid=0)

Jetzt können Sie Folgendes tun:

mount -t nfs -o fsc localhost:/fusefs /nfs systemctl start cachefilesd

und /nfs bietet zwischengespeicherten Zugriff auf /fusefs.

Ich verwende diesen Ansatz mit SSHFS als Back-FS, es funktioniert gut.

(Leider beschleunigt dies nur den Zugriff auf Dateiinhalte; Dateimetadaten werden nicht zwischengespeichert statund opensind daher immer noch langsam).

Antwort3

Dies ist eine ignorante Antwort, da ich keinen Zugriff auf ein Amazon-Cloud-Verzeichnis habe, mit dem ich es testen könnte. Aber im"Wie es geht"Geist: AufbauAmazon-Cloud zur Bereitstellung von NFS, DannMelden Sie sich remote bei diesem NFS-Server an mitcachefilesd.

"Leichter gesagt als getan..."

verwandte Informationen