Скажімо, я монтую деякий хмарний сховище (у моєму випадку 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