nextcloud阿里云oss挂载辅助文档(腾讯云可参考)

466次阅读
没有评论

本文将提供完整的流程描述,相关的文档以官方为主,在此提供一些须特别注意的情况。

01.新建 Bucket,获取 access-key-id,access-key-secret

02.安装oss

官方 github 地址 https://github.com/aliyun/ossfs 根据自己的系统不同,选择相应的安装方法。

03.相关配置,在此重点介绍下 0301.配置文件 将ossBucket 的相关信息写入配置文件(名称、access-key-id,access-key-secret),以备公共调用。

按照官方的方法,写入文件,并赋予此文件 640 权限,需要注意的是,如果服务器用到多个 Bucket,则需要在密码文件里继续换行追加就可以,可以写入多个 Bucket 信息。 0302.挂载到文件 挂载到文件没有什么特别注意的,如果想更改挂载文件的文件夹权限可以利用 umask 来设置。

ossfs myowncloud /data/wwwroot/cloud/data -ourl=oss-cn-qingdao-internal.aliyuncs.com -ouid=1001 -ogid=1001 -oumask=007 -o allow_other

此示例,是将 myowncloud Bucket 挂载到服务器的 data 文件夹,并赋予 data 文件夹 0770 的权限 0303.开机自动挂载目的是为了不用每次开机都进行手工挂载,实现开机自动挂载,根据官方文档来。

+++++++++++++++++++++++++++++++

以下为官方的文档拷贝。

+++++++++++++++++++++++++++++++

 

简介
ossfs 能让您在 Linux/Mac OS X 系统中把 Aliyun OSS bucket 挂载到本地文件 系统中,您能够便捷的通过本地文件系统操作OSS 上的对象,实现数据的共享。
功能
ossfs 基于 s3fs 构建,具有 s3fs 的全部功能。主要功能包括:
支持POSIX 文件系统的大部分功能,包括文件读写,目录,链接操作,权限, uid/gid,以及扩展属性(extended attributes)
通过OSS 的 multipart 功能上传大文件。
MD5 校验保证数据完整性。
安装
预编译的安装包
我们为常见的 linux 发行版制作了安装包:
Ubuntu-14.04
CentOS-7.0/6.5/5.11
请从版本发布页面选择对应的安装包下载安装,建议选择最新版本。
对于 Ubuntu,安装命令为:
sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi your_ossfs_package
对于 CentOS6.5及以上,安装命令为:
sudo yum localinstall your_ossfs_package
对于 CentOS5,安装命令为:
sudo yum localinstall your_ossfs_package --nogpgcheck
源码安装
如果没有找到对应的安装包,您也可以自行编译安装。编译前请先安装下列依赖库:
Ubuntu 14.04:
sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev \
                     libfuse-dev libssl-dev libxml2-dev make pkg-config
CentOS 7.0:
sudo yum install automake gcc-c++ git libcurl-devel libxml2-devel \
                 fuse-devel make openssl-devel
然后您可以在 github 上下载源码并编译安装:
git clone https://github.com/aliyun/ossfs.git
cd ossfs
./autogen.sh
./configure
make
sudo make install
运行
设置 bucket name, access key/id 信息,将其存放在/etc/passwd-ossfs 文件中, 注意这个文件的权限必须正确设置,建议设为640echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
将 oss bucket mount 到指定目录
ossfs my-bucket my-mount-point -ourl=my-oss-endpoint
示例
将 my-bucket 这个 bucket 挂载到/tmp/ossfs 目录下,AccessKeyId 是 faint, AccessKeySecret 是123,oss endpoint 是 http://oss-cn-hangzhou.aliyuncs.com
echo my-bucket:faint:123 > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
mkdir /tmp/ossfs
ossfs my-bucket /tmp/ossfs -ourl=http://oss-cn-hangzhou.aliyuncs.com
卸载 bucket:
umount /tmp/ossfs # root user
fusermount -u /tmp/ossfs # non-root user
常用设置
使用 ossfs --version 来查看当前版本,使用 ossfs -h 来查看可用的参数
如果使用 ossfs 的机器是阿里云ECS,可以使用内网域名来避免流量收费和 提高速度:
  ossfs my-bucket /tmp/ossfs -ourl=http://oss-cn-hangzhou-internal.aliyuncs.com
在 linux 系统中,updatedb 会定期地扫描文件系统,如果不想 ossfs 的挂载目录被扫描,可参考FAQ设置跳过挂载目录
如果你没有使用 eCryptFs 等需要XATTR的文件系统,可 以通过添加-o noxattr 参数来提升性能
ossfs 允许用户指定多组 bucket/access_key_id/access_key_secret 信息。当 有多组信息,写入 passwd-ossfs 的信息格式为:
  bucket1:access_key_id1:access_key_secret1
  bucket2:access_key_id2:access_key_secret2
