BOS FS

概述

BOS FS用于实现将远程bos服务挂载到本地文件系统中,实现类似于网络文件系统的功能,目的是便于用户使用系统命令或者标准的POSIX接口访问BOS上的文件,就像使用本地磁盘一样方便。

BOS FS基于FUSE实现,因此依赖于支持FUSE的操作系统。目前支持大部分POSIX调用,暂时不支持硬链接、扩展属性和文件锁。

BOS FS支持并发请求、分块上传下载等功能且可以保证充分的性能,接近于直接使用SDK访问BOS性能。

安装包 名称及下载地址 MD5 说明
源码包 bosfs-1.0.0.9.tar.gz a155df63671ae4f8972a1d5afd0f1bab 安装源码包, 如果您需要自定义一些功能可以直接进行修改
libfuse fuse-2.9.4.tar.gz ecb712b5ffc6dffd54f4a405c9b372d8 安装libfuse用到的源码包
bosfs rpm包 bosfs-1.0.0-9.el6.x86_64.rpm 6de6c2440ca9fa23b19f22683680aa6d centos 6.x安装包, centos 7.x需要您手动编译

安装

用户安装bosfs前需要先确保目标系统已经安装FUSE内核模块,可以通过ls /dev/fusemodprobe fuse命令判断是否安装。如果没有安装,执行以下步骤:

  • 用root权限 执行yum或者apt-get等包管理软件安装;
  • 下载上面的libfuse源码包,自行编译(./configure && make);用root权限make install之后会自行加载内核模块。
  • 由于低版本的Linux系统内核版本比较低,bosfs进程在运行过程中容易出现掉线或者其他问题。因此建议用户将操作系统升级到CentOS 7.0或者Ubuntu 14.04以及以上版本。

Ubuntu系统安装

  1. 安装bosfs所需要的依赖

    下载libfuse源码包(上面已提供连接,如果fuse版本低于2.9.4请用上面的安装包)
    tar -xzvf fuse-2.9.4.tar.gz 
    cd fuse-2.9.4
    ./configure
    sudo make && sudo make install 
    sudo apt-get install autoconf
    sudo apt-get install uuid-dev
    sudo apt-get install libssl-dev
    sudo apt-get install libcurl4-openssl-dev
    

    注意:如果您的libstdc++版本过低, bosfs安装成功后会报错如下:

    bosfs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by bosfs)
    bosfs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by bosfs)
    

    建议手动升级相关libstdc++

  2. 下载bosfs-1.0.0.9.tar.gz源码包。

  3. 编译

    tar -xzvf bosfs-1.0.0.9.tar.gz
    cd bosfs-1.0.0.9 
    sudo sh build.sh
    

    注意:如果编译的时候显示'rpl_malloc' was not declared in this scope,这是因为您的系统malloc与bosfs冲突, 解决办法将编译目录下configure.ac文件的AC_FUNC_MALLOC注释掉。

  4. 安装完成后,可以使用bosfs -v命令查看版本

    注意:如果您的fuse版本过低, 建议使用官网提供的libfuse。
    挂载的时候显示libfuse.so.2 :can not open Shared object file:No such file or directory
    原因是libfuse.so生成路径不在动态链接路径, 解决办法:

    1. /etc/ld.so.conf 这里面增加 /usr/local/lib将/usr/local/lib添加到链接路径
    2. ldconfig

Centos系统安装

由于BOS FS对环境有依赖,所以安装源代码包前需要安装依赖。以百度智能云虚机CentOS 6.5为例:

  1. 安装依赖

    下载libfuse源码包(上面已提供连接, 如果fuse版本低于2.9.4请用上面的安装包)
    tar -xzvf fuse-2.9.4.tar.gz 
    cd fuse-2.9.4
    ./configure
    sudo make && sudo make install 
    sudo yum install gcc-c++
    sudo yum install autoconf
    sudo yum install automake
    sudo yum install libuuid-devel
    sudo yum install openssl-devel
    sudo yum install libcurl-devel
    

    注意:如果您的libstdc++版本过低, bosfs安装成功后会报错如下:

    bosfs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by bosfs)
    bosfs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by bosfs)
    

    建议手动升级相关libstdc++

  2. 解压并编译

    (1). 解压BOS FS源码包
    (2). 编译源代码:

    • 如果选择默认编译:直接执行build.sh
    • 如果选择自定义编译:先进入cppsdk目录,按自定义参数执行configuremakemake install;然后再进入bosfs目录,按自定义参数执行configuremakemake install
      最后获取二进制可执行文件bosfs。
      (3). 如果编译的时候显示'rpl_malloc' was not declared in this scope 这是因为您的系统malloc与bosfs冲突, 解决办法将编译目录下configure.ac文件的AC_FUNC_MALLOC注释掉

    注意:如果您的fuse版本过低, 建议使用官网提供的libfuse
    挂载的时候显示libfuse.so.2 :can not open Shared object file:No such file or directory
    原因是libfuse.so生成路径不在动态链接路径, 解决办法:

    1. /etc/ld.so.conf 这里面增加 /usr/local/lib将/usr/local/lib添加到链接路径
    2. ldconfig

