gcsfuseinput/输出错误

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

我已经完成的步骤:

  • 创build了一个名为transfer的用户
  • 创build一个/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文件到服务器,并将其存储在谷歌存储桶,而不是本地存储。

更新我修改了命令获取一些debugging信息:

 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控制台中创build一个目录,我可以看到目录正确。

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

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

您的问题源于权限不足,但您不需要销毁并重新创建具有不同范围的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证书文档中 。 (编辑:这个选项是记录,但不会为我工作。)

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

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

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

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