gcsfuse输入/输出错误

问题描述:

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

步骤我都做:

  • 创建了一个名为转移
  • 用户创建一个/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控制台的目录,我可以看到目录罚款。

+0

你能用'--foreground'运行gcsfuse并用日志输出修改你的问题吗?如果没有用处,请尝试'--debug_gcs'和/或'--debug_fuse'。 – jacobsa

+0

我用调试信息更新了这个问题。谢谢。 – user1476207

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

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

+0

谢谢!不幸的是,我不得不重新创建虚拟机来启用API。无法找到将存储更改为在现有VM上进行读写的方法。 – user1476207

+0

是的,据我所知,这是不可能改变的。 – jacobsa

+0

好消息,截至2016年12月17日,可以更改*停止*虚拟机的权限。请参阅https://googlecloudplatform.uservoice.com/forums/302595-compute-engine/suggestions/13101552-ability-to-change-cloud-api-access-scopes-on-launc。您还可以更改每个API的权限,例如继续拒绝对BigQuery的访问,但对于存储是完全的。 – Spotlight

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

有趣的是,你需要使用环境变量或key_file选项,即使你已经配置使用虚拟机上的服务帐户:

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

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

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