
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/cloud
langsam 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/cloud
unter bereitgestellt ist /mnt/cloud_cache
und einen anderen Pfad verwendet, beispielsweise /var/cache/cloud
als Cache-Speicherort.
Wenn ich jetzt lese /mnt/cloud_cache/file
, möchte ich, dass folgendes passiert:
Überprüfen Sie, ob file
unter zwischengespeichert ist /var/cache/cloud/file
.
- Falls zwischengespeichert: Überprüfen Sie, ob
file
der 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. - Wenn nicht zwischengespeichert oder der Cache veraltet ist:
/mnt/cloud/file
In den Cache kopieren/var/cache/cloud/file
und aus dem Cache bereitstellen.
Wenn ich an schreibe /mnt/cloud_cache/file
, möchte ich, dass Folgendes passiert:
- Schreiben Sie
/var/cache/cloud/file
in ein Tagebuch und zeichnen Sie es auf,file
an das zurückgeschrieben werden muss/mnt/cloud
- Warten Sie, bis der Schreibvorgang
/var/cache/cloud/file
abgeschlossen ist und/oder vorherige Schreibvorgänge/mnt/cloud
abgeschlossen sind. - Kopieren
/var/cache/cloud/file
nach/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_cache
ist 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/cloud
immer 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
nfs
oderafs
Dateisystemen 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 stat
und open
sind 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..."