s3fs

s3fs 允许 Linux、macOS 和 FreeBSD 通过 FUSE(用户空间文件系统) 挂载 S3 存储桶。
s3fs 使您能够像操作本地文件系统一样操作 S3 存储桶中的文件和目录。
s3fs 保留文件的原生对象格式,允许使用其他工具,如 AWS CLI

s3fs-fuse CI Twitter Follow

s3fs-fuse

特性

  • 支持大部分 POSIX 特性,包括文件读取/写入、目录、符号链接、模式、uid/gid 和扩展属性
  • 与 Amazon S3 兼容,也支持其他 基于 S3 的对象存储
  • 支持随机写入和追加
  • 支持大文件的多部分上传
  • 通过服务器端复制支持重命名
  • 可选的服务器端加密
  • 数据完整性通过 MD5 哈希值保证
  • 内存中的元数据缓存
  • 本地磁盘数据缓存
  • 支持用户指定区域,包括 Amazon GovCloud
  • 支持通过 v2 或 v4 签名进行身份验证

安装

许多系统提供了预构建的安装包:

  • Amazon Linux 通过 EPEL 安装:

    sudo amazon-linux-extras install epel
    sudo yum install s3fs-fuse
    
  • Arch Linux:

    sudo pacman -S s3fs-fuse
    
  • Debian 9 和 Ubuntu 16.04 或更新版本:

    sudo apt install s3fs
    
  • Fedora 27 或更新版本:

    sudo dnf install s3fs-fuse
    
  • Gentoo:

    sudo emerge net-fs/s3fs
    
  • RHEL 和 CentOS 7 或更新版本通过 EPEL 安装:

    sudo yum install epel-release
    sudo yum install s3fs-fuse
    
  • SUSE 12 和 openSUSE 42.1 或更新版本:

    sudo zypper install s3fs
    
  • macOS 10.12 和更新版本通过 Homebrew 安装:

    brew install --cask macfuse
    brew install gromgit/fuse/s3fs-mac
    
  • FreeBSD:

    pkg install fusefs-s3fs
    
  • Windows:

    Windows 有自己的安装方式,详情请见 此链接

否则,请参考 编译说明

示例

s3fs 支持标准的 AWS 凭证文件,该文件存储在 ${HOME}/.aws/credentials 中。或者,s3fs 也支持自定义密码文件。最后,s3fs 会识别 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 环境变量。

s3fs 密码文件的默认位置可以通过以下方式创建:

  • 使用用户主目录中的 .passwd-s3fs 文件(即 ${HOME}/.passwd-s3fs
  • 使用系统范围的 /etc/passwd-s3fs 文件

将凭证输入文件 ${HOME}/.passwd-s3fs 并设置仅限用户访问的权限:

echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs
chmod 600 ${HOME}/.passwd-s3fs

使用现有的存储桶 mybucket 和目录 /path/to/mountpoint 运行 s3fs:

s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs

如果遇到错误,可以启用调试输出:

s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs -o dbglevel=info -f -o curldbg

您还可以通过将以下行添加到 /etc/fstab 文件来在启动时自动挂载:

mybucket /path/to/mountpoint fuse.s3fs _netdev,allow_other 0 0

如果您使用的是非 Amazon S3 实现,可以指定 URL 和路径请求样式:

s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs -o url=https://url.to.s3/ -o use_path_request_style

或(fstab 文件)

mybucket /path/to/mountpoint fuse.s3fs _netdev,allow_other,use_path_request_style,url=https://url.to.s3/ 0 0

注意:您可能还需要先创建全局凭证文件

echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > /etc/passwd-s3fs
chmod 600 /etc/passwd-s3fs

注意2:您可能还需要确保 netfs 服务在启动时启动。

限制

通常,S3 无法提供与本地文件系统相同的性能或语义。

具体来说:

  • 文件的随机写入或追加需要重写整个对象,并通过多部分上传复制进行优化
  • 由于网络延迟,列出目录等元数据操作的性能较差
  • 非 AWS 提供商可能具有 最终一致性,因此读取可能会暂时返回过时数据(AWS 从 2020 年 12 月起提供 写后读一致性
  • 不支持原子重命名文件或目录
  • 多个客户端挂载相同存储桶时无法协调
  • 不支持硬链接
  • inotify 仅检测本地修改,不检测其他客户端或工具的外部修改

参考资料

  • CSI for S3 - Kubernetes CSI 驱动
  • docker-s3fs-client - 包含 s3fs 的 Docker 镜像
  • goofys - 类似于 s3fs,但具有更好的性能和较少的 POSIX 兼容性
  • s3backer - 将 S3 存储桶挂载为单个文件
  • S3Proxy - 与 s3fs 配合使用,挂载 Backblaze B2、EMC Atmos、Microsoft Azure 和 OpenStack Swift 存储桶
  • s3ql - 类似于 s3fs,但使用自己的对象格式
  • YAS3FS - 类似于 s3fs,但使用 SNS 允许多个客户端挂载一个存储桶

常见问题解答

许可证

Copyright (C) 2010 Randy Rizun rrizun@gmail.com

根据 GNU GPL 第 2 版许可

参考资料

https://github.com/s3fs-fuse/s3fs-fuse/blob/master/README.md