Скажімо, я монтую деякий хмарний сховище (у моєму випадку Amazon Cloud Drive) із клієнтом FUSE у /mnt/cloud
. Але оскільки читання та запис файлів безпосередньо /mnt/cloud
відбувається повільно, оскільки він повинен переходити через Інтернет, я хочу кешувати файли, з яких я читаю, і записувати у хмарне сховище. Оскільки я можу записувати багато даних одночасно, кеш повинен сидіти на моєму диску, а не в оперативній пам'яті. Але я не хочу копіювати весь хмарний накопичувач на своєму диску, тому що мій диск може бути занадто малим.
Тому я хочу мати кешований вид /mnt/cloud
змонтований на /mnt/cloud_cache
, який використовує інший шлях, скажімо, /var/cache/cloud
як місце кешування.
Якщо я зараз читаю /mnt/cloud_cache/file
, то хочу, щоб сталося таке:
Перевірте, чи file
кешовано в /var/cache/cloud/file
.
- Якщо є кешоване: Перевірте
file
кеша оновлена, отримуючи мод час та / або контрольну суму з/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 система або будь-який загальний каталог. - bcache ( https://bcache.evilpiepirate.org/ ), здається, працює лише з блоковими пристроями, тобто не вдалося кешувати іншу файлову систему FUSE
- gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Я думаю, що це робить саме те, що я хочу, але він інтегрований у Google Cloud Storage. Щоб він працював взагалі, мені доведеться зламати його та змінити будь-який доступ у GCS на доступ до локальних файлів у заданій точці монтажу або доступ до Amazon Cloud Drive