gcsfuse输入/输出错误

时间:2016-04-03 07:24:48

标签: linux gcsfuse

当我尝试在安装在linux(Ubuntu 15.10)目录中的Google云存储桶中创建目录或文件时,我收到输入/输出错误。

我已经完成的步骤:

  • 创建名为transfer
  • 的用户
  • 创建了/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控制台中创建目录,我可以看到该目录正常。

5 个答案:

答案 0 :(得分:10)

您的问题确实源于权限不足,但您需要销毁并重新创建具有不同范围的VM来解决此问题。这是另一种更适合生产系统的方法:

  1. 创建服务帐户
  2. 为服务帐户创建密钥,然后下载JSON文件
  3. 为服务帐户授予适当的角色
  4. 向存储桶上的服务帐户授予适当的权限
  5. 将服务帐户的JSON凭据上载到VM
  6. 最后,定义一个环境变量,该变量包含从命令行调用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

创建服务帐户

  • 创建帐户后,您将获得一个json文件。
  • 在VM实例上上传json。
  • 在/ etc / fstab中输入以下内容。

      

    {{gcp bucket name}} {{mount path}} gcsfuse   rw,noauto,user,key_file = {{/ path / to / key.json}}

    (如果您已经先安装了卸载)。

  • $ mount -a

关注此链接

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秒,因此在这段时间内不允许进行任何修改或删除。解决方案是简单地减少它。

enter image description here

这不是最终解决方案,但希望其他人会发现它有用。