当我尝试在安装在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文件到服务器,并将它们存储在谷歌存储桶,而不是本地存储。
- 更新**我修改了命令以获取一些调试信息:
gcsfuse --implicit-dirs --foreground --debug_gcs --debug_fuse backup01-bucket /mnt/backups
然后以transfer
用户身份运行mkdir /mnt/backups/test
。
下面是一些信息:
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控制台中创建目录,我可以很好地看到该目录。
8条答案
按热度按时间nwlls2ji1#
从调试输出中的
Insufficient Permission
错误可以看出gcsfuse对您的bucket没有足够的权限,可能是只读访问。请务必阅读gcsfuse的凭据文档,特别是,如果您在GCE VM上使用服务帐户,请务必使用
storage-full
访问范围设置VM。c8ib6hqw2#
您的问题确实源于权限不足,但您不需要销毁并重新创建具有不同作用域的VM来解决此问题。下面是另一种更适合生产系统的方法:
1.创建服务帐户
1.为服务帐户创建密钥,然后下载JSON文件
1.向服务帐户授予适当的角色
1.向服务帐户授予对存储桶的适当权限
1.将服务帐户的JSON凭据上载到虚拟机
最后,定义一个环境变量,其中包含从命令行调用gcsfuse时服务帐户凭据的路径:
使用
key_file
选项在fstab
中完成相同的操作。这两个选项都在gcsfuse凭据文档中进行了说明。(编辑:此选项已记录,但对我不起作用。)有趣的是,即使您已使用以下内容在VM上配置了服务帐户,您也需要使用环境变量或
key_file
选项:出于某种原因,gcsfuse忽略了活动的凭据帐户。
在创建VM时使用
storage-full
作用域会影响安全性和稳定性,因为它允许VM完全访问属于同一项目的每个存储桶。您的文件存储服务器真的应该能够覆盖日志存储桶中的日志,还是读取另一个存储桶中的数据库备份?u5rb5r593#
此问题是由于缺少凭据文件造成的。
转到https://cloud.google.com/docs/authentication/production
正在创建服务帐户
{{gcp存储桶名称}} {{装载路径}} gcsfuse rw,无自动,用户,密钥文件={{/路径/到/密钥. json}}
如果已经挂接,请先卸载。
点击此链接
https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/mounting.md#credentials
pcrecxhr4#
这个问题也可能发生在你已经设置了一些保留策略/规则在该桶.像我一样,我也得到了相同的输入/输出错误,当我试图更新任何文件内的挂载文件夹,根本原因是我添加了保留策略不删除任何文件之前1个月.
13z8s7eq5#
我时不时地会遇到这个问题,所以我想分享一下我的发现:
我使用
minikube
进行开发,使用GCP进行生产。我有以下postStart生命周期钩子:
在创建pod之前,我通过运行以下两个命令在本地配置了权限:
在远程创建集群时,我启用了权限,如下所示:
在开发过程中,我发现自己每隔一分钟就更新/覆盖文件。由于我的保留策略设置为60秒,因此在此时间内不允许任何修改或删除。解决方案是简单地缩短时间。
这不是一个最终的解决方案,但希望其他人发现它有用。
gstyhher6#
请检查虚拟机的云API访问范围设置,需要将其配置为允许对所有云API的完全访问
xqnpmsa87#
它适用于fstab中的以下条目:
注意:请勿在存储桶名称中添加“gs://”。
gcxthw6b8#
如果存储桶是由服务帐户访问,请提供足够的权限,该服务帐户。存储管理员为我工作。