Skip to content

挂载 Bucket 为本地文件系统(FUSE Mount)

用 FUSE 把对象存储 bucket 挂载成 Linux 本地目录,就能用 ls / cp / cat 等普通文件命令直接操作云端对象。本文以阿里云 OSS 的 OSSFS2 为主讲透 安装、挂载与 Security Key 处理,并覆盖 AWS S3(mountpoint-s3 / s3fs-fuse)、 S3 兼容端点(R2 / MinIO / Supabase)、以及通用方案 rclone。 通用用法见 基本用法,供应商差异见 供应商对比

概述

FUSE(Filesystem in Userspace)让一个用户态进程把对象存储的 API 翻译成 POSIX 文件操作:挂载后 ls /mnt/bucket 实际发出的是 ListObjects 请求, cat /mnt/bucket/a.txt 是 GetObject。

适合的场景

  • 数据搬移:桶间 / 云间迁移、下载到本地、批量归档
  • 大数据 / AI 训练:把云端数据当本地路径读(顺序读友好)
  • 用现有本地工具(find、tar、diff……)直接处理云端文件,不改代码

限制(务必先了解)

  • 不是完整 POSIX:OSSFS2 针对顺序 / 随机读 + 追加写优化;mountpoint-s3 基本是 读 + 追加写;随机写、硬链接、部分元数据语义不支持
  • 小文件、随机读写的性能明显差于对象存储原生 API / SDK
  • 多机并发写没有锁协调,需要业务自己保证一致性
  • 挂载是单机行为:改代码直接改用 SDK 往往比挂载更合适(详见 基本用法 的直传模型)

各家工具速览

Bucket 推荐工具 备注
阿里云 OSS ossfs2(新,C++)/ ossfs1(旧) 官方,本页重点
AWS S3 mountpoint-s3(官方)/ s3fs-fuse 官方工具读吞吐高
Cloudflare R2 s3fs-fuse / rclone S3 兼容端点
MinIO s3fs-fuse / rclone S3 兼容端点
Supabase Storage 任意 S3 兼容工具 先开启 S3 协议

阿里云 OSS:OSSFS2(重点)

是什么

  • aliyun/ossfs 仓库的 main 分支就是 OSSFS2(C++,基于 libfuse3 Low-Level API + PhotonLibOS 协程 HTTP 客户端, Apache 2.0);旧版 OSSFS1 在 main-v1 分支,仍会维护
  • 相比 OSSFS1,官方 benchmark 显示单线程顺序大文件写吞吐提升约 18 倍、 128 线程小文件并发读提升 20 倍以上(面向 AI 训练、大数据等场景)

安装

  • Releases 下载预编译包:
  • Ubuntu(14.04+)→ .debsudo dpkg -i <ossfs2>.deb
  • Alibaba Cloud Linux 2/3、CentOS 7/8 → .rpmsudo yum install <ossfs2>.rpm -y
  • aarch64 目前仅 Alibaba Cloud Linux 3 提供
  • 其他发行版源码编译(GCC 9–13、CMake 3.8+)
  • 验证:ossfs2 --version

挂载

ossfs2 mount /mnt/oss \
  --oss_endpoint=oss-cn-hangzhou.aliyuncs.com \
  --oss_bucket=my-bucket

ls /mnt/oss                      # 像本地目录一样操作
echo "123" > /mnt/oss/test.txt
umount /mnt/oss                  # 卸载
  • 只挂桶内某个前缀:加 --oss_bucket_prefix=demo/
  • 同地域 ECS 内网访问免流量:endpoint 用内网地址 oss-cn-hangzhou-internal.aliyuncs.com
  • 调试:--log_level=debug,日志默认写 /tmp/ossfs2(多个 ossfs2 进程时 建议各配 --log_dir 隔离)
  • 参数也可以用配置文件组织(官方 configure-ossfs-2-0 文档);全部选项见 ossfs2 mount --help

Security Key 处理(重点)

OSSFS2 支持四种凭据来源,安全性差异很大:

方式 用法 安全性 建议
ECS 实例 RAM 角色 --ram_role=<角色名>(v2.0.2+) 最高:无 AK 落盘、无明文 ✅ 生产首选(在 ECS 内)
外部进程取凭据 --credential_process=<命令>(v2.0.5+) 高:凭据不出现在命令行/文件 ✅ 推荐(对接密钥管理 / 临时凭证)
环境变量 OSS_ACCESS_KEY_ID / OSS_ACCESS_KEY_SECRET 高:不进 ps 参数 ✅ 常用
挂载参数 --oss_access_key_id / --oss_access_key_secret 低:ps、shell 历史可见 ❌ 避免(官方也不推荐)

要点:

  • 绝不用主账号 AccessKey:建专用 RAM 用户,只授权目标 bucket 的最小权限 (RAM Policy 收敛到 my-bucket
  • 环境变量方式适合 systemd unit(Environment=)或启动脚本先 source 再执行挂载命令,明文不进命令行
  • credential_process 由外部命令返回凭据(类似 AWS 的 credential_process, 输出 JSON 含 AccessKeyId / AccessKeySecret / Expiration / SecurityToken), 可对接 KMS / 凭据管家 / STS 服务,实现密钥不落地、自动轮换
  • 需要临时凭证(STS)时走 credential_process 注入,避免长期 AK 常驻

AWS S3:mountpoint-s3 与 s3fs-fuse

  • mountpoint-s3(AWS 官方):走标准 AWS 凭据链(环境变量 → ~/.aws/credentials → IAM 角色),一条命令挂载:
    mount-s3 my-bucket /mnt/s3
    
    读吞吐高、内存占用低;写为创建 + 追加写,不支持随机写等完整 POSIX 语义。 适合读多写少、大数据分析场景。
  • s3fs-fuses3fs-fuse/s3fs-fuse): POSIX 语义更完整,兼容更多场景。凭据三选一:
  • 密码文件:echo "AK:SK" > ~/.passwd-s3fs && chmod 600 ~/.passwd-s3fs, 挂载时 -o passwd_file=~/.passwd-s3fs(默认也会读 ~/.passwd-s3fs / /etc/passwd-s3fs
  • 环境变量:AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN
  • AWS 标准凭据文件 ~/.aws/credentials

S3 兼容端点:R2 / MinIO / Supabase

同一套 s3fs-fuse 指向不同端点即可:

s3fs my-bucket /mnt/s3 \
  -o passwd_file=~/.passwd-s3fs \
  -o url=https://<ACCOUNT_ID>.r2.cloudflarestorage.com \
  -o use_path_request_style
  • Cloudflare R2url 用账号派生端点(https://<ACCOUNT_ID>.r2.cloudflarestorage.com); 常见示例带 use_path_request_style(R2 同时支持路径式与虚拟主机式寻址, 后者即 r2-client 原型默认行为)
  • MinIOurl=http://127.0.0.1:9000 + use_path_request_style (本地无虚拟主机 DNS,必须路径式寻址)
  • Supabase Storage:先开启 S3 协议(本地 supabase/config.toml[storage.s3_protocol] enabled = true;云端在 dashboard 的 Storage → S3 Access Keys 页面生成一对 S3 凭据),拿到 endpoint 与 region 后用任意 S3 兼容工具挂载。注意:Supabase 的 S3 凭据绕过 RLS、拥有全桶权限,只能 放在服务端,绝不能进浏览器 / 客户端

通用方案:rclone mount

一个工具覆盖 OSS / S3 / R2 / MinIO / Supabase 等几乎所有对象存储:

rclone config                                   # 交互生成 rclone.conf
rclone mount <remote>:<prefix> /mnt/...         # 挂载
  • 配置存在 rclone.conf;密码默认以 rclone obscure 混淆存储(注意:混淆 可逆,不是加密——只是防眼睛,不是防窃取)
  • 生产可完全绕开配置文件:用环境变量注入,如 RCLONE_CONFIG_<remote>_TYPE=s3RCLONE_CONFIG_<remote>_ACCESS_KEY_ID=..., 配合密钥管理注入,明文不落盘

Security Key 通用处理原则(总结)

  1. 不把 AK/SK 明文写进命令行参数 —— ps 可见、shell 历史残留,等于泄露
  2. 凭据来源优先级:实例 / 云角色 > 外部进程取凭据(credential_process)> 环境变量 > 独立密码文件(chmod 600)> 混淆存储(obscure)
  3. 最小权限:专用 RAM / IAM 用户,只授目标 bucket,禁用主账号 AK
  4. 生产优先临时凭证(STS / 角色),避免长期 AK 常驻;临时凭证自动过期
  5. 自动挂载(fstab / systemd)的凭据单独管理:fstab 里写密码文件路径而非 明文,systemd 用 EnvironmentFile 或注入环境变量
  6. 泄露即吊销:RAM 删除 / 停用 AccessKey、R2 删除 API Token、Supabase 重新生成 S3 Keys

参考

Backlinks (3)
flowchart LR
  n0["AI"]
  n1["Database"]
  n2["Dev Tools"]
  n3["Emoji"]
  n4["Frontend"]
  n5["Game Dev"]
  n6["Collection"]
  n7["Languages"]
  n8["Maps"]
  n9["Media"]
  n10["Monitor"]
  n11["Plans"]
  n12["Knowledge"]
  n13["Cloud"]
  n14["对象存储基本用法(Bucket / Object / 常用操作)"]
  n15["对象存储数据迁移(R2 → MinIO / 跨厂商搬迁)"]
  n16["Object Storage"]
  n17["挂载 Bucket 为本地文件系统(FUSE Mount)"]
  n18["对象存储签名 URL(Signed URL)原理与实战"]
  n19["对象存储供应商对比(S3 / R2 / OSS / Supabase / MinIO)"]
  n20["Infrastructure"]
  n21["Prototypes"]
  n22["Research"]
  n23["Better Auth 源码阅读指南"]
  n24["DuckDB 环境与基本使用"]
  n25["DuckDB 实战研究"]
  n26["DuckDB 模拟数据"]
  n27["PostgreSQL 数据用 DuckDB 加速查询"]
  n28["Hollow Knight 英语主题"]
  n29["英语学习 Dashboard"]
  n30["English Scraps Archive"]
  n31["English Scraps 使用指南"]
  n32["Jellyfin 源码阅读指南"]
  n33["Lux 资料整理"]
  n34["Nest Commander 学习资料"]
  n35["NestJS 源码阅读指南"]
  n36["Protomaps 自建底图研究"]
  n37["自制 PMTiles 地图(最简单例子)"]
  n38["MapLibre 集成 Protomaps"]
  n39["PMTiles 格式与工具链"]
  n40["上海地区底图项目"]
  n41["Redash 源码阅读指南"]
  n42["Rust 学习计划"]
  n43["shadcn/ui 源码阅读指南"]
  n44["TRIP 项目核心原理与代码阅读指南"]
  n1 --> n25
  n6 --> n0
  n6 --> n1
  n6 --> n2
  n6 --> n3
  n6 --> n4
  n6 --> n5
  n6 --> n7
  n6 --> n8
  n6 --> n9
  n6 --> n10
  n6 --> n11
  n6 --> n22
  n12 --> n20
  n13 --> n16
  n14 --> n15
  n14 --> n18
  n14 --> n19
  n14 --> n21
  n15 --> n14
  n15 --> n17
  n15 --> n18
  n15 --> n19
  n16 --> n14
  n16 --> n15
  n16 --> n17
  n16 --> n18
  n16 --> n19
  n17 --> n14
  n17 --> n18
  n17 --> n19
  n18 --> n21
  n19 --> n14
  n19 --> n15
  n19 --> n18
  n19 --> n21
  n20 --> n13
  n21 --> n14
  n21 --> n17
  n21 --> n18
  n21 --> n19
  n21 --> n36
  n22 --> n23
  n22 --> n25
  n22 --> n29
  n22 --> n32
  n22 --> n33
  n22 --> n34
  n22 --> n35
  n22 --> n36
  n22 --> n41
  n22 --> n42
  n22 --> n43
  n22 --> n44
  n24 --> n26
  n25 --> n1
  n25 --> n22
  n25 --> n24
  n25 --> n26
  n25 --> n27
  n26 --> n24
  n26 --> n27
  n27 --> n25
  n27 --> n26
  n28 --> n31
  n29 --> n28
  n29 --> n30
  n29 --> n31
  n31 --> n29
  n31 --> n30
  n36 --> n8
  n36 --> n37
  n36 --> n38
  n36 --> n39
  n36 --> n40
  n37 --> n39
  n38 --> n21
  n38 --> n40
  n39 --> n37
  n39 --> n40
  n40 --> n38
  n40 --> n39
  click n0 "../../../../../collection/ai/" "AI"
  click n1 "../../../../../collection/database/" "Database"
  click n2 "../../../../../collection/dev-tools/" "Dev Tools"
  click n3 "../../../../../collection/emoji/" "Emoji"
  click n4 "../../../../../collection/frontend/" "Frontend"
  click n5 "../../../../../collection/game-dev/" "Game Dev"
  click n6 "../../../../../collection/" "Collection"
  click n7 "../../../../../collection/languages/" "Languages"
  click n8 "../../../../../collection/maps/" "Maps"
  click n9 "../../../../../collection/media/" "Media"
  click n10 "../../../../../collection/monitor/" "Monitor"
  click n11 "../../../../../collection/scraps/plans/" "Plans"
  click n12 "../../../../" "Knowledge"
  click n13 "../../" "Cloud"
  click n14 "../basic-usage/" "对象存储基本用法(Bucket / Object / 常用操作)"
  click n15 "../data-migration/" "对象存储数据迁移(R2 → MinIO / 跨厂商搬迁)"
  click n16 "../" "Object Storage"
  click n17 "./" "挂载 Bucket 为本地文件系统(FUSE Mount)"
  click n18 "../signed-url/" "对象存储签名 URL(Signed URL)原理与实战"
  click n19 "../vendors-comparison/" "对象存储供应商对比(S3 / R2 / OSS / Supabase / MinIO)"
  click n20 "../../../" "Infrastructure"
  click n21 "../../../../../prototypes/" "Prototypes"
  click n22 "../../../../../research/" "Research"
  click n23 "../../../../../research/topics/better-auth/" "Better Auth 源码阅读指南"
  click n24 "../../../../../research/topics/duckdb/basic-usage/" "DuckDB 环境与基本使用"
  click n25 "../../../../../research/topics/duckdb/" "DuckDB 实战研究"
  click n26 "../../../../../research/topics/duckdb/mock-data/" "DuckDB 模拟数据"
  click n27 "../../../../../research/topics/duckdb/postgresql-acceleration/" "PostgreSQL 数据用 DuckDB 加速查询"
  click n28 "../../../../../research/topics/english/hollow-knight/" "Hollow Knight 英语主题"
  click n29 "../../../../../research/topics/english/" "英语学习 Dashboard"
  click n30 "../../../../../research/topics/english/scraps/archive/" "English Scraps Archive"
  click n31 "../../../../../research/topics/english/scraps/" "English Scraps 使用指南"
  click n32 "../../../../../research/topics/jellyfin/" "Jellyfin 源码阅读指南"
  click n33 "../../../../../research/topics/lux/" "Lux 资料整理"
  click n34 "../../../../../research/topics/nest-commander/" "Nest Commander 学习资料"
  click n35 "../../../../../research/topics/nestjs/" "NestJS 源码阅读指南"
  click n36 "../../../../../research/topics/protomaps/" "Protomaps 自建底图研究"
  click n37 "../../../../../research/topics/protomaps/make-own-map/" "自制 PMTiles 地图(最简单例子)"
  click n38 "../../../../../research/topics/protomaps/maplibre/" "MapLibre 集成 Protomaps"
  click n39 "../../../../../research/topics/protomaps/pmtiles/" "PMTiles 格式与工具链"
  click n40 "../../../../../research/topics/protomaps/shanghai-map/" "上海地区底图项目"
  click n41 "../../../../../research/topics/redash/" "Redash 源码阅读指南"
  click n42 "../../../../../research/topics/rust/" "Rust 学习计划"
  click n43 "../../../../../research/topics/shadcn-ui/" "shadcn/ui 源码阅读指南"
  click n44 "../../../../../research/topics/trip/" "TRIP 项目核心原理与代码阅读指南"
Links (3)