使用ossfs将OSS Bucket挂载到Linux系统的本地目录
对于原来需要直接读写本地文件的应用程序,为了让应用程序能在不作修改的情况下直接访问对象存储OSS的数据,可以使用ossfs将OSS的Bucket挂载到Linux系统中,并将其映射到本地目录,从而能够像处理本地文件那样直接操作OSS中的数据,实现文件共享。
重要
由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。在内网下同步的效果会更好。
功能原理
s3fs是一个用户空间文件系统(userspace filesystem),它允许您在Linux系统上将Amazon S3存储桶挂载为本地文件系统。ossfs基于s3fs构建,具有s3fs的全部功能。其中包括:
- 支持POSIX文件协议标准的大部分功能,例如上传下载文件、目录,设置用户权限等。
- 默认使用OSS的分片上传和断点续传功能上传文件。
- 支持MD5校验,保证数据的完整性。
运行环境
ossfs基于FUSE(Filesystem in Userspace)用户态文件系统开发,只能运行在支持FUSE的机器上。ossfs提供Ubuntu系统和CentOS系统的安装包。如果需要在其他环境下运行,可以通过源码方式构建目标程序。
Linux系统
- CentOS 7.0及以上版本。
- Ubuntu 14.04及以上版本。
- Anolis7及以上版本。
fuse软件
2.8.4以上版本。
说明
使用如下命令判断fuse版本。
1
fusermount -V
返回结果如:
fusermount version: 2.9.2
,表示fuse满足版本要求。
使用限制
ossfs将远程Bucket数据及功能映射到本地文件系统,在使用上存在如下限制:
- 不适合高并发读写的场景。
- 不支持文件硬链接。
- 不支持访问未解冻的归档(未开启归档直读)、冷归档、深度冷归档类型的文件。
- 多个客户端挂载同一个OSS Bucket,且同时写入同一个文件时,无法保证数据的一致性。
操作步骤
以下操作步骤均以ecs-user
用户进行演示,若使用root
用户,请去除命令开头的sudo
。
下载地址
以下列表中提供了常用系统的安装包,如果您的系统版本不在以下列表中,请通过源码编译。源码地址以及如何进行源码编译,请参见GitHub ossfs。
Linux发行版 | 下载 |
---|---|
Ubuntu 22.04 (x64) | ossfs_1.91.2_ubuntu22.04_amd64.deb |
Ubuntu 20.04 (x64) | ossfs_1.91.2_ubuntu20.04_amd64.deb |
Ubuntu 18.04 (x64) | ossfs_1.91.2_ubuntu18.04_amd64.deb |
Ubuntu 16.04 (x64) | ossfs_1.91.2_ubuntu16.04_amd64.deb |
Ubuntu 14.04 (x64) | ossfs_1.91.2_ubuntu14.04_amd64.deb |
CentOS 8.0 (x64) | ossfs_1.91.2_centos8.0_x86_64.rpm |
CentOS 7.0 (x64) | ossfs_1.91.2_centos7.0_x86_64.rpm |
Anolis8/Alibaba Cloud Linux 3 | ossfs_1.91.2_anolisos8.0_x86_64.rpm |
Anolis7/Alibaba Cloud Linux 2 | ossfs_1.91.2_anolisos7.0_x86_64.rpm |
快速安装
安装ossfs。
Ubuntu系统
以Ubuntu 22.04 (x64)版本为例,依次执行以下命令安装ossfs。
1 2 3 4
sudo wget https://gosspublic.alicdn.com/ossfs/ossfs_1.91.2_ubuntu22.04_amd64.deb sudo apt-get update sudo apt-get install gdebi-core sudo gdebi ossfs_1.91.2_ubuntu22.04_amd64.deb
如果您希望上传文件的Content-Type和文件扩展名匹配,您需要添加mime.types文件。
如果您不添加mime.types文件,ossfs默认将上传文件的Content-Type设置为application/octet-stream。
通过命令添加mime.types文件的示例如下。
Ubuntu系统
您可以通过以下命令添加mime.types文件。
|
|
- 确认fuse版本。
|
|
返回结果如:fusermount version: 2.9.2
,表示fuse满足版本要求。
挂载访问
选择需要进行本地挂载的Bucket。
说明
不推荐挂载低频访问或者开启了归档直读类型的Bucket。向这些类型的挂载点上传文件时,可能会出现两次上传请求,第一次是生成一个0大小的对象,然后上传有效数据,生效新对象。
由于文件都是低频/归档属性,所以0大小的文件会按照低频/归档文件的计费逻辑被收取64KB 30天的费用,导致产生预期外的费用。
配置账号访问信息。
将Bucket名称以及具有该Bucket访问权限的RAM用户的AccessKey ID和AccessKey Secret信息存放在/etc/passwd-ossfs文件中,并设置文件的权限为640。
|
|
root 用户可使用以下命令:
|
|
说明 BucketName、yourAccessKeyId、yourAccessKeySecret请按需替换为您实际的Bucket名称、AccessKey ID和AccessKey Secret,例如:
|
|
- 将Bucket挂载到指定目录。
|
|
将杭州地域名称为bucket-test
的Bucket挂载到/tmp/ossfs
目录下的示例如下:
|
|
重要
如果您使用从阿里云购买的云服务器ECS来提供ossfs服务,您可以使用内网域名,但是需要注意,使用内网Endpoint要求您的ECS必须和即将挂载的Bucket处于同一地域。例如,在该示例中您可以将OSS Endpoint 修改为oss-cn-hangzhou-internal.aliyuncs.com
,从而节省流量费用。有关OSS内网域名的更多信息,请参见访问域名和数据中心。
您可以像访问本地文件系统一样读取Bucket中的对象。
- 查看文件列表。
|
|
说明
元数据操作(例如****list directory****)需要远程访问OSS服务器,存在网络延迟。
拷贝文件。
将OSS中的
bird.jpeg
拷贝到/root
目录中。
|
|
新增文件。
即可将本机的
forest.jpeg
添加到挂载目录,并同步到OSS远程。
|
|
说明
如果您因意外中断了文件上传的过程且未继续完成该文件的上传,则已上传的部分会以碎片(Part)的形式存储在Bucket中。如果您不再需要这些Part,建议您通过以下方式删除,以免产生额外的存储费用。
手动删除Part,请参见删除碎片。
通过生命周期规则自动删除Part,请参见基于最后一次修改时间的生命周期规则。
- 如果您不希望继续挂载此Bucket,您可以将其卸载。
|
|