Скажем, я смонтировал некоторое облачное хранилище (в моем случае 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
в кеше актуальна путем извлечения 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. Система или любой общий каталог. - Похоже, что bcache ( https://bcache.evilpiepirate.org/ ) работает только с блочными устройствами, т.е. не может кэшировать другую файловую систему FUSE.
- gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Я думаю, что это именно то, что я хочу, но оно интегрировано с Google Cloud Storage. Чтобы заставить его работать в целом, мне придется взломать его и изменить любой доступ к GCS на локальный доступ к файлам в заданной точке монтирования или доступ к Amazon Cloud Drive.