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

Goofys 云存储挂载工具

Goofys Logo

Build Status Downloads Stack Overflow

什么是 Goofys?

Goofys 是一个用 Go 语言编写的高性能云存储挂载工具,能够将云对象存储(如 AWS S3、Azure Blob、Google Cloud Storage 等)挂载为本地文件系统。

核心特性

特性说明
高性能针对云存储特性优化,比传统 S3 文件系统(s3fs)快数倍
多后端支持支持 AWS S3、Azure Blob、Azure Data Lake、Google Cloud Storage、MinIO 等
配置驱动支持通过配置文件定义多个挂载点,实现一键部署
服务模式支持注册为系统服务,开机自动启动
类 POSIX兼容大部分 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

方式三:源码编译

export GOPATH=$HOME/work 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 配置。

第二步:挂载存储桶

# 基础挂载 goofys bucket-name /mnt/s3 # 挂载带前缀的路径 goofys bucket-name:prefix /mnt/s3 # 后台运行 goofys bucket-name /mnt/s3 &

配置驱动模式

对于生产环境,推荐使用配置文件管理多个挂载点。

配置文件位置

Goofys 会按以下顺序查找配置文件:

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

最小配置示例

# example/config.toml # 日志级别: debug, info, warn, error debug = false # 是否后台运行(交互模式生效) detach = true # 默认文件权限 uid = 1000 gid = 1000 dir_mode = "0755" file_mode = "0644" # 挂载选项 mount_options = ["allow_other"] # 定义挂载点 [mounts.my-s3] status = true # 启用此挂载 backend = "s3" # 后端类型 bucket = "my-bucket" # 存储桶名称 mount_path = "/mnt/s3" # 本地挂载路径 # 凭证(也可以通过环境变量或 AWS CLI 配置) # aws_access_key_id = "xxx" # aws_secret_access_key = "xxx"

配置命令

# 初始化配置文件(生成默认配置) goofys config init # 初始化到指定路径 goofys config init /etc/goofys/config.toml # 验证配置文件 goofys config validate # 查看配置解析路径 goofys config path

服务模式

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

# 安装服务 goofys service install /etc/goofys/config.toml # 启动服务 goofys service start # 查看状态 goofys service status

开机自动挂载(fstab)

/etc/fstab 中添加:

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

支持的云存储后端

AWS S3

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

MinIO

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

Azure Blob Storage

[mounts.az] backend = "azblob" bucket = "my-container" # Azure 连接字符串(推荐通过环境变量 AZURE_STORAGE_CONNECTION_STRING 设置) # 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前台运行后台运行
--debug开启调试日志关闭
--uid文件所有者 UID当前用户
--gid文件所属组 GID当前用户组
--file-mode文件权限0644
--dir-mode目录权限0755
--regionAWS 区域自动检测
--endpoint自定义 S3 兼容端点AWS S3
--stat-cache-ttl元数据缓存时间1小时
--type-cache-ttl类型缓存时间1小时

性能基准

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

基准测试结果

详细测试方法见 bench/bench.sh


已知限制

由于云存储与本地文件系统的本质差异,Goofys 存在以下非 POSIX 兼容行为:

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

常见问题

Q: 挂载后文件权限显示异常? A: 使用 --uid--gid--file-mode--dir-mode 参数指定。

Q: 挂载点无法访问? A: 检查 FUSE 是否安装,以及是否有足够权限。

Q: 如何提升性能? A: 调整缓存参数:--stat-cache-ttl 1h --type-cache-ttl 1h

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


参考资料


许可证

Apache License 2.0

Copyright (C) 2015 - 2019 Ka-Hing Cheung