常见问题
本文主要介绍使用ossfs时可能遇到的问题及解决方案。
ossfs适合什么样的程序
ossfs能把OSS Bucket挂载到本地,如果您使用的软件不支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。
ossfs有什么局限性
- 随机或者追加写文件会导致整个文件的重写。
- 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。
- 文件/文件夹的rename操作不是原子的。
- 多个客户端挂载同一个OSS Bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。
- 不支持hard link。
ossfs一定要阿里云的机器上使用么
ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。
ossfs能不能同时挂载多个OSS Bucket
在passwd-ossfs文件中写入多个OSS配置信息即可,支持不同帐号的OSS。
使用yum/apt-get安装ossfs,遇到“conflicts with file from package fuse-devel”的错误
您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。
ossfs工作不正常,如何debug
- 您可以在挂载时加上
-d -o f2
参数,ossfs会把日志写入到系统日志中。CentOS系统在/var/log/messages中。 - 您也可以在挂载时使用
-f -d -o f2
参数,ossfs会把日志输出到屏幕上。
在mount时遇到“ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected”错误
- 请先umount对应的目录。
- 检查您在使用ossfs挂载时,填入的url参数是否正确,是否和Bucket、AccessKeyId、AccessKeySecret匹配。
- 特别注意:url中不包含Bucket的名字。例如:您在OSS控制台中看到Bucket的域名是这样的:
ossfs-test-1.oss-cn-hangzhou.aliyuncs.com
。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com
。
ossfs挂载时提示“ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory ”
这是您未创建该目录导致的,在挂载前需要创建对应目录。
将Bucket挂载到本地后,ls目录时出现“operation not permitted”错误
请检查您的Bucket中,是否包含含有不可见字符的OSS Object。文件系统对文件名和目录名有严格的限制,因此会收到上述错误。使用其他工具对这些Object重命名后,ls就能正确显示目录内容了。
目录下有非常多的文件,为什么ls该目录很慢
- 通过
-omax_stat_cache_size=xxx
参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。这个值默认是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 - 使用ls -f命令,这个命令会消除与OSS的N次http请求。
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来设置,详情请参见如何实现770挂载权限。
如何使挂载的文件夹(/tmp/ossfs)属于某个user
- 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs:
sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs
- 方法二:首先通过cd命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:
id www
,然后挂载时指定uid/gid参数:ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid
非root用户如何umount ossfs挂载的目录
fusermount -u your_mountpoint
如何开机自动挂载ossfs
- 请参考快速安装,将Bucket name、AccessKeyId/AccessKeySecret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。
echo your_bucket_name:your_access_key_id:your_access_key_secret >/etc/passwd-ossfs chmod 640 /etc/passwd-ossfs
- 针对不同的系统版本,设置开机自动挂载ossfs的方式有所不同。
- Ubuntu14.04和CentOS6.5系统版本通过fstab的方式自动mount:
- 在/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
- 在/etc/fstab中加入下面的命令:
- CentOS7.0及以上的系统通过开机自动启动脚本mount:
- 在/etc/init.d/目录下建立文件ossfs,将模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。
- 为新建立的ossfs脚本赋予可执行权限:
命令执行完成后,您可以尝试执行该脚本,如果脚本文件内容无误,那么此时OSS中的Bucket已经挂载到您指定的目录下了。chmod a+x /etc/init.d/ossfs
- 把ossfs启动脚本作为其他服务,开机自动启动:
chkconfig ossfs on
- 执行上述步骤后,ossfs就可以开机自动挂载了。
- Ubuntu14.04和CentOS6.5系统版本通过fstab的方式自动mount:
需要以www用户挂载ossfs,如何设置开机自动挂载
- 修改
/etc/init.d/ossfs
中的命令为:sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url
- 设置自动启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的
Defaults requiretty
这行改为#Defaults requiretty
(注释掉)。
遇到“fusermount: failed to open current directory: Permission denied”错误如何解决
这是fuse的一个Bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录,再运行ossfs命令。
使用ECS挂载ossfs时,如何避免因后台程序扫描文件而产生费用
- 在
PRUNEFS =
后面加上fuse.ossfs
。 - 在
PRUNEPATHS =
后面加上挂载的目录。
使用ECS挂载ossfs时,如何确定是哪个进程扫描了我的目录
- 首先安装auditd:
sudo apt-get install auditd
- 启动auditd:
sudo service auditd start
- 设置监视挂载目录:
auditctl -w /mnt/ossfs
- 在auditlog中就可以查看是哪些进程访问了这个目录:
ausearch -i | grep /mnt/ossfs
使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”
- 对于Ubuntu可以通过
sudo apt-get install mime-support
来添加。 - 对于CentOS可以通过
sudo yum install mailcap
来添加。 - 也可以手动添加,每种格式一行,每行格式为:
application/javascript js
。
如何使用supervisor启动ossfs
- 安装supervisor,在ubuntu中执行
sudo apt-get install supervisor
。 - 建立一个目录,编辑ossfs的启动脚本:
写入如下数据:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh
# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -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:
supervisordsupervisord
- 确认一切正常:
如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程
安装ossfs时遇到”fuse: warning: library too old, some operations may not work”报错
出现的原因是:ossfs编译时所使用的libfuse版本比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。
- 如何确认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。
为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致
因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息没有及时更新。
如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0
。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论