假设我使用 FUSE 客户端安装了一些云存储(在我的例子中是 Amazon Cloud Drive)/mnt/cloud
。但是,由于直接读取和写入文件的/mnt/cloud
速度很慢,因为它必须通过互联网,所以我想缓存正在读取和写入云存储的文件。由于我可能一次写入大量数据,因此缓存应该位于我的磁盘上,而不是 RAM 中。但我不想将整个云存储复制到我的磁盘上,因为我的磁盘可能太小了。
所以我想在/mnt/cloud
Mounted at中有一个缓存视图/mnt/cloud_cache
,它使用另一个路径,例如/var/cache/cloud
缓存位置。
如果我现在读到/mnt/cloud_cache/file
,我希望发生以下情况:
检查是否file
缓存在/var/cache/cloud/file
.
- 如果已缓存:
file
通过从 中获取 modtime 和/或校验和来检查缓存是否是最新的/mnt/cloud
。如果是最新的,则从缓存中提供该文件,否则转到 2。 - 如果未缓存或缓存已过期:复制
/mnt/cloud/file
到缓存/var/cache/cloud/file
并从缓存中提供服务。
当我写信给 时/mnt/cloud_cache/file
,我希望发生这种情况:
- 写入并记录在需要写回的
/var/cache/cloud/file
日志中file
/mnt/cloud
- 等待写入
/var/cache/cloud/file
完成和/或之前的写回/mnt/cloud
完成 - 复制
/var/cache/cloud/file
到/mnt/cloud
我有以下要求和限制:
- 免费和开源
- 能够将缓存设置为任意缓存位置
- 能够缓存任意位置(可能是某个 FUSE 安装点)
- 透明缓存,即使用
/mnt/cloud_cache
对缓存机制是透明的,并且像任何其他安装的文件系统一样工作 - 记录需要写回的内容(缓存可能会在几天内获得大量需要写回原始存储位置的数据)
- 自动删除已写回或一段时间未访问的缓存文件
- 一致性(即反映对 的外部更改)并不是非常重要,因为我可能一次
/mnt/cloud
只有一个客户端访问,但如果有的话那就太好了。/mnt/cloud
我花了相当长的时间寻找现有的解决方案,但没有找到任何令人满意的解决方案。
- FS-Cache 和 CacheFS (https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt)似乎只适用于
nfs
或afs
文件系统,我不知道如何使其缓存另一个 FUSE 文件系统或任何常规目录。 - 缓存(https://bcache.evilpiepirate.org/)似乎只适用于块设备,即无法缓存另一个 FUSE 文件系统
- GCSFUSE(https://github.com/GoogleCloudPlatform/gcsfuse)我认为这正是我想要的,但它与 Google Cloud Storage 集成。为了使其正常工作,我必须对其进行破解,并将对 GCS 的任何访问更改为给定安装点中的本地文件访问或对 Amazon Cloud Drive 的访问
答案1
尝试使用猫夫,我目前正在开发的通用保险丝缓存文件系统。
答案2
可以使用 FS-Cache/CacheFS 来缓存已安装熔断器的系统,方法是在两者之间添加 NFS 间接:如果您的熔断器安装在 /fusefs 上,则通过在 /etc/exportfs 中写入以下内容,在 nfs 上将其共享给自己:
/fusefs localhost(fsid=0)
现在你可以这样做:
mount -t nfs -o fsc localhost:/fusefs /nfs systemctl start cachefilesd
/nfs 将提供对 /fusefs 的缓存访问。
我使用这种方法,使用 sshfs 作为后台 FS,效果很好。
(不幸的是,这只会加快文件内容的访问速度;文件元数据不会被缓存,因此stat
仍然open
很慢)。
答案3
这是一种无知的答案,因为我无法访问用于测试它的亚马逊云目录。但在“怎么做”精神:设置亚马逊云服务 NFS, 然后使用远程登录到该 NFS 服务器cachefilesd
。
“说起来容易做起来难……”