このページでは、Cloud Storage FUSE の概要について説明します。Cloud Storage FUSE は、オープンソースの FUSE アダプタです。これにより、Cloud Storage バケットをローカル ファイル システムとしてマウントしてアクセスできるため、アプリケーションは、標準のファイル システムのセマンティクスを使用して、バケット内のオブジェクトを読み取り、書き込むことができます。
gcsfuse CLI のインストールやバケットのマウントなど、Cloud Storage FUSE の使用方法については、Cloud Storage FUSE GitHub のドキュメントをご覧ください。
Cloud Storage FUSE の仕組み
Cloud Storage FUSE は、FUSE と Cloud Storage API を使用して、バケットをファイル システム上のローカルにマウントされたフォルダとして透過的に公開します。Cloud Storage FUSE は、Google Kubernetes Engine、Compute Engine VM、オンプレミス システムなど、Cloud Storage に接続されたあらゆる場所で実行できます。
Cloud Storage FUSE は、オブジェクト ストレージの名前をファイルとディレクトリに変換し、オブジェクト名の中のスラッシュ(/)をディレクトリの区切りとして扱うことで、共通の接頭辞を持つオブジェクトが同じディレクトリ内のファイルとして扱われるようにします。アプリケーションは、ファイル システムなどのマウントされたバケットと通信し、クラウドでほぼ無制限なファイル ストレージを実行できます。
Cloud Storage FUSE は、ファイル システムのセマンティクスを必要とするアプリケーションに対して、Cloud Storage に適切なパフォーマンス特性とスケーラビリティ特性のあるユースケースに最適です。たとえば、Cloud Storage FUSE は、データ(モデル、チェックポイント、ログ)を Cloud Storage に直接格納できるため、機械学習(ML)プロジェクトに役立ちます。詳細については、ML ワークロード用の Cloud Storage FUSE をご覧ください。
他のファイル システムとの違い
Cloud Storage FUSE は、ファイル システム インターフェースを備えていますが、バックエンドの NFS や CIFS などのファイル システムとは異なります。また、Cloud Storage FUSE は POSIX に準拠していません。Google Cloud の POSIX ファイル システム プロダクトについては、Filestore をご覧ください。
POSIX ファイル システムとの違い
次のリストは、Cloud Storage FUSE と POSIX のファイル システムの違いを示しています。
- メタデータ: Cloud Storage にファイルをアップロードする際に、Cloud Storage FUSE がオブジェクトのメタデータを転送することはありません。ただし、mtime ターゲットや symlink ターゲットは例外です。つまり、Cloud Storage FUSE を使用してファイルをアップロードする際に、オブジェクトのメタデータを設定することはできません。オブジェクトのメタデータを保持する必要がある場合は、gsutil、JSON API、または Google Cloud コンソールでファイルをアップロードすることを検討してください。
- 同時実行: Cloud Storage FUSE では、同じファイルへの複数の書き込みに対して同時実行制御を行うことはできません。複数の書き込みによってファイルの置き換えが試みられた場合は、最後の書き込みが有効となり、それ以前の書き込みはすべて失われます。統合、バージョン コントロール、上書きの通知は行われません。
- リンク: Cloud Storage FUSE はハードリンクをサポートしていません。
- ファイルのロックとファイルへのパッチ適用: Cloud Storage FUSE は、ファイルロックやファイルへのパッチ適用をサポートしていません。バージョン管理システムはファイルのロックとパッチ適用に依存しているため、バージョン管理システムのリポジトリを Cloud Storage FUSE マウント ポイントに保存しないでください。また、Cloud Storage FUSE をファイラー置換として使用しないでください。
- セマンティクス: Cloud Storage FUSE のセマンティクスは、従来のファイル システムのセマンティクスと異なります。たとえば、最終アクセス時間などのメタデータはサポートされておらず、ディレクトリの名前変更などの一部のメタデータ オペレーションはアトミックではありません。Cloud Storage FUSE のセマンティクスと従来のファイル システムのセマンティクスの違いの一覧については、Cloud Storage FUSE GitHub のドキュメントのセマンティクスをご覧ください。
- ファイルの途中の上書き: Cloud Storage FUSE は、ファイルの途中での上書きをサポートしていません。順次書き込みのみがサポートされています。
- アクセス: ファイルの承認は、Cloud Storage の権限によって管理されます。POSIX 形式のアクセス コントロールは機能しません。
制限事項
次のリストは、Cloud Storage FUSE を使用する際の制限事項を示しています。
- パフォーマンス: Cloud Storage FUSE のレイテンシはローカル ファイル システムよりもはるかに高いため、データベースを保存するバックエンドとしては使用しないでください。サイズの小さいファイルを 1 つずつ読み取る / 書き込むと、スループットが低下することがあります。サイズの大きなファイルを使用するか、複数のファイルを一括転送することで、スループットは上がりやすくなります。
- 可用性: Cloud Storage FUSE を使用して Cloud Storage にアクセスすると、一時的なエラーが発生することがあります。失敗したオペレーションは、再試行戦略を使用して再試行することをおすすめします。
- オブジェクトのバージョニング: Cloud Storage FUSE は、オブジェクトのバージョニングが有効になっているバケットでの形式の使用を正式にサポートしていません。オブジェクトのバージョニングが有効になっているバケットで Cloud Storage FUSE を使用しようとすると、予期しない動作が発生する可能性があります。
- ファイルのコード変換: Cloud Storage FUSE では、
contentEncoding
プロパティ セットを持つオブジェクトを基にしたファイルの読み取りや変更を正式にサポートしていません。コード変換が行われているオブジェクトで Cloud Storage FUSE を使用しようとすると、予期しない動作が発生する可能性があります。 - 保持ポリシー: Cloud Storage FUSE では、保持ポリシーを使用したバケットへの書き込みはサポートされていません。保持ポリシーが設定されたバケットに書き込もうとすると、書き込みは失敗します。
Cloud Storage FUSE は、保持ポリシーが設定されたバケットからオブジェクトの読み取りをサポートしていますが、バケットのマウント時に
-o RO
フラグを渡すことで、Read-Only
としてマウントする必要があります。 - ローカル ストレージ: 新しいまたは変更されたオブジェクトは、閉じるか同期されるまで、ローカルの一時ファイルにその全体が保存されます。サイズの大きいファイルを扱う場合には、ファイルの一時ファイルがコピーできる容量をローカルに用意してください。特に、Compute Engine インスタンスの場合は、十分な容量を確保してください。詳細については、Cloud Storage FUSE GitHub ドキュメントの README をご覧ください。
- ディレクトリ: Cloud Storage はフラットな名前空間で動作します。デフォルトでは、明示的に定義されたディレクトリ(Cloud Storage にオブジェクトとして存在するディレクトリ)のみがマウントされたファイル システムに表示されます。暗示的なディレクトリ(他のファイルやディレクトリのパス名の一部でしかないディレクトリ)はデフォルトでは表示されません。パス名に暗示的なディレクトリを含むファイルがある場合、そのファイルを含む暗示的なディレクトリは表示されないため、ファイルはディレクトリ ツリーに表示されません。ただし、この動作はフラグを使用して変更できます。詳細については、Cloud Storage FUSE GitHub ドキュメントのファイルとディレクトリをご覧ください。
Cloud Storage FUSE は、ディレクトリの名前変更をサポートしていません。Cloud Storage では、ディレクトリの名前をアトミックに実行することはできません。ディレクトリ名を変更するには、新しい名前のオブジェクトをコピーして元のオブジェクトを削除する必要があります。
サポートされているアプリケーションとプラットフォーム
Cloud Storage FUSE は、TensorFlow V2.x、TensorFlow V1.x、PyTorch V1.x の ML フレームワークを正式にサポートしています。他のフレームワークでの使用のサポートは保証されていません。
Cloud Storage FUSE は、Linux カーネル バージョン 3.10 以前で実行されている次のオペレーティング システムをサポートしています。
Ubuntu 18.04 以降
Debian 10 以降
CentOS 7 以降
RHEL 7 以降
サポートを受ける
GitHub で問題を報告することで、サポートの利用、一般的な質問の送信、新機能のリクエストを行えます。いずれかの Cloud Storage の公式サポート チャンネルを使用してサポートを受けることもできます。
頻繁に発生する問題の解決策については、Cloud Storage FUSE GitHub ドキュメントのトラブルシューティングをご覧ください。
Cloud Storage FUSE の料金
Cloud Storage FUSE は無料で利用できますが、Cloud Storage に関連して生成されるストレージ、メタデータ、ネットワーク I/O は、他の Cloud Storage インターフェースと同様に課金されます。Cloud Storage FUSE によって実行されるすべてのデータ転送とオペレーションは、Cloud Storage による転送とオペレーションにマッピングされ、状況に応じて課金されます。 一般的な Cloud Storage FUSE オペレーションと、Cloud Storage オペレーションへのマッピング方法の詳細については、オペレーションのマッピングをご覧ください。
予想以上に請求額が上がることを防ぐため、Cloud Storage FUSE の使用によってどの程度の Cloud Storage の料金が発生するかを見積もっておく必要があります。たとえば、Cloud Storage FUSE でログファイルを保存する場合、ログが数百または数千のマシンで同時に積極的にフラッシュされると、直ちに料金が発生することがあります。
Cloud Storage FUSE の使用に関連して、次の料金カテゴリに注意してください。
標準的なオブジェクト オペレーション(作成、削除、一覧表示)は、Cloud Storage の料金ページのオペレーション セクションの説明に従って課金されます。
Nearline ストレージ オブジェクト、Coldline ストレージ オブジェクト、Archive ストレージ オブジェクトには、取得と早期削除に関する料金が設定されています。
ロケーション間のネットワーク下り(外向き)とデータ転送では、料金が発生します。詳細については、Cloud Storage の料金ページのネットワーク セクションをご覧ください。
Cloud Storage FUSE オペレーションの Cloud Storage オペレーションへのマッピング
Cloud Storage FUSE を使用してオペレーションを行う場合、Cloud Storage FUSE オペレーションに関連付けられた Cloud Storage オペレーションも行います。次の表に、一般的な Cloud Storage FUSE コマンドと、関連する Cloud Storage の JSON API オペレーションを示します。Cloud Storage FUSE オペレーションに関する情報を表示するには、--debug_gcs
フラグを使用します。
コマンド | JSON API 操作 |
---|---|
gcsfuse --debug_gcs example-bucket mp |
Objects.list、認証情報の確認 |
cd mp |
該当なし |
ls mp |
Objects.list("") |
mkdir subdir |
Objects.get("subdir") Objects.get("subdir/") Objects.insert("subdir/") |
cp ~/local.txt subdir/ |
Objects.get("subdir/local.txt") Objects.get("subdir/local.txt/") Objects.insert("subdir/local.txt")、空のオブジェクトの作成 Objects.insert("subdir/local.txt")、書き込み後に閉じる場合 |
rm -rf subdir |
Objects.list("subdir") Objects.list("subdir/") Objects.delete("subdir/local.txt") Objects.list("subdir/") Objects.delete("subdir/") |