たとえば、/mnt/cloud
にあるFuseクライアントを使用して、クラウドストレージ(私の場合はAmazon Cloud Drive)をマウントするとします。ただし、/mnt/cloud
への直接のファイルの読み取りと書き込みはインターネット経由で行う必要があるため低速なので、クラウドストレージに読み書きしているファイルをキャッシュしたいと思います。一度に大量のデータを書き込む可能性があるため、キャッシュはRAMではなくディスク上に置く必要があります。ただし、ディスクが小さすぎる可能性があるため、ディスク上にクラウドストレージ全体を複製したくありません。
そのため、/mnt/cloud
にキャッシュされたビューを/mnt/cloud_cache
にマウントして、別のパスを使用します。たとえば、キャッシュ場所として/var/cache/cloud
を使用します。
ここで/mnt/cloud_cache/file
を読んだ場合、次のことを実行してください。
file
が/var/cache/cloud/file
にキャッシュされているかどうかを確認します。
/mnt/cloud
からmodtimeやチェックサムをフェッチして、キャッシュ内のfile
が最新であることを確認します。最新の場合は、キャッシュからファイルを提供します。そうでない場合は、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
にコピー次の要件と制約があります。
/mnt/cloud_cache
の使用はキャッシングメカニズムに対して透過的であり、他のマウントされたファイルシステムと同様に機能します。/mnt/cloud
への外部の変更を反映すること)はそれほど重要ではありません。これは、一度に/mnt/cloud
にアクセスするクライアントはおそらく1つだけであるためです。既存のソリューションを探すのにかなりの時間を費やしましたが、満足できるものは何も見つかりませんでした。
nfs
またはafs
ファイルシステムと、別のFuseファイルシステムまたは一般的なディレクトリをキャッシュする方法がわかりません。私が現在取り組んでいる汎用のFuseキャッシングファイルシステム catfs を使用してみてください。
FS-Cache/CacheFSを使用して、Fuseでマウントされたシステムをキャッシュすることができます。その間にNFSインダイレクションを追加することで可能です。
/fusefs localhost(fsid=0)
これでこれを行うことができます:
mount -t nfs -o fsc localhost:/fusefs /nfs systemctl start cachefilesd
/ nfsは、/ fusefsへのキャッシュされたアクセスを提供します。
私はsshfsをバックFSとしてこのアプローチを使用していますが、うまく動作します。
(残念ながら、これはファイルコンテンツへのアクセスを高速化するだけです。ファイルメタデータはキャッシュされないため、stat
とopen
はまだ低速です)。
これをテストするためのAmazonクラウドディレクトリにアクセスしていないため、これは無知な種類の答えです。しかし "方法" 精神:セットアップ NFSにサービスを提供するAmazonクラウド 、次に cachefilesd
を使用してそのNFSサーバーにリモートでログインします 。
「言うより簡単だ...」