Cloud Storage FUSE

本页面简要介绍了 Cloud Storage FUSE,这一 FUSE 适配器可让您将 Cloud Storage 存储桶作为本地文件系统进行装载和访问,以便应用可以读取内容并使用标准文件系统语义在存储桶中写入对象。Cloud Storage FUSE 是 Google 支持的开源产品。

如需了解如何使用 Cloud Storage FUSE,请参阅以下文档:

本文档始终反映了最新版本的 Cloud Storage FUSE。如需详细了解最新版本,请参阅 GitHub 上的 Cloud Storage FUSE 版本

Cloud Storage FUSE 的工作原理

Cloud Storage FUSE 会使用 FUSE 和 Cloud Storage API 透明地将存储桶公开为文件系统上的本地装载文件夹。

Cloud Storage FUSE 的工作原理为,将对象存储名称转换为文件和目录系统,并将对象名称中的斜杠字符(“/”)解释为目录分隔符,这样,系统就会将具有相同通用前缀的对象视为同一目录中的文件。应用可与装载的存储桶(如文件系统)进行交互,提供在云环境中运行的几乎无限的文件存储空间。 Cloud Storage FUSE 可在任何已连接到 Cloud Storage 的地方(包括 Google Kubernetes Engine、Compute Engine 虚拟机或本地系统)运行。

Cloud Storage FUSE 非常适合 Cloud Storage 可满足需要文件系统语义的应用的性能和可伸缩性要求的使用场景。例如,Cloud Storage FUSE 对于机器学习 (ML) 项目非常有用,因为它提供了一种将数据、模型、检查点和日志直接存储在 Cloud Storage 中的方法。如需了解详情,请参阅适用于机器学习工作负载的 Cloud Storage FUSE

Cloud Storage FUSE 与其他 Google Cloud 服务集成。例如,Cloud Storage FUSE CSI 驱动程序使您可以使用 Google Kubernetes Engine (GKE) API 将存储桶用作卷,以便您可以从 Kubernetes Pod 内读取和写入 Cloud Storage。如需详细了解其他集成,请参阅集成

限制

虽然 Cloud Storage FUSE 具有一个文件系统接口,但它与后端 NFS 或 CIFS 文件系统有所不同。此外,Cloud Storage FUSE 不符合 POSIX 标准。如需了解 Google Cloud 中的 POSIX 文件系统产品,请参阅 Filestore

使用 Cloud Storage FUSE 时,请注意其限制和语义,这与 POSIX 文件系统不同。Cloud Storage FUSE 只应在其功能内使用。

与 POSIX 文件系统的限制和区别