生产环境中推荐使用 supervisor 来启动并监控 ossfs 进程,使 用方法见FAQ
高级设置
可以添加-f -d 参数来让 ossfs 运行在前台并输出 debug 日志
可以使用-o kernel_cache 参数让 ossfs 能够利用文件系统的 page cache,如 果你有多台机器挂载到同一个 bucket,并且要求强一致性,请不要使用此 选项
遇到错误
遇到错误不要慌:) 按如下步骤进行排查:
如果有打印错误信息,尝试阅读并理解它
查看/var/log/syslog 或者/var/log/messages 中有无相关信息
grep 's3fs' /var/log/syslog
grep 'ossfs' /var/log/syslog
重新挂载 ossfs,打开 debug log:
ossfs ... -o dbglevel=debug -f -d > /tmp/fs.log 2>&1
然后重复你出错的操作,出错后将/tmp/fs.log 保留,自己查看或者发给我
局限性
ossfs 提供的功能和性能和本地文件系统相比,具有一些局限性。具体包括:
随机或者追加写文件会导致整个文件的重写。
元数据操作,例如 list directory,性能较差,因为需要远程访问 oss 服务器。
文件/文件夹的 rename 操作不是原子的。
多个客户端挂载同一个 oss bucket 时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。
不支持 hard link。
不适合用在高并发读/写的场景,这样会让系统的 load 升高

官方 FAQ 拷贝

FAQ
1
Q: ossfs 适合什么样的程序?
ossfs 能把 oss bucket 挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么 ossfs 是很好的选择。
2
Q: ossfs 有什么局限性?
由于数据需要经过网络同步到云端,ossfs 在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对 io 要求很高的应用跑在 ossfs 挂载的盘上,请慎重考虑。和本地文件系统具体差异:
随机或者追加写文件会导致整个文件的重写。
元数据操作,例如 list directory,性能较差,因为需要远程访问OSS服务器。
文件/文件夹的 rename 操作不是原子的。
多个客户端挂载同一个 oss bucket 时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。
不支持 hard link。
3
Q: ossfs 一定要阿里云的机器才能用么?
ossfs 不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。
4
Q: ossfs 能不能同时挂载多个OSS bucket
可以的,在 passwd-ossfs 文件中写入多个OSS配置信息即可。支持不同帐号的OSS5
Q: 我在 yum/apt-get 安装 ossfs,遇到 conflicts with file from package fuse-devel 的错误,请问是怎么回事?
您的系统中存在老版本的 fuse,请先使用相关的包管理器卸载,再重新安装 ossfs。
6
Q: ossfs 工作不正常,如何 debug?
您可以使用在挂载时,加上-d -o f2 参数,ossfs 会把日志写入到系统日志中。在 centos 系统中,在/var/log/messages 中。
您也可以在挂载时使用-f -d -o f2 参数,ossfs 会把日志输出到屏幕上。
7
Q: 为什么我在 mount 时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected 这样的错误?
请先 umount 对应的目录。
请检查您在使用 ossfs 挂载时,填入的 url 参数是否正确,是否和 bucket/access key id/access key secret 匹配。
特别注意:url 中不包含 bucket 的名字。例如:您在 oss 控制台中看到 bucket 的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的 url 则是:http://oss-cn-hangzhou.aliyuncs.com。
8
Q: ossfs 提示 ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory
这是您未创建该目录导致的,在挂载前需要创建对应目录
9
Q: 我把 bucket 挂载到本地后,ls 目录,却收到 operation not permitted 错误,这是为什么?
请检查您的 bucket 中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些 object 重命名后,ls 就能正确显示目录内容了。
10
Q: 我的一个目录下有非常多的文件,为什么 ls 该目录很慢?
假设一个目录下有 n 个文件,那么 ls 该目录至少需要 n 次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。
您可以采用下面两个办法优化:
通过-omax_stat_cache_size=xxx 参数增大 stat cache 的 size,这样第一次 ls 会较慢,但是后续的 ls 就快了,因为文件的元数据都在本地 cache 中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。
使用 ls -f 命令,这个命令会消除与OSS的 n 次 http 请求。
具体参见 issue 13
11
Q: ossfs 挂载时如何设置权限?
如果要允许其他用户访问挂载文件夹,可以在运行 ossfs 的时候指定 allow_other 参数:
ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other
为什么使用 allow_other 参数,仍然不能访问文件?
注意:allow_other 是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用 chmod 命令。
allow_other 默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办?
可以通过 umask 来设置,参见这里。
12
Q:如果要使挂载的文件夹(/tmp/ossfs)属于某个 user:
首先通过 id 命令获得指定用户的 uid/gid 信息。例如获取 www 用户的 uid/gid 信息:id www
然后挂载时指定 uid/gid 参数:ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid
注意:uid/gid 都是数字。
13
Q: 我不是 root 用户,如何 umount ossfs 挂载的目录
fusermount -u your_mountpoint
14
Q: 如何开机自动挂载 ossfs?
Step 1 首先请参考使用说明,把 bucket name,access key id/secret 等信息写入/etc/passwd-ossfs,并将该文件权限修改为640echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
Step 2 接下来针对不同的系统版本,设置方式有所不同
Step 2A 通过 fstab 的方式自动 mount(适用于 ubuntu14.04, centos6.5)
在/etc/fstab 中加入下面的命令
ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0
其中上述命令中的 your_xxx 信息需要根据您的 bucket name 等信息填入。
保存/etc/fstab 文件。执行 mount -a 命令,如果没有报错,则说明设置正常。
到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令:
chkconfig netfs on
Step 2B 通过开机自启动脚本 mount(适用于 centos7.0及以上的系统)
在/etc/init.d/目录下建立文件 ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的 your_xxx 内容改成您自己的信息。
执行命令:chmod a+x /etc/init.d/ossfs
上述命令是把新建立的 ossfs 脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时 oss 中的 bucket 已经挂载到您指定的目录下了。
执行命令:chkconfig ossfs on
上述命令是把 ossfs 启动脚本作为其他服务,开机自动启动。
好了,现在 ossfs 就可以开机自动挂载了。总结起来,如果您是 ubuntu14.04和 centos6.5,您需要执行 Step 1 + Step 2A;如果您是 centos7.0系统,您需要执行 Step 1 + Step 2B15
Q: 遇到 fusermount: failed to open current directory: Permission denied 错误如何解决?
这是 fuse 的一个 bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是 cd 到一个有读权限的目录再运行 ossfs 命令
16
Q: 使用ECS挂载 ossfs,如何避免因后台程序扫描文件而产生费用?
程序扫描 ossfs 挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是 updatedb,可以通过修改/etc/updatedb.conf 让它跳过。具体做法是:
 1. 在`PRUNEFS = `后面加上`fuse.ossfs`
 2. 在`PRUNEPATHS = `后面加上挂载的目录
