
假設我使用 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
。
“說起來容易做起來難…”