14

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

我已经完成的步骤:

  • 创建了一个名为 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 到服务器并将它们存储在谷歌存储桶而不是本地存储中。

更新 我修改了命令以获取一些调试信息:

gcsfuse --implicit-dirs --foreground --debug_gcs --debug_fuse backup01-bucket /mnt/backups

然后mkdir /mnt/backups/testtransfer用户身份运行。

下面的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 控制台中创建一个目录,我可以看到该目录正常。

4

7 回答 7

15

从您的调试输出中的错误看来Insufficient Permission,gcsfuse 对您的存储桶没有足够的权限。可能它具有只读访问权限。

请务必阅读 gcsfuse 的凭证文档。特别是,如果您在 GCE VM 上使用服务帐户,请确保设置具有storage-full访问范围的 VM。

于 2016-04-05T10:43:32.730 回答
14

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

  1. 创建服务帐号
  2. 为服务帐号创建密钥,并下载 JSON 文件
  3. 为服务帐号授予适当的角色
  4. 向存储桶上的服务帐户授予适当的权限
  5. 将服务帐户的 JSON 凭据上传到 VM

最后,在从命令行调用 gcsfuse 时,定义一个环境变量,其中包含服务帐户凭据的路径:

GOOGLE_APPLICATION_CREDENTIALS=/root/credentials/service_credential_file.json gcsfuse bucket_name /my/mount/point

使用该key_file选项在fstab. 这两个选项都记录在gcsfuse 凭证文档中。(编辑:此选项已记录在案,但对我不起作用。)

key_file有趣的是,即使您已使用以下方式在 VM 上配置了服务帐户,您也需要使用环境变量或选项:

gcloud auth activate-service-account --key-file /root/credentials/service_credential_file.json

出于某种原因,gcsfuse 会忽略活动的凭据帐户。

在创建 VM 时使用storage-full范围具有安全性和稳定性影响,因为它允许该 VM 具有对属于同一项目的每个存储桶的完全访问权限。您的文件存储服务器是否真的能够覆盖日志存储桶中的日志,或者读取另一个存储桶中的数据库备份?

于 2016-08-19T21:06:03.170 回答
1

由于缺少凭据文件而导致此问题。

转到 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}}

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

  • $挂载-a

按照这个链接

https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/mounting.md#credentials

于 2019-11-22T13:01:04.003 回答
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 秒,因此在此期间不允许进行任何修改或删除。解决方案是简单地减少它。

在此处输入图像描述

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

于 2020-11-29T00:51:42.117 回答
0

如果您在该存储桶中设置了一些保留策略/规则,也会出现此问题。对我来说,当我尝试更新挂载文件夹中的任何文件时,我也遇到了相同的输入/输出错误,根本原因是我添加了保留策略,以便在 1 个月之前不删除任何文件。

于 2020-04-11T10:43:40.280 回答
0

它适用于 fstab 中的以下条目:

bucketName mountPath gcsfuse rw,allow_other,uid=1003,gid=1003,file_mode=777,dir_mode=777,implicit_dirs

注意:请勿在存储桶名称中添加“gs://”。

于 2022-02-21T09:08:42.957 回答
0

请检查虚拟机的 Cloud API access scopes 设置,需要将其配置为 Allow full access to all Cloud APIs

在此处输入图像描述

于 2021-09-23T14:26:36.750 回答