随着业务的增长,应用日志的体量也水涨船高。当你的系统日志(比如存储在华为云OBS对象存储上)因为安全审计要求必须保留180天以上,不知不觉间可能已经累积到数TB甚至更多。主题铺最近就遇到了类似的情况:历史日志存储超过5T,但通过分析发现,超过30天的日志几乎无人问津。为了有效控制存储成本,对这部分“冷”日志进行压缩势在必行。
经过一番研究,我们发现华为云OBS与S3协议兼容,这意味着我们可以利用s3fs-fuse(简称s3fs)这款工具,将OBS存储桶像本地磁盘一样挂载到服务器或容器中,然后直接通过shell脚本进行文件操作,比如批量压缩。
整个过程听起来不复杂,但在实际操作中,主题铺也踩了一些小坑。因此,特此整理这篇华为云OBS对象存储挂载实战教程与避坑指南,希望能帮助有类似需求的朋友们少走弯路。
第一步:安装s3fs
首先,你需要在你的Linux系统上安装s3fs。
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安装成功后,在终端执行s3fs命令,如果看到类似下面的提示信息,说明s3fs已成功安装:
s3fs: missing BUCKET argument.
Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...第二步:创建并配置访问密钥(AK/SK)
为了让s3fs能够访问你的华为云OBS,你需要创建一对访问密钥(Access Key ID 和 Secret Access Key)。
- 登录你的华为云OBS控制台。
- 点击页面右上角的用户名,选择“我的凭证”。
- 在“我的凭证”页面,左侧导航栏点击“访问密钥”。
- 在“访问密钥”页面,点击“新增访问密钥”并按提示完成创建。请务必妥善保管好你的SK,因为它只在创建时显示一次。
获取到AK和SK后,我们需要将其配置到一个文件中,供s3fs读取:
# 将下面的AK:SK替换为你自己真实的访问密钥对
echo "你的AK:你的SK" | sudo tee /etc/passwd-obsfs > /dev/null
sudo chmod 600 /etc/passwd-obsfs主题铺提醒:chmod 600命令非常重要,它确保了只有文件所有者(root)有权读写该密钥文件,增强了安全性。
第三步:挂载OBS对象存储
在执行挂载命令前,请确保你已准备好以下信息:
- 对象存储桶名称 (Bucket Name):例如
sz-obs。 - 桶内文件路径 (Path within Bucket):如果你想挂载桶内的特定目录,例如
/apphub。如果想挂载整个桶,则此项可省略或为根路径。 - Endpoint:你的OBS桶所在的区域接入点地址,例如
obs.cn-south-1.myhuaweicloud.com。 - 桶策略授权:确保你的账户(或使用的AK/SK对应的身份)拥有对该桶的读写权限,或者你就是该桶的创建者。
![图片[1]-将华为云OBS对象存储挂载图文教程及闭坑指南-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/05/20250510214107792.png/ztp)
![图片[2]-将华为云OBS对象存储挂载图文教程及闭坑指南-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/05/20250510214110934.png/ztp)
假设我们的配置如下:
- 本地挂载目录:
/root/obshub(请确保此目录已存在,如果不存在请先mkdir /root/obshub) - 桶名称:
sz-obs - 桶内文件路径:
/apphub - Endpoint:
obs.cn-south-1.myhuaweicloud.com - 访问密钥文件路径:
/etc/passwd-obsfs
那么,s3fs的挂载命令如下:
s3fs sz-obs:/apphub /root/obshub -o passwd_file=/etc/passwd-obsfs -o url=https://obs.cn-south-1.myhuaweicloud.com特别注意:命令中的 -o url= 参数值需要是完整的URL,通常是 https:// 加上你的Endpoint地址。
执行完毕后,如果没有报错,可以使用 df -h 命令查看是否挂载成功。你应该能看到类似 /root/obshub 的挂载点。
避坑指南:挂载失败怎么办?
如果上面的步骤一帆风顺,恭喜你!但如果遇到了问题,别担心,主题铺为你准备了一些常见的“坑”和解决方案:
1. 挂载命令执行后无任何提示,df -h也看不到挂载点?
尝试使用s3fs的调试模式来定位问题。在原挂载命令中添加以下参数:
-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]-将华为云OBS对象存储挂载图文教程及闭坑指南-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/05/20250510214114624.png/ztp)
3. 提示 SSL peer certificate or SSH remote key was not OK 错误?
这通常是因为你的url地址使用了https://,而本地与服务端的SSL证书校验存在问题。你可以通过添加 -o use_path_request_style 参数来尝试解决(它会改变S3请求的路径风格,有时能规避一些特定的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主题铺补充:更稳妥的做法是确保你的系统拥有最新的CA证书包,或者在 -o url= 后面尝试添加 -o no_check_certificate (不推荐在生产环境长期使用,因为它会跳过SSL证书校验,存在安全风险)。
4. 提示 The specified key does not exist 错误?
这个错误通常是由于配置信息不正确导致的,请仔细检查:
* 桶名称是否正确,并且在s3fs命令中没有拼写错误。
* 你的账户(或AK/SK)是否已被桶策略授权了读写权限,或者你是否是桶的创建者。
* Endpoint地址是否正确。特别注意,s3fs命令中 -o url= 的值应该是 https:// 加上你的Endpoint,例如 https://obs.cn-south-1.myhuaweicloud.com。
5. 提示 s3fs: credentials file /etc/passwd-obsfs should not have others permissions 错误?
这是因为你没有严格按照教程设置密钥文件的权限。请执行之前提到的命令:
sudo chmod 600 /etc/passwd-obsfs当你在调试模式下执行挂载命令不再报错后,记得退出调试模式(即去掉 -d -d -f -o f2 -o curldbg 参数),重新执行正常的挂载命令,然后用 df -h 确认挂载成功。
第四步:设置开机自动挂载OBS
如果你希望OBS存储桶在系统重启后仍然保持挂载状态,就需要配置开机自动挂载。
对于Linux主机:
一个简单的方法是将挂载命令添加到 /etc/rc.d/rc.local (在某些新版系统中可能是 /etc/rc.local) 文件中。
#在/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主题铺提示:在自动挂载命令中添加 -o allow_other 参数可以让非root用户也能访问挂载点,根据你的需求决定是否添加。同时,确保 rc.local 文件有执行权限。更推荐的做法是使用 /etc/fstab 进行配置,因为它更规范且能更好地处理依赖关系,但配置相对复杂一些。
对于Docker容器:
你需要在Dockerfile中定义启动时执行挂载命令的逻辑,或者在容器编排工具(如Docker Compose, Kubernetes)的配置中定义挂载脚本或启动命令。
第五步:批量压缩日志文件
现在,你的OBS存储桶已经像本地磁盘一样挂载好了,可以开始对日志文件进行批量压缩了。
以下是一个示例命令,用于查找 /root/obshub/ 目录下(对应OBS的 /apphub 路径)所有以 sz- 开头、30天前修改过且以 .log 结尾的文件,并使用 gzip 进行压缩(同时显示压缩过程):
find /root/obshub/sz-* -mtime +30 -name "*.log" -print0 | xargs -0 gzip -v命令解释:
find /root/obshub/sz-*: 在指定路径下查找以sz-开头的文件或目录。-mtime +30: 查找30天前修改过的文件。-name "*.log": 查找文件名以.log结尾的文件。-print0: 安全地输出文件名,用null字符分隔,配合xargs -0可以处理包含特殊字符(如空格)的文件名。xargs -0 gzip -v: 将find命令找到的文件列表传递给gzip命令进行压缩,-v参数让gzip显示详细信息。
你可以根据自己的日志文件命名规则和压缩需求,灵活修改上述命令。
最后总结
通过s3fs将华为云OBS挂载到本地,为我们操作对象存储中的文件提供了极大的便利,尤其是在需要进行批量处理(如日志压缩)时。虽然过程中可能会遇到一些小问题,但只要按照本文的步骤和避坑指南进行操作,相信你也能顺利完成。主题铺认为,这种方法不仅有效控制了存储成本,也为后续的日志管理和审计提供了更灵活的手段。希望这篇教程对你有所帮助!

















暂无评论内容