以下列表介绍了 Cloud Storage FUSE 的限制:

  • 元数据:将文件上传到 Cloud Storage 时,Cloud Storage FUSE 不会传输对象元数据,但 mtime 和 symlink 目标除外。这意味着,使用 Cloud Storage FUSE 上传文件时,您无法设置对象元数据。如果您需要保留对象元数据,请考虑使用 Google Cloud CLIJSON APIGoogle Cloud 控制台上传文件。
  • 并发:Cloud Storage FUSE 不会为对同一文件的多次写入提供并发控制。如果多次写入操作尝试替换某个文件,则最后一次写入的内容会生效,而先前写入的所有内容都会丢失。无法对后续覆盖内容实现合并、版本控制或用户通知。
  • 关联:Cloud Storage FUSE 不支持硬性链接。
  • 文件锁定和文件修补:Cloud Storage FUSE 不支持文件锁定或文件修补。因此,您不应将版本控制系统代码库存储在 Cloud Storage FUSE 装载点,因为版本控制系统依赖于文件锁定和修补。此外,您不应将 Cloud Storage FUSE 用作文件管理器替换项。
  • 语义:Cloud Storage FUSE 中的语义与传统文件系统中的语义不同。例如,上次访问时间等元数据不受支持,某些元数据操作(如目录重命名)也不是原子操作.如需查看 Cloud Storage FUSE 语义与传统文件系统语义之间的差异列表,请参阅 Cloud Storage FUSE GitHub 文档中的语义
  • 执行文件修补(或就地覆盖)的工作负载:Cloud Storage FUSE 只能一次性将整个对象写入 Cloud Storage,并且不提供修补机制。如果您尝试修补文件,Cloud Storage FUSE 将重新上传整个文件。此行为的唯一例外情况是,您可以将内容附加到大小为 2 MB 或更大的文件的末尾,这样 Cloud Storage FUSE 将仅重新上传附加的内容。
  • 访问权限:对文件的授权受 Cloud Storage 权限约束。POSIX 式访问权限控制将不起作用。
  • 性能:Cloud Storage FUSE 的延时要比本地文件系统长得多,因此不应用作存储数据库的后端。一次读取或写入一个小文件时,吞吐量可能会降低。使用大型文件和/或一次传输多个文件有助于提高吞吐量。
  • 可用性:使用 Cloud Storage FUSE 访问 Cloud Storage 时,有时可能会发生暂时性错误。建议您使用重试策略重试失败的操作。
  • 对象版本控制:Cloud Storage FUSE 未正式支持使用启用了对象版本控制的存储桶。尝试将 Cloud Storage FUSE 与启用了对象版本控制的存储桶搭配使用可能会产生不可预测的行为。
  • 文件转码:元数据中包含 content-encoding: gzip 的对象:Cloud Storage FUSE 装载目录中的任何此类对象都不会进行解压缩式转码。相反,对象会保持与其存储在存储桶中的方式相同的压缩方式。
    例如,使用带有 --gzip-local 标志gcloud storage cp 命令上传到存储桶的 1000 字节文件可能会变为 60 个字节(实际压缩大小取决于内容和 gcloud CLI 使用的 gzip 实现)作为 Cloud Storage 对象。如果使用 gcsfuse 装载存储桶,并且已在装载目录中列出或从中读取相应的文件,则其大小将返回 60 个字节,其内容是原始 1000 个字节的压缩版本内容。
    相比之下,使用 gcloud storage cp gs://bucket/path /local/path 进行的下载会经过解压缩式转码:在 gcloud 命令中,内容会在下载期间自动解压缩,并且提供未压缩的原始内容。
    注意:尝试使用 Cloud Storage FUSE 编辑或修改具有 content-encoding: gzip 的对象可能会产生不可预测的行为。这是因为 Cloud Storage FUSE 会按原样上传对象内容(不进行压缩),同时保留 content-encoding: gzip。如果这些内容未正确进行 gzip 压缩,其他客户端(如 gcloud CLI)可能无法从服务器读取该对象。这是因为其他客户端在读取时会使用解压缩式转码,如果 gzip 内容不正确,读取会失败。
  • 保留政策:Cloud Storage FUSE 不支持向具有保留政策的存储桶写入数据。如果您尝试写入具有保留政策的存储桶,则写入将失败。

    Cloud Storage FUSE 支持从具有保留政策的存储桶中读取对象,但必须在存储桶装载期间传递 -o RO 标志,从而将存储桶装载为 Read-Only

  • 本地存储空间:新增或经过修改的对象会完整存储在一个本地临时文件中,直至这些对象关闭或同步为止。使用大型文件时,请确保有足够的本地存储空间容量来存储文件的临时副本,尤其是在使用 Compute Engine 实例时。如需了解详情,请参阅 Cloud Storage FUSE GitHub 文档中的 README
  • 目录:Cloud Storage 以平面命名空间的形式运行。默认情况下,只有显式定义的目录(即作为 Cloud Storage 中的对象存在)才能显示在装载的文件系统中。隐式目录(仅作为其他文件或目录的路径名称一部分的目录)默认不会显示。如果您的文件的路径名称中包含隐式目录,则文件不会显示在整个目录树中,因为这些文件所在的隐式目录不会显示。不过,您可以使用标志来更改此行为。如需了解详情,请参阅 Cloud Storage FUSE GitHub 文档中的文件和目录

    Cloud Storage FUSE 不支持目录重命名。不能在 Cloud Storage 中以原子方式执行目录重命名;重命名目录涉及复制具有新名称的对象并删除原始对象。

  • 文件句柄限制:默认情况下,Linux 内核最多允许 1,024 个开放文件句柄。Cloud Storage FUSE 不应用作处理来自外部客户端的并发并行连接的服务器,因为这可能会超出开放文件句柄的数量上限。需要避免的一些常见应用场景包括从 Cloud Storage FUSE 装载传送 Web 内容,使用文件共享协议(例如 NFS 或 SMB)将 Cloud Storage FUSE 装载作为网络附加存储 (NAS) 公开,以及托管由 Cloud Storage FUSE 装载支持的文件传输协议 (FTP) 服务器。

