s3fs-fuse 是一个采用 c++ 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 API 的第三方对象存储像普通文件系统一样挂载到本地计算机,由于这种功能通过 FUSE 实现,因此只能在 Linux 和 MacOS 上使用。

安装

包管理器安装

Debian 9 和 Ubuntu 16.04 及以上版本:

$ sudo apt install s3fs

发行版软件仓库中可能提供的不是最新版本

编译安装

如果希望使用最新版本,可以自己编译。

安装编译工具和依赖

$ sudo apt-get install automake autotools-dev fuse g++ git libcurl4-openssl-dev libfuse-dev libssl-dev libxml2-dev make pkg-config

克隆仓库并编译

$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
$ cd s3fs-fuse
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

上述编译过程最后会将编译好的程序安装到 /usr/local 下的 binman 目录。

我通常会修改 ./configure 命令,添加 --prefix 参数去指定安装位置,比如:

$ ./configure --prefix=/opt/s3fs

这样最终编译好的二进制文件和手册就会被复制到 /opt/s3fs 目录,其实对于 s3fs-fuse 这个程序来说,最终有一个 s3fs 二进制文件。

对于桌面用户来说,完全可以把他放到 ~/.local/bin 下面,这样会比较便于管理。

使用

准备密码文件

S3 及兼容 API 的对象存储无一例外的都采用 ACCESS KEYACCESS SECRET 认证身份,为了方便配置,可以将认证 KEY 放到独立的密码文件中,s3fs 默认会从以下两个文件中读取认证信息:

  • 用户家目录下的 .passwd-s3fs 文件 (例如 ~/.passwd-s3fs)
  • 全局文件 /etc/passwd-s3fs

任选其一即可,文件默认不存在,需要自己手动创建。

$ echo ACCESS_KEY_ID:SECRET_ACCESS_KEY >  ~/.passwd-s3fs
$ chmod 600  ~/.passwd-s3fs

挂载 AWS S3

$ s3fs mybucket /path/to/mountpoint -o passwd_file=~/.passwd-s3fs
  • mybucket 替换成实际的 S3 Bucket
  • /path/to/mountpoint 替换成本地挂载点
  • -o 用来指定额外的参数,除非密码文件没有放在默认位置,否则不需指定密码文件。

挂载兼容 S3 API 的第三方对象存储

例如挂载阿里云 OSS,只需要用 -o 指定阿里云外网 Endpoint地址即可。

$ s3fs mybucket /path/to/mountpoint -o url=https://oss-cn-shanghai.aliyuncs.com -o use_path_request_style

use_path_request_style 参数是对那些还不支持 virtual-host 请求风格的对象存储而提供的参数,指定该参数会使用传统的 API 调用风格。实测表明,阿里云 OSS 不需指定该参数。

开机自动挂载

编辑 /etc/fstab:

For S3

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

For S3-like

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

注意:设置开机自动挂载可能需要把 s3fs 二进制文件放到 /usr/local/bin 目录,还要使用全局配置文件 /etc/passwd-s3fs 保存密码。

use_cache 使用缓存

设置 use_cache 将本地计算机的某个位置作为缓存,从而提高数据上传的效率。

$ s3fs mybucket /path/to/mountpoint -o url=https://oss-cn-shanghai.aliyuncs.com -o use_cache=/tmp

del_cache 删除缓存

指定 del_cache 参数,当 s3fs 启动和退出时会自动删除缓存文件。

性能优化

s3fs <bucket_name> <mountpoint> -o url=http{s}://<COS_endpoint> –o passwd_file=<credentials_file> \
-o cipher_suites=AESGCM \
-o kernel_cache \
-o max_background=1000 \
-o max_stat_cache_size=100000 \
-o multipart_size=52 \
-o parallel_count=30 \
-o multireq_max=30 \
-o dbglevel=warn

卸载

$ sudo umount /path/to/mountpoint

Background Knowlage

Filesystem in Userspace 简称 FUSE。它允许 Unix 普通用户在不修改内核的条件下能够创建自己的文件系统。目前 Linux 通过内核模块对 FUSE 进行支持。一些文件系统如 ZFS、glusterfs 和 lustre 通过 FUSE 实现。

Reference