操作

挂载

BOS FS挂载bucket到本地目录执行命令:

bosfs mybucket my_local_directory -o endpoint=http://bj.bcebos.com -o ak=xxxxxxxxxxxxxxxx -o sk=xxxxxxxxxxxxxxxxx -o logfile=xx/xx.log

执行之后后台会启动一个名为bosfs的daemon进程,如果挂载成功,可以用df命令看挂载点。此外可以查看/etc/mstab,来了解具体使用到的挂载选项。

同时bosfs支持挂载子目录,使用方式将bucket名变成bucket/subdir即可实现挂载子目录,即可实现将子目录作为挂载点的根目录。

说明: 默认只有root用户有权限执行fusermount,如果需要特定用户执行fusermount,则要通过命令usermod -a -G fuse YourAccount把这个用户加入到fuse用户组中。

卸载

  1. 使用umount命令可以直接卸载。

  2. 对于非root用户且没有卸载权限的,如果加入到了fuse用户组中,可以使用fusermount -u my_local_directory进行卸载。

  3. 还可以通过杀掉后台的bosfs进程来卸载,不过一般不建议这么使用,会造成未FLUSH文件的损坏。

配置

参数设置

bosfs支持设定参数来配置用户权限、存储类型及缓存等。执行bosfs –h可以获得bosfs参数设置的详细说明:

  1. -o -o bos.fs.cache.base=<your_cache_dir>:指定cache位置,该位置不能在挂载点内,且必须是绝对路径。
  2. bosfs ... -o allow_other -o mount_umask: 允许其他用户访问挂载点,并通过mount_umask禁止某些权限。默认情况下,bosfs只具有挂载用户的读、写、执行权限即S_IRWXU。
  3. –o bos.fs.meta.expires=<seconds>:指定meta缓存过期时间。
  4. –o bos.fs.meta.capacity=<integer number>:指定内存中meta缓存容量,超过容量后过期的缓存会被清除。
  5. –o bos.fs.storage_class=<standard or standard_ia>:指定object存储类型,包括标准存储和低频存储。
  6. -o bos.fs.tmpdir=<your_tmp_dir>:指定临时文件位置,该位置不能在挂载点内,且必须是绝对路径,临时文件非长期存储在磁盘,close file后会被清除。
  7. -o bos.sdk.multipart_size=<number smaller than 5GB>:指定分片传输的文件大小,可用KB或MB单位。
  8. -o bos.sdk.multipart_threshhold=< number smaller than 5GB>:表示文件超过这个阈值则用三步上传,可用KB或MB单位。
  9. -o bos.sdk.multipart_parallel=< max parallel number>:限制大文件上传并发度。

问题排查

使用 bosfs 过程中,突然显示 "unable to access MOUNTPOINT /path/to/mountpoint: Transport endpoint is not connected",并且无法再访问?
您可以使用 ps ax|grep bosfs 命令查看 bosfs 进程是否存在,如果 bosfs 进程是由于误操作而挂掉,您可以执行如下命令进行重新挂载:

umount -l /path/to/mnt_dir
bosfs bucket /mnt/bosfs xxxx
  • 如果 bosfs 进程不是由于误操作挂掉,可以检查机器上的 fuse 版本是否低于 2.9.4,libfuse 在低于 2.9.4 版本的情况下可能会导致 bosfs 进程异常退出。此时,建议您按照本文 编译和安装 bosfs 部分更新 fuse 版本或安装最新版本的 bosfs。
  • bosfs 在读写时会占用磁盘写大量的 temp cache ,和 nginx 差不多,可能会导致磁盘可用空间不足,需要经常清理
  • 可能的原因是listbucket、listobject 申请内存过多,触发了系统的 oom
  • 使用 boscmd 替代 bosfs ,非线上敏感业务可以使用 bosfs ,要求可靠性、稳定性的建议使用 bcecmd

