Supponiamo che monti un po 'di spazio di archiviazione cloud (Amazon Cloud Drive nel mio caso) con un client FUSE su /mnt/cloud
. Ma poiché leggere e scrivere i file direttamente /mnt/cloud
è lento perché deve passare su Internet, voglio memorizzare nella cache i file da cui sto leggendo e scrivendo sul cloud. Dal momento che potrei scrivere molti dati alla volta, la cache dovrebbe trovarsi sul mio disco e non nella RAM. Ma non voglio replicare l'intero archivio cloud sul mio disco, perché il mio disco potrebbe essere troppo piccolo.
Quindi voglio avere una vista cache in /mnt/cloud
montata su /mnt/cloud_cache
, che utilizza un altro percorso, ad esempio /var/cache/cloud
come posizione di memorizzazione nella cache.
Se ora leggo /mnt/cloud_cache/file
, voglio che accada quanto segue:
Controlla se file
è memorizzato nella cache /var/cache/cloud/file
.
- Se memorizzato nella cache: la cache del check
file
in è aggiornata recuperando modtime e / o checksum da/mnt/cloud
. Se è aggiornato, servi il file dalla cache, altrimenti vai a 2. - Se non è memorizzato nella cache o cache è out-of-date: copia
/mnt/cloud/file
per/var/cache/cloud/file
e servire dalla cache.
Quando scrivo a /mnt/cloud_cache/file
, voglio che questo accada:
- Scrivi
/var/cache/cloud/file
e registra in un diario chefile
deve essere riscritto/mnt/cloud
- Attendere che la scrittura
/var/cache/cloud/file
da fare e / o precedenti ripristini di valore per/mnt/cloud
essere completati - Copia
/var/cache/cloud/file
in/mnt/cloud
Ho i seguenti requisiti e vincoli:
- Gratuito e open source
- Possibilità di impostare la cache in un percorso cache arbitrario
- Possibilità di memorizzare nella cache una posizione arbitraria (probabilmente un punto di montaggio FUSE)
- La memorizzazione nella cache trasparente, ovvero l'utilizzo
/mnt/cloud_cache
è trasparente al meccanismo di memorizzazione nella cache e funziona come qualsiasi altro file system montato - Tenere traccia di ciò che deve essere riscritto (la cache potrebbe ottenere molti dati che devono essere riscritti nella posizione di archiviazione originale nel corso dei giorni)
- Cancellazione automatica dei file memorizzati nella cache che sono stati riscritti o ai quali non è stato possibile accedere da un po 'di tempo
- La coerenza (ovvero il riflettere le modifiche esterne a
/mnt/cloud
) non è estremamente importante, poiché probabilmente avrò solo un client che accede/mnt/cloud
alla volta, ma sarebbe bello avere.
Ho trascorso parecchio tempo a cercare soluzioni esistenti, ma non ho trovato nulla di soddisfacente.
- FS-Cache e CacheFS ( https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt ) sembra funzionare solo con
nfs
oafs
file system e non so come farlo memorizzare nella cache un altro file FUSE sistema o qualsiasi directory generale. - bcache ( https://bcache.evilpiepirate.org/ ) sembra funzionare solo con dispositivi a blocchi, ovvero non è possibile memorizzare nella cache un altro file system FUSE
- gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Penso che questo faccia esattamente quello che voglio, ma è integrato con Google Cloud Storage. Per farlo funzionare in generale, dovrei hackerarlo e modificare qualsiasi accesso a GCS in accessi ai file locali nel punto di montaggio dato o accessi ad Amazon Cloud Drive