logo
0
0
WeChat Login
docs: rewrite documentation with improved structure and Chinese localization

Goofys 云存储挂载工具

Goofys Logo

构建状态 下载量 Stack Overflow

什么是 Goofys?

Goofys 是一款用 Go 语言编写的高性能云存储挂载工具,能够将 AWS S3、Azure Blob、Google Cloud Storage、MinIO 等云对象存储服务挂载为本地文件系统,像使用普通文件夹一样访问云端数据。

核心特性

特性说明
高性能针对云存储特性深度优化,比传统 s3fs 快数倍
多后端支持AWS S3、Azure Blob、Azure Data Lake、Google Cloud Storage、MinIO、Ceph 等
配置驱动支持配置文件定义多个挂载点,部署简单
服务模式支持注册为系统服务,开机自动启动
类 POSIX兼容大部分常用文件操作

设计理念

Goofys 追求性能优先,而非完全的 POSIX 兼容。这是因为云对象存储与本地文件系统有本质区别:

  • 云存储不支持随机写入 → 仅支持顺序追加写入
  • 云存储不存储文件权限 → 通过参数统一指定
  • 云存储有网络延迟 → 优化请求减少往返次数

如需本地缓存加速,可配合 catfs 使用。


快速开始

环境要求

  • Linux 或 macOS 操作系统
  • FUSE 驱动(Linux 需要安装 fuse 包,macOS 需要安装 osxfuse
  • Go 1.25+(仅从源码编译时需要)

安装

方式一:下载预编译程序(推荐)

# Linux x86_64 curl -L https://github.com/kahing/goofys/releases/latest/download/goofys -o /usr/local/bin/goofys chmod +x /usr/local/bin/goofys # macOS(需要先安装 osxfuse) brew install goofys

方式二:Homebrew(macOS)

brew cask install osxfuse brew install goofys

方式三:源码编译

# 确保 Go 1.25+ 已安装 go install github.com/kahing/goofys@latest

第一步:配置凭证

创建 AWS 凭证文件 ~/.aws/credentials

[default] aws_access_key_id = AKID1234567890 aws_secret_access_key = MY-SECRET-KEY

提示:也支持通过环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 配置,或使用 AWS CLI 的 aws configure 命令。

第二步:挂载存储桶

# 最简单的方式:直接挂载 goofys bucket-name /mnt/s3 # 挂载带前缀的路径(只挂载特定目录) goofys bucket-name:prefix /mnt/s3 # 后台运行 goofys bucket-name /mnt/s3 & # 查看帮助 goofys --help

配置驱动模式(推荐用于生产环境)

对于生产环境,推荐使用配置文件管理多个挂载点,实现一键部署。

配置文件位置

Goofys 会按以下顺序查找配置文件,找到第一个存在的即可:

  1. 命令行指定:--config /path/to/config.toml
  2. ~/.config/goofys/config.toml
  3. ~/.goofys.toml
  4. /etc/goofys/config.toml

初始化配置文件

# 在默认位置生成配置 goofys config init # 指定路径生成配置 goofys config init /etc/goofys/config.toml # 验证配置文件是否正确 goofys config validate # 查看实际使用的配置文件路径 goofys config path

配置示例

创建 /etc/goofys/config.toml

# 全局配置 debug = false # 是否后台运行 # 注意:作为系统服务运行时,此选项无效 detach = true # 默认文件权限 uid = 1000 # 文件所有者 gid = 1000 # 文件所属组 dir_mode = "0755" # 目录权限 file_mode = "0644" # 文件权限 # 挂载选项 mount_options = ["allow_other"] # ==================== 挂载点定义 ==================== # 第一个挂载点:AWS S3 [mounts.s3] status = true # 启用此挂载 backend = "s3" # 后端类型 bucket = "my-bucket" # S3 存储桶名称 mount_path = "/mnt/s3" # 本地挂载路径 # 凭证可通过环境变量或 AWS CLI 配置,此处也可直接指定 # aws_access_key_id = "xxx" # aws_secret_access_key = "xxx" # 第二个挂载点:MinIO [mounts.minio] status = true backend = "minio" bucket = "my-minio-bucket" mount_path = "/mnt/minio" endpoint = "https://minio.example.com:9000" signature_version = "v4"

服务模式

将 Goofys 注册为系统服务,实现开机自动启动:

# 安装服务(需要 root 权限) goofys service install /etc/goofys/config.toml # 启动服务 goofys service start # 查看服务状态 goofys service status # 停止服务 goofys service stop

开机自动挂载(fstab)

/etc/fstab 中添加一行:

goofys#bucket-name /mnt/s3 fuse _netdev,allow_other,--file-mode=0666,--dir-mode=0777 0 0

支持的云存储后端

AWS S3

[mounts.aws] backend = "s3" bucket = "my-bucket" # 可选:指定区域 # region = "us-west-2"

MinIO

[mounts.minio] backend = "minio" bucket = "my-bucket" endpoint = "https://minio.example.com:9000" signature_version = "v4"

Azure Blob Storage

[mounts.azure] backend = "azblob" bucket = "my-container" # 推荐通过环境变量配置连接字符串 # connection_string = "xxx"

Azure Data Lake Gen2

[mounts.adl] backend = "adlgen2" bucket = "my-filesystem" endpoint = "https://myaccount.dfs.core.windows.net"

Google Cloud Storage

[mounts.gcs] backend = "gcs" bucket = "my-bucket" # 使用应用默认凭证(ADC) # credentials_file = "/path/to/service-account.json"

常用命令行参数

参数说明默认值
-f, --foreground前台运行,不fork到后台后台运行
--debug开启调试日志关闭
--uid文件所有者用户ID当前用户
--gid文件所属组ID当前用户组
--file-mode新建文件权限0644
--dir-mode新建目录权限0755
--regionAWS 区域自动检测
--endpointS3 兼容服务地址AWS S3
--stat-cache-ttl文件元数据缓存时间1小时
--type-cache-ttl文件类型缓存时间1小时
--profileAWS 凭证配置名default

性能基准测试

在 AWS EC2 m5.4xlarge(us-west-2a)实例上测试,连接到 us-west-2 的 S3 存储桶:

基准测试结果

详细测试方法和原始数据见 bench/bench.sh

运行自己的基准测试

# 确保 EC2 实例角色有 S3 写入权限 sudo docker run -e BUCKET=$TESTBUCKET -e CACHE=false \ --rm --privileged --net=host \ -v /tmp/cache:/tmp/cache kahing/goofys-bench # 结果会写入 $TESTBUCKET

已知限制(非 POSIX 兼容)

由于云存储与本地文件系统的本质差异,Goofys 存在以下特性:

限制说明应对方式
顺序写入仅支持追加写入,不支持随机 seek使用追加模式写入
权限模拟不存储文件权限使用 --file-mode 参数
无链接不支持符号链接和硬链接-
时间戳ctimeatime 始终等于 mtime-
目录重命名无法重命名包含超过 1000 个子项的目录分批重命名
删除行为unlink 即使文件不存在也返回成功-
同步fsync 被忽略,数据在 close 时刷新-

常见问题

Q: 挂载后文件权限显示为 root? A: 使用 --uid--gid 参数指定正确的用户 ID。

Q: 挂载点无法访问,提示 permission denied? A: 检查 FUSE 是否正确安装,确保当前用户在 fuse 用户组中。

Q: 如何提升文件列表加载速度? A: 调整缓存参数:goofys --stat-cache-ttl 1h --type-cache-ttl 1h bucket /mnt/s3

Q: 支持哪些 Linux 发行版? A: 主流发行版均可(Ubuntu、Debian、CentOS、RHEL、Fedora、Arch 等)。

Q: 可以同时挂载多个存储桶吗? A: 可以,使用配置文件定义多个 [mounts.xxx] 即可。


参考链接


许可证

Apache License 2.0

版权所有 (C) 2015 - 2019 Ka-Hing Cheung