GCP 存储桶可在 UI 中访问,但不能通过 Cloud Shell 中的 gcsfuse

Posted

技术标签:

【中文标题】GCP 存储桶可在 UI 中访问,但不能通过 Cloud Shell 中的 gcsfuse【英文标题】:GCP bucket reachable in UI but not by gcsfuse in the cloud shell 【发布时间】:2021-11-24 05:24:45 【问题描述】:

嗨,我想从云 shell 终端访问 GCP 存储桶中的一些文件(出于 sftp 原因),gcsfuse 成功挂载了父目录,并且它具有除我需要的目录之外的所有目录,任何想法我做错了什么?

【问题讨论】:

检查 gcsfuse 用于访问所需文件的权限。似乎还可以使用日志记录选项运行诊断......请参阅github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/… 你能找到想要的目录吗?上面的github链接对你有帮助吗? 不,最终使用 gsutil cp 【参考方案1】:

在 Google Cloud Storage 中,以斜杠 (/) 结尾的对象名称表示一个目录,而所有其他对象名称表示一个文件。默认情况下,目录不是隐式定义的,它们仅在以斜杠(/)结尾的匹配对象存在时才存在。

由于像mkdir 这样的普通文件系统操作会做正确的事情,如果有人只使用gcsfuse 设置存储桶的结构,那么他们不会注意到这有什么奇怪的。但是,如果有人使用其他工具在 Google Cloud Storage 中设置对象(例如 Google Cloud Console 中的存储浏览器),他们可能会注意到在为对象创建前导目录之前并非所有对象都是可见的。

例如,假设某人通过在 Google Cloud Console 的存储浏览器部分中选择文件夹上传选项上传了一个对象 demo/start.txt,然后使用 gcsfuse 挂载它。文件系统最初会显示为空,因为没有 demo/ 对象。但是,如果他们随后运行mkdir demo,他们现在将看到一个名为demo 的目录,其中包含一个名为start.txt 的文件。

为缓解此问题,gcsfuse 支持名为 --implicit-dirs 的标志。启用此标志后,名称查找请求使用 Google Cloud Storage API 的 Objects.list 操作来搜索将隐式定义具有相关名称的目录存在的对象。因此,在上面的示例中,将出现一个名为 demo 的目录,其中包含一个文件 start.txt

因此,在您的情况下,我怀疑您看不到的文件是您在 Google Cloud Storage 存储桶中上传的文件夹。由于您已经使用目录挂载了gcsfuse,如果再次使用标志--implicit-dirs 挂载它,它将引发错误。所以我建议你通过运行以下命令来卸载目录 -

fusermount -u /path/to/mount/directory

然后通过运行以下命令再次挂载目录-

gcsfuse --implicit-dirs BUCKET_NAME /path/to/mount/directory

您还可以创建一个新目录并使用 gcsfuse 挂载该目录,而无需卸载现有的挂载目录。

请注意,--implicit-dirs 标志有一些缺点。我建议您通过this github issue 获取有关它的详细信息。

【讨论】:

这能解决问题吗? 如果您考虑接受答案,如果它对您有帮助,我将不胜感激。

以上是关于GCP 存储桶可在 UI 中访问,但不能通过 Cloud Shell 中的 gcsfuse的主要内容,如果未能解决你的问题,请参考以下文章

不使用 gcloud 实用程序从 docker 容器访问 GCP 云存储桶

将内容上传到 GCP 存储桶的 KMS 权限出现 403 错误

GCP 存储 - 如何创建一个脚本,将所有文件/文件夹从一个存储桶复制到另一个存储桶,但文件夹结构不同

同一个 GCP 项目中的 Kubeflow 管道存储访问错误?

在 GCP 存储桶中创建对象时触发通过 Cloud Run 部署的数据流作业

使用 sql server 作业上传到 gcp 存储桶