linux gcsfuse输入/输出错误

zqdjd7g9  于 2023-03-01  发布在  Linux
关注(0)|答案(8)|浏览(129)

当我尝试在安装在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控制台中创建目录,我可以很好地看到该目录。
nwlls2ji

nwlls2ji1#

从调试输出中的Insufficient Permission错误可以看出gcsfuse对您的bucket没有足够的权限,可能是只读访问。
请务必阅读gcsfuse的凭据文档,特别是,如果您在GCE VM上使用服务帐户,请务必使用storage-full访问范围设置VM。

c8ib6hqw

c8ib6hqw2#

您的问题确实源于权限不足,但您需要销毁并重新创建具有不同作用域的VM来解决此问题。下面是另一种更适合生产系统的方法:
1.创建服务帐户
1.为服务帐户创建密钥,然后下载JSON文件
1.向服务帐户授予适当的角色
1.向服务帐户授予对存储桶的适当权限
1.将服务帐户的JSON凭据上载到虚拟机
最后,定义一个环境变量,其中包含从命令行调用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忽略了活动的凭据帐户。
在创建VM时使用storage-full作用域会影响安全性和稳定性,因为它允许VM完全访问属于同一项目的每个存储桶。您的文件存储服务器真的应该能够覆盖日志存储桶中的日志,还是读取另一个存储桶中的数据库备份?

u5rb5r59

u5rb5r593#

此问题是由于缺少凭据文件造成的。

转到https://cloud.google.com/docs/authentication/production
正在创建服务帐户

  • 创建帐户后,您将获得一个json文件。
  • 在VM示例上上传你的json。
  • 在/etc/fstab中输入以下内容。

{{gcp存储桶名称}} {{装载路径}} gcsfuse rw,无自动,用户,密钥文件={{/路径/到/密钥. json}}
如果已经挂接,请先卸载。

  • $装入-a
    点击此链接

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

pcrecxhr

pcrecxhr4#

这个问题也可能发生在你已经设置了一些保留策略/规则在该桶.像我一样,我也得到了相同的输入/输出错误,当我试图更新任何文件内的挂载文件夹,根本原因是我添加了保留策略不删除任何文件之前1个月.

13z8s7eq

13z8s7eq5#

我时不时地会遇到这个问题,所以我想分享一下我的发现:
我使用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...

在开发过程中,我发现自己每隔一分钟就更新/覆盖文件。由于我的保留策略设置为60秒,因此在此时间内不允许任何修改或删除。解决方案是简单地缩短时间。

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

gstyhher

gstyhher6#

请检查虚拟机的云API访问范围设置,需要将其配置为允许对所有云API的完全访问

xqnpmsa8

xqnpmsa87#

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

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

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

gcxthw6b

gcxthw6b8#

如果存储桶是由服务帐户访问,请提供足够的权限,该服务帐户。存储管理员为我工作。

相关问题