如何确定是哪个进程扫了我的目录?
首先安装 auditd: sudo apt-get install auditd
启动 auditd: sudo service auditd start
设置监视挂载目录: auditctl -w /mnt/ossfs
在 auditlog 中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs
17
Q: 使用 ossfs 上传到OSS的文件 Content-Type 全是"application/octet-stream"是怎么回事?
ossfs 通过查询/etc/mime.types 中的内容来确定文件的 Content-Type,请检查这个文件是否存在,如果不存在,则需要添加:
对于 ubuntu 可以通过 sudo apt-get install mime-support 来添加
对于 centos 可以通过 sudo yum install mailcap 来添加
也可以手动添加,每种格式一行,每行格式为:application/javascript js
18
Q: 如何使用 supervisor 启动 ossfs?
安装 supervisor,在 ubuntu 中执行 sudo apt-get install supervisor
建立一个目录,编辑 ossfs 的启动脚本:
mkdir /root/ossfs_scripts
vi /root/ossfs_scripts/start_ossfs.sh
# contents of start_ossfs.sh
fusermount -u /mnt/ossfs
exec ossfs ... -f
编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:
[program:ossfs]
command=bash /root/ossfs_scripts/start_ossfs.sh
logfile=/var/log/ossfs.log
log_stdout=true
log_stderr=true
logfile_maxbytes=1MB
logfile_backups=10
运行 supervisor:
supervisord
确认一切正常:
ps aux | grep supervisor # 应该能看到 supervisor 进程
ps aux | grep ossfs # 应该能看到 ossfs 进程
killall ossfs # 杀掉 ossfs 进程,supervisor 应该会重启它
ps aux | grep ossfs # 应该能看到 ossfs 进程
如果出错,请检查/var/log/supervisor/supervisord.log 和/var/log/ossfs.log。
19
Q: 遇到"fuse: warning: library too old, some operations may not work"怎么办?
出现的原因是:ossfs 编译时所使用的 libfuse 版本 比运行时链接到的 libfuse 版本高。这往往是用户自行安装了 libfuse 导致的。使用我们提供的 rpm 包安装 ossfs,无需再安装 libfuse。
在 CentOS-5.x 和 CentOS-6.x 上我们提供的 rpm 包里包含了 libfuse-2.8.4,如果在运行的时候环境中有 libfuse-2.8.3,并且 ossfs 被链接到了旧版本的 fuse 上,就会出现上述 warning。
如何确认 ossfs 运行时链接的 fuse 版本?
运行 ldd $(which ossfs) | grep fuse
例如结果是"/lib64/libfuse.so.2",那么通过 ls -l /lib64/libfuse*可以看到 fuse 的版本
如何让 ossfs 链接到正确的版本?
首先通过 rpm -ql ossfs | grep fuse 找到 libfuse 的目录
例如结果是"/usr/lib/libfuse.so.2",则通过LD_LIBRARY_PATH=/usr/lib ossfs ...运行 ossfs
我能忽略这个WARNING吗?
最好不要,见这个 bug
20
Q: 为什么用 ossfs 看到的文件信息(例如大小)与其他工具看到的不一致?
因为 ossfs 默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次 ls 的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd 等)对文件进行了修改,那么有可能在 ossfs 中看到的文件信息 没有及时更新。
如果想禁止 ossfs 的缓存,那么可以在挂载的时候加上如下参数:
-omax_stat_cache_size=0
 
吾爱互联
版权声明:本站原创文章,由 吾爱互联 2020-01-05发表,共计8350字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
载入中...