如果在使用过程中出现长时间卡住的情况, 建议降低并发度, 挂载时指定-o multipart_parallel=5(默认为10)

日志

日志默认输出到stderr,可以用-o logfile=xxxx/xxxx.log来指定名称。使用命令-d打开debug模式的情况下,可以重定向到本地文件。

注意:

  • 切勿将logfile文件路径或者重定向的文件路径指定到mountpoint里面,这会导致持续地将日志刷入BOS,造成不必要的开销。
  • 如果没有使用-d或者-f指定前台运行模式,启动之后bosfs进程会变成daemon,同时会将工作目录切到/之下,因此logfile需要指定绝对路径。bosfs的日志文件不会自动切割,需要用户自行使用脚本管理。
  • BOS FS挂载后,如果使用rsync功能,建议设置-o loglevel=ERROR--partitial-dir=本地路径,因为rsync会产生临时文件,默认会存在目的文件所在位置(bosfs中),产生不必要的bosfs中的上传开销。

只读

可以使用-o ro选项来设置只读模式,用于保护bucket不被写入,该选项是fuse的标准选项。

操作示例

本节以同步两个Bucket的数据为例,讲解BOS FS的使用。

假设有bucket-a和bucket-b两个bucket,且这两个bucket可能位于不同的Region(比如北京,广州)。业务上需要将bucket-a的数据备份到bucket-b,且只同步有变更的文件,以减小开销。可以按照如下步骤实现:

  1. 找到一台可用的Centos镜像的虚机(没有则可以购买一台)并开通EIP服务;
  2. 安装bosfs;
  3. 使用bosfs挂载命令将bucket-a和bucket-b挂载到本地的bucket-a,bucket-b两个目录上;
  4. 使用命令rsync -av --partial-dir=/tmp bucket-a bucket-b开始同步这两个bucket的数据。
  5. 可以考虑将rsync命令加入crontab,用来定期执行。

注意事项:

  • 同步一个文件的时候,会在/tmp目录或者指定的cache目录占用这个文件大小的空间,同步完这个文件的时候将释放。因此需要保证本地有足够的磁盘空间。
  • 使用rsync命令时尽量加上--partial-dir=/tmp选项, 把临时文件放到tmp目录下。
  • 如果使用一个rsync进程同步速度可能会比较慢,如果使用另外一台机器同步速度也会受单机网卡的影响。所以如果同步的bucket本身目录结构可以进行切分,则可以考虑多个rsync进程并行,或者多部署几套虚机并行同步不同的子目录。
  • 如果同时在多个mount点上对同一个文件进行操作,BOS无法保证一个可预期的结果,可能会造成文件截断、写入丢失,或刚写入的无法在另一个挂载点上读出等问题,所以需要避免。
  • 本示例因为两个Bucket位于不同Region,所以需要开通EIP。只要两个Bucket及BCC有任意一个跨区域则需要开通EIP服务,只有三者均处于同一Region才不需开通EIP。

版本变更记录

  • BOS FS工具包 [2019-04-15] 版本号1.0.0.9

    • 支持文件名大于256字节
  • BOS FS工具包 [2019-02-14] 版本号1.0.0.9

    • 更新SDK工具包
    • 发布新的libfuse安装包
  • BOS FS工具包 [2018-08-27] 版本号1.0.0.8

    • 支持子目录挂载
    • 限制大文件并发度
  • BOS FS工具包 [2018-01-30] 版本号1.0.0.7

    • 元信息缓存优化
    • 目录元信息获取优化
    • 依赖SDK版本更新
  • BOS FS工具包 [2017-08-01] 版本号1.0.0.6

    • 判断单个文件存在的多级探测改为并发执行;
    • curl开启DNS cache;
    • 删减部分日志;
    • 优化多步上传消耗的fd数量;
    • 配置更新,支持三步上传大小,临时文件目录;
    • 日志滚动切割。
  • BOS FS工具包 [2017-05-18] 版本号1.0.0.5

    修复自动加载credential出现的coredump或者failure的问题。

  • BOS FS工具包 [2017-04-13] 版本号1.0.0.4