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/test
为transfer
用户。
以下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控制台的目录,我可以看到目录罚款。
从调试输出中的Insufficient Permission
错误中可以看出gcsfuse没有足够的权限访问您的存储桶。可能它具有只读访问权限。
请务必阅读gcsfuse的credentials文档。特别是,如果您在GCE VM上使用服务帐户,请确保使用storage-full
访问范围设置虚拟机。
谢谢!不幸的是,我不得不重新创建虚拟机来启用API。无法找到将存储更改为在现有VM上进行读写的方法。 – user1476207
是的,据我所知,这是不可能改变的。 – jacobsa
好消息,截至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来解决此问题。这是另一种方法更适合于生产系统:
- 创建服务帐户
- 创建的服务帐户的关键,并下载JSON文件
- 授予适当的角色服务帐户
- 授予对斗
- 适当的权限的服务帐户上传服务帐户的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
范围存在安全性和稳定性,因为它允许该虚拟机完全访问属于同一项目的每个存储桶。您的文件存储服务器是否应该能够覆盖日志存储桶中的日志,或者读取另一个存储桶中的数据库备份?
你能用'--foreground'运行gcsfuse并用日志输出修改你的问题吗?如果没有用处,请尝试'--debug_gcs'和/或'--debug_fuse'。 – jacobsa
我用调试信息更新了这个问题。谢谢。 – user1476207