Linux(Ubuntu 15.10)ディレクトリにマウントされたGoogleクラウドストレージバケットにディレクトリまたはファイルを作成しようとすると、入出力エラーが発生します。
私が行った手順:
/mnt/backups
ディレクトリを作成し、chown -R transfer /mnt/backups
を実行しましたgcsfuse --implicit-dir backup01-bucket /mnt/backups
を実行しました。ファイルシステムが正常にマウントされますmkdir test
を実行し、エラーmkdir: cannot create directory test: Input/output error
を取得します見逃したことはありますか?私がやろうとしているのは、ファイルをサーバーにftpで送信し、ローカルストレージではなくGoogleストレージバケットに保存できるようにすることです。
更新デバッグ情報を取得するようにコマンドを変更しました:
gcsfuse --implicit-dirs --foreground --debug_gcs --debug_Fuse backup01-bucket /mnt/backups
次に、transfer
ユーザーとしてmkdir /mnt/backups/test
を実行しました。
次のbedug情報が出ました:
Fuse_debug: Op 0x00000060 connection.go:395] <- GetInodeAttributes (inode 1)
Fuse_debug: Op 0x00000060 connection.go:474] -> OK
Fuse_debug: Op 0x00000061 connection.go:395] <- LookUpInode (parent 1, name "test")
gcs: Req 0x3a: <- StatObject("test/")
gcs: Req 0x3b: <- ListObjects()
gcs: Req 0x3c: <- StatObject("test")
gcs: Req 0x3c: -> StatObject("test") (53.375107ms): gcs.NotFoundError: googleapi: Error 404: Not Found, notFound
gcs: Req 0x3b: -> ListObjects() (59.061271ms): OK
gcs: Req 0x3a: -> StatObject("test/") (71.666112ms): gcs.NotFoundError: googleapi: Error 404: Not Found, notFound
Fuse_debug: Op 0x00000061 connection.go:476] -> Error: "no such file or directory"
Fuse_debug: Op 0x00000062 connection.go:395] <- MkDir
gcs: Req 0x3d: <- CreateObject("test/")
gcs: Req 0x3d: -> CreateObject("test/") (22.090155ms): googleapi: Error 403: Insufficient Permission, insufficientPermissions
Fuse_debug: Op 0x00000062 connection.go:476] -> Error: "CreateChildDir: googleapi: Error 403: Insufficient Permission, insufficientPermissions"
Fuse: 2016/04/04 06:51:02.922866 *fuseops.MkDirOp error: CreateChildDir: googleapi: Error 403: Insufficient Permission, insufficientPermissions
2016/04/04 06:51:08.378100 Starting a garbage collection run.
gcs: Req 0x3e: <- ListObjects()
gcs: Req 0x3e: -> ListObjects() (54.901164ms): OK
2016/04/04 06:51:08.433405 Garbage collection succeeded after deleted 0 objects in 55.248203ms.
注: Webコンソールでディレクトリを作成すると、ディレクトリが正常に表示されます。
デバッグ出力のInsufficient Permission
エラーから、gcsfuseにはバケットに対する十分な権限がないようです。おそらく読み取り専用アクセスがあります。
Gcsfuseの credentials ドキュメントを必ずお読みください。特に、GCEでサービスアカウントを使用している場合はVM storage-full
アクセススコープでVM)を設定してください。
問題は不十分な権限に起因しますが、notを破棄して再作成する必要はありませんVMこの問題を解決するためのさまざまなスコープ。本番システムにより適した別のアプローチは次のとおりです。
最後に、コマンドラインからgcsfuseを呼び出すときに、サービスアカウントの資格情報へのパスを含む環境変数を定義します。
GOOGLE_APPLICATION_CREDENTIALS=/root/credentials/service_credential_file.json gcsfuse bucket_name /my/mount/point
key_file
オプションを使用して、fstab
で同じことを実行します。これらのオプションは両方とも gcsfuse資格情報のドキュメント に記載されています。 (編集:このオプションは文書化されていますが、私には機能しません。)
興味深いことに、VM)でサービスアカウントを構成した場合でも、環境変数またはkey_file
オプションを使用する必要があります。
gcloud auth activate-service-account --key-file /root/credentials/service_credential_file.json
何らかの理由で、gcsfuseはアクティブな資格情報アカウントを無視します。
VM)を作成するときにstorage-full
スコープを使用すると、VMが属するすべてのバケットに完全にアクセスできるため、セキュリティと安定性に影響があります。ファイルストレージサーバーは、ログバケットのログを本当に上書きできるのでしょうか、それとも別のバケットのデータベースバックアップを読み取ることができるのでしょうか。
この問題は、資格情報ファイルがないために発生します。
go tohttps://cloud.google.com/docs/authentication/production
サービスアカウントの作成
/ etc/fstabに以下を入力します。
{{gcpバケット名}} {{マウントパス}} gcsfuse rw、noauto、user、key_file = {{/ path/to/key.json}}
すでにマウントを解除している場合は、最初にアンマウントします。
このリンクをたどる
https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/mounting.md#credentials
この問題は、そのバケットに保持ポリシー/ルールを設定した場合にも発生する可能性があります。私と同じように、マウントされたフォルダー内のファイルを更新しようとすると、同じ入出力エラーが発生しました。根本的な原因は、1か月前にファイルを削除しないという保持ポリシーを追加したことです。