当我尝试在安装在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 storeage存储桶而不是本地存储中。
更新 我修改了命令以获取一些调试信息:
gcsfuse --implicit-dirs --foreground --debug_gcs --debug_fuse backup01-bucket /mnt/backups
然后以mkdir /mnt/backups/test
用户身份运行transfer
。
出现了以下信息:
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控制台中创建目录,我可以看到该目录正常。
答案 0 :(得分:10)
您的问题确实源于权限不足,但您不需要销毁并重新创建具有不同范围的VM来解决此问题。这是另一种更适合生产系统的方法:
最后,定义一个环境变量,该变量包含从命令行调用gcsfuse时服务帐户凭据的路径:
GOOGLE_APPLICATION_CREDENTIALS=/root/credentials/service_credential_file.json gcsfuse bucket_name /my/mount/point
使用key_file
选项在fstab
中完成相同的操作。这两个选项都记录在gcsfuse credentials documentation中。 (编辑:此选项已记录在案,但不会对我有用。)
有趣的是,即使您使用以下方法在VM上配置了服务帐户,也需要使用环境变量或key_file
选项:
gcloud auth activate-service-account --key-file /root/credentials/service_credential_file.json
出于某种原因,gcsfuse会忽略有效的凭证帐户。
在创建VM时使用storage-full
范围具有安全性和稳定性含义,因为它允许该VM对属于同一项目的每个存储桶具有完全访问权限。您的文件存储服务器是否真的能够在日志存储桶中覆盖日志,或者读取另一个存储桶中的数据库备份?
答案 1 :(得分:9)
从调试输出中的Insufficient Permission
错误中可以看出,gcsfuse对您的存储桶没有足够的权限。可能它具有只读访问权限。
请务必阅读gcsfuse的credentials文档。特别是,如果您在GCE VM上使用服务帐户,请确保使用storage-full
访问范围设置VM。
答案 2 :(得分:0)
此问题是由于缺少凭证文件。
转到 https://cloud.google.com/docs/authentication/production
创建服务帐户
在/ etc / fstab中输入以下内容。
{{gcp bucket name}} {{mount path}} gcsfuse rw,noauto,user,key_file = {{/ path / to / key.json}}
(如果您已经先安装了卸载)。
关注此链接
https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/mounting.md#credentials
答案 3 :(得分:0)
如果您在该存储桶中设置了某些保留策略/规则,也会发生此问题。 就像对我一样,当我尝试更新已安装文件夹中的任何文件时,我也遇到了相同的输入/输出错误,根本原因是我添加了保留策略,以便在1个月前不删除任何文件。
答案 4 :(得分:0)
我断断续续地面临着这个问题,所以我想分享一下我发现的东西:
我将minikube
用于开发,将GCP用于生产。
我有以下postStart生命周期挂钩:
lifecycle:
postStart:
exec:
command: ['gcsfuse', '-o', 'allow_other', 'bucket', 'path']
在本地,我通过在创建Pod之前运行以下两个命令来配置权限:
$ gcloud auth login
$ minikube addons enable gcp-auth
远程地,在创建集群时,我启用了如下权限:
gcloud_create_cluster:
gcloud container clusters create cluster \
--scopes=...storage-full...
在开发过程中,我发现自己每1分钟更新/覆盖一次文件。由于我的保留政策设置为60秒,因此在这段时间内不允许进行任何修改或删除。解决方案是简单地减少它。
这不是最终解决方案,但希望其他人会发现它有用。