以华为云OBS为例,记录s3fs挂载对象存储的避坑指南
前言:
使用华为云的obs对象存储来保存和查看系统的应用日志,出于安全审计上的考虑日志必须保留180天以上才能进行删除,转眼间历史日志的存储已经超过5T了。通过日常的日志使用分析,超过30天的日志基本上就很少会去查看了,于是决定对超过30天的日志进行一次压缩操作以控制容量使用成本。
查了一下相关文档后,发现华为云的OBS也是基于s3的,因此决定通过s3fs把对象存储桶挂载到容器上映射为本地磁盘,在通过shell直接操作本地磁盘做压缩操作。由于在挂载过程中遇到了一些坑,特此记录一下。
安装s3fs
#Debian apt install -y s3fs #CentOs yum imstall -y epel-release s3fs-fuse
如果上面的安装失败了,那么你可以尝试手动编译安装,手动编译安装如下(以CentOs为例)
#安装必要的依赖 yum install -y automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel #下载、编译安装s3fs git clone https://github.com/s3fs-fuse/s3fs-fuse.git cd s3fs-fuse ./autogen.sh ./configure make make install
安装成功后在ssh端执行s3sf命令会输出如下命令提示信息
s3fs: missing BUCKET argument. Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...
创建访问密钥
- 1 登录OBS控制台。
- 2 单击页面右上角的用户名,并选择“我的凭证”。
- 3 在“我的凭证”页面,单击左侧导航栏的“访问密钥”。
- 4 在“访问密钥”页面,单击“新增访问密钥”。
配置访问密钥(AK和SK)
#注意将命令中的AK:SK替换为你刚才申请的AK与SK的字符串 echo AK:SK > /etc/passwd-obsfs chmod 600 /etc/passwd-obsfs
挂载OBS对象存储
在挂载对象存储前你需要做几个基本的准备
1、你需要获取你的对象存储桶名称
2、你需要获取你的Endpoint
3、你需要确保你的桶策略对你的账户进行了读写授权或者是桶的创建者就是你
以上信息确定后,我们在来组装s3fs的对象存储挂载命令,如下假设:
本地需要挂载的目录为:/root/obshub
桶名称为:sz-obs
桶内文件路径为:/apphub
endpoint为:obs.cn-south-1.myhuaweicloud.com
访问密钥路径为:/etc/passed-obsfs
那么s3fs的挂载命令为:
#特别注意:命令中url与上面endpoint是存在区别的 s3fs sz-obs:/apphub /root/obshub -o passwd_file=/etc/passwd-obsfs -o url=https://obs.cn-south-1.myhuaweicloud.com
避坑指南
通过上面的方式如果操作成功了,那么恭喜你。下面的避坑指南你可以忽略了,否则你可以尝试在下方找找答案,看看是否能够解决你的报错。
1、尝试使用s3fs的调试模式来定位挂载失败问题
如果你执行上面的命令后,系统没有任何提示。通过df -h也找不到挂载相关的信息,那么你可以打开调试模式来查看debug的输出日志。
#调试模式的打开方式为在上面的命令中添加 -d -d -f -o f2 -o curldbg #因此上面的命令可修改为: s3fs sz-obs:/apphub /root/obshub -o passwd_file=/etc/passwd-obsfs -o url=https://obs.cn-south-1.myhuaweicloud.com -d -d -f -o f2 -o curldbg
2、提示device not found, try ‘modprobe fuse’ first错误
出现这种问题一般是因为你是想在docker容器中对obs对象存储进行挂载。如果你是通过命令行启动容器,那么你可以在启动命令中加入参数–privileged指定容器为特权模式启动;如果你的容器是在云平台上通过可视化的方式启动,那么你直接在配置页面勾选特权容器并重启即可。
3、提示SSL peer certificate or SSH remote key was not OK错误
出现这个情况,多半是因为你的url地址为https的访问方式。本地与服务端的ssl证书存在出入导致的,你可以通过参数略过该问题。具体操作方式为
#s3fs命令中插入参数 -o use_path_request_style #因此上面的s3sf调试模式的完整命令可修改为 s3fs sz-obs:/apphub /root/obshub -o passwd_file=/etc/passwd-obsfs -o use_path_request_style -o url=https://obs.cn-south-1.myhuaweicloud.com -d -d -f -o f2 -o curldbg
4、提示The specified key does not exist错误
出现这个问题多半是因为你的粗心,没有认真查看上面的教程。解决这个错误的主要方式为:
4.2、确定你的账户已经被桶策略授权了读写等权限,或者你就是桶的创建者。
4.3、确定你的endpoint地址是正确的,以上面说的为例,endpoint为:obs.cn-south-1.myhuaweicloud.com,那么在s3fs挂载命令中url的地址应该为:https://obs.cn-south-1.myhuaweicloud.com
当你通过调试模式执行挂载命令不再报错后,那么你应该退出调试模式,来执行s3fs挂载命令,对obs对象存储进行挂载,然后执行df -h命令查看是否真的挂载成功。
5、提示s3fs: credentials file /etc/pd-obsfs should not have others permissions错误
出现这个问题是因为你没有按照文章要求一步步执行,请执行上文中提及的chmod 600 /etc/passwd-obsfs命令
开机自动挂载OBS
上面的教程说的都是挂载,如果你希望obs对象存储一直挂载在主机或者容器上,那么你还需要做一个开机自动挂载的操作。对于docker容器而言,你需要在dockerfile中自定义命令,来构建一个启动就会自动挂载的镜像。这里就不进行展开了,主要说一下在Linux主机上如何开机自动挂载。
具体的操作命令为:
#在/etc/rc.d/rc.local文件中插入s3fs的挂载命令即可 echo "s3fs sz-obs:/apphub /root/obshub -o passwd_file=/etc/passwd-obsfs -o url=https://obs.cn-south-1.myhuaweicloud.com" >> /etc/rc.d/rc.local
日志文件批量压缩
如果你也有和我一样的需求,对日志文件进行批量压缩。那么你可以参考下面的命令,并根据你的需求自行修改
find /root/obshub/sz-* -mtime +30 -name *.log | xargs gzip -v
本文系作者 @Mr.Lee 原创发布在 维简网。未经许可,禁止转载。