框架、操作系统和架构

Cloud Storage FUSE 已通过以下框架进行验证:

  • TensorFlow V2.x

  • TensorFlow V1.x

  • PyTorch V2.x

  • PyTorch V1.x

  • JAX 0.4.x

Cloud Storage FUSE 支持以下操作系统和架构:

  • Ubuntu 18.04 或更高版本

  • Debian 10 或更高版本

  • CentOS 7.9 或更高版本

  • RHEL 7.9 或更高版本

  • x86_64

  • ARM64

获取支持

您可以使用 Google Cloud 的官方支持渠道获取支持、提交一般问题,以及请求新功能。此外,您还可以通过在 GitHub 中提交问题来获取支持。

如需了解常见问题的解决方案,请参阅 Cloud Storage FUSE GitHub 文档中的问题排查

Cloud Storage FUSE 的价格

Cloud Storage FUSE 可免费使用,但对于存储空间、元数据以及 Cloud Storage FUSE 与 Cloud Storage 之间产生的网络 I/O,系统将会像其他任何 Cloud Storage 接口一样进行计费。换句话说,Cloud Storage FUSE 所执行的所有数据传输和操作都会映射到 Cloud Storage 传输和操作,并相应地进行计费。 如需详细了解常见的 Cloud Storage FUSE 操作及其如何映射到 Cloud Storage 操作,请参阅操作映射

为避免产生意外费用,您应该根据自己的 Cloud Storage FUSE 使用量折算一下相应的 Cloud Storage 费用。例如,如果您使用 Cloud Storage FUSE 存储日志文件,并且有数百或数千台机器同时大量刷新日志,费用可能会增长很快。

如需了解存储、网络用量和操作等费用,请参阅 Cloud Storage 价格

Cloud Storage FUSE 操作与 Cloud Storage 操作的映射

使用 Cloud Storage FUSE 执行操作时,您还会执行与 Cloud Storage FUSE 操作关联的 Cloud Storage 操作。下表介绍了常见的 Cloud Storage FUSE 命令及其关联的 Cloud Storage JSON API 操作。您可以使用 --debug_gcs 标志显示有关 Cloud Storage FUSE 操作的信息。

命令 JSON API 操作
gcsfuse --debug_gcs example-bucket mp Objects.list(用于检查凭据)
cd mp 不适用
ls mp Objects.list("")
mkdir subdir

Objects.get("subdir")

Objects.get("subdir/")

Objects.insert("subdir/")

cp ~/local.txt subdir/

Objects.get("subdir/local.txt")

Objects.get("subdir/local.txt/")

Objects.insert("subdir/local.txt")(用于创建空对象)

Objects.insert("subdir/local.txt")(完成写入后关闭时)

rm -rf subdir

Objects.list("subdir")

Objects.list("subdir/")

Objects.delete("subdir/local.txt")

Objects.list("subdir/")

Objects.delete("subdir/")

已知问题

如需查看 Cloud Storage FUSE 的已知问题列表,请参阅 GitHub

后续步骤