一.软件介绍
注意事项:上传时也会有一些请求,要注意费用飙升!
S3FS 是一个开源工具,可以将 S3 对象存储通过 FUSE 挂载到本地,以用户熟悉的形式如在本地磁盘一样进行读写访问。除了 AWS S3,它还支持所有兼容 S3 API 的对象存储,比如七牛云对象存储 Kodo。
七牛教程:https://developer.qiniu.com/kodo/12578/s3fs-examples
S3FS项目: https://github.com/s3fs-fuse/s3fs-fuse
二.s3fs安装和使用
1.安装s3fs
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && yum clean all && yum makecache
yum install -y epel-release && yum makecache
yum install fuse s3fs-fuse wget unzip curl -y
s3fs --version # 应输出版本信息
2. 创建密钥文件
首先,提前获取密钥:https://portal.qiniu.com/developer/user/key

然后,将七牛云的 AccessKey
和 SecretKey
存入 /etc/.passwd-qiniu
文件
echo "Your_Qiniu_AccessKey:Your_Qiniu_SecretKey" > /etc/.passwd-qiniu
chmod 600 /etc/.passwd-qiniu # 限制权限

3. 创建本地挂载目录
mkdir -p /data/blog_html
#如果挂载目录 (/data/blog_html) 需被 Web 服务(如 Nginx/PHP)访问,需设置正确权限,默认无需设置
chown -R www-data:www-data /data/blog_html # 根据实际用户调整
chmod 755 /data/blog_html
4. 执行手动挂载
首先获取 空间域名和 区域的 S3 服务域名

https://portal.qiniu.com/kodo/bucket/overview?bucketName=hx99-blog

setenforce 0 # 临时禁用 否则挂载失败
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久禁用
#开始挂载
s3fs hx99-blog /data/blog_html -o url=https://s3.cn-east-1.qiniucs.com -o passwd_file=/etc/.passwd-qiniu

5、开机自动挂载
创建
systemd
服务文件创建
/etc/systemd/system/s3fs-mount.service
:cat > /etc/systemd/system/s3fs-mount.service <<'EOF'
[Unit]
Description=Mount Qiniu Cloud Storage via S3FS
After=network.target
Requires=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/s3fs hx99-blog /data/blog_html \
-o url=https://s3.cn-east-1.qiniucs.com \
-o passwd_file=/etc/.passwd-qiniu \
-o allow_other \
-o umask=022 \
-o nonempty \
-o dbglevel=info
ExecStop=/bin/fusermount -u /data/blog_html
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
EOF
设置权限并启用服务
chmod 644 /etc/systemd/system/s3fs-mount.service
systemctl daemon-reload
systemctl start s3fs-mount # 立即启动
systemctl enable s3fs-mount # 启用开机自启
systemctl status s3fs-mount # 检查状态
mount | grep blog_html # 确认挂载成功
journalctl -u s3fs-mount -f # 日志排查
三、异常问题排查
1. 检查挂载状态
mount | grep s3fs # 查看是否有 s3fs 挂载记录
df -h | grep blog_html # 确认挂载点是否在磁盘列表中
如果无输出,说明挂载未成功。
2、 卸载存储
umount /data/blog_html
fusermount -u /data/blog_html
3、 其它
在Windows上可以使用 图形化工具 Kodo Browser,另外还有 命令行工具 Qshell
https://developer.qiniu.com/kodo/5972/kodo-browser
https://developer.qiniu.com/kodo/1302/qshell

四.数据同步
需求:实时监控
/opt/1panel/apps/wordpress/MyBlog-wordpress/data/public_static
目录内数据,并单向同步到 /data/blog_html
1、安装必要的工具
首先,安装 rsync
和 inotify-tools
:
yum install -y rsync inotify-tools
2、编写同步脚本
创建一个脚本文件(例如 /usr/local/bin/sync_blog.sh),内容如下:
cat > /usr/local/bin/sync_blog.sh <<'EOF'
#!/bin/bash
SOURCE_DIR="/opt/1panel/apps/wordpress/MyBlog-wordpress/data/public_static"
TARGET_DIR="/data/blog_html"
LOG_FILE="/var/log/sync_blog.log"
# 监控本地变化并同步到远程
monitor_and_sync() {
inotifywait -m -r --format '%w%f %e' -e create -e modify -e delete -e move "$SOURCE_DIR" |
while read FILE EVENT; do
REL_PATH=${FILE#$SOURCE_DIR/}
TARGET_FILE="$TARGET_DIR/$REL_PATH"
case "$EVENT" in
*"DELETE"*|*"MOVED_FROM"*)
# 本地删除 → 远程也删除(但检查是否真实存在)
if [ -e "$TARGET_FILE" ]; then
rm -rf "$TARGET_FILE"
echo "[$(date)] Deleted remote (mirroring local): $TARGET_FILE" >> "$LOG_FILE"
fi
;;
*)
# 本地新增/修改 → 同步到远程(但不删除远程额外文件)
rsync -av --ignore-existing "$FILE" "$TARGET_DIR/${FILE#$SOURCE_DIR/}" >> "$LOG_FILE" 2>&1
echo "[$(date)] Synced local → remote: $FILE" >> "$LOG_FILE"
;;
esac
done
}
# 监控远程变化并同步到本地(可选,如果需要双向实时同步)
monitor_remote_to_local() {
inotifywait -m -r --format '%w%f %e' -e create -e modify -e delete -e move "$TARGET_DIR" |
while read FILE EVENT; do
REL_PATH=${FILE#$TARGET_DIR/}
SOURCE_FILE="$SOURCE_DIR/$REL_PATH"
case "$EVENT" in
*"DELETE"*|*"MOVED_FROM"*)
# 远程删除 → 本地也删除(但检查是否真实存在)
if [ -e "$SOURCE_FILE" ]; then
rm -rf "$SOURCE_FILE"
echo "[$(date)] Deleted local (mirroring remote): $SOURCE_FILE" >> "$LOG_FILE"
fi
;;
*)
# 远程新增/修改 → 同步到本地(但不删除本地额外文件)
rsync -av --ignore-existing "$FILE" "$SOURCE_DIR/${FILE#$TARGET_DIR/}" >> "$LOG_FILE" 2>&1
echo "[$(date)] Synced remote → local: $FILE" >> "$LOG_FILE"
;;
esac
done
}
# 启动同步(单向或双向)
monitor_and_sync & # 本地 → 远程
# monitor_remote_to_local & # 远程 → 本地(如需双向同步,取消注释)
EOF
3、 赋予脚本执行权限并启动测试
chmod +x /usr/local/bin/sync_blog.sh
4、 设置为系统服务
如果需要长期运行,可以创建一个 systemd 服务:
创建服务文件 /etc/systemd/system/sync_blog.service
:
cat > /etc/systemd/system/sync_blog.service <<'EOF'
[Unit]
Description=Sync Blog Static Files
After=network.target
[Service]
ExecStart=/usr/local/bin/sync_blog.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target
EOF
启用并启动服务:
systemctl daemon-reload
systemctl start sync_blog
systemctl enable sync_blog
5、 验证同步
- 在
/opt/1panel/apps/wordpress/MyBlog-wordpress/data/public_static
中创建、修改或删除文件,检查/data/blog_html
是否同步。 - 注意:脚本中的
--delete
选项会删除目标目录中源目录不存在的文件,确保这是你想要的行为。
补充说明
- 如果需要更复杂的同步逻辑(如排除某些文件),可以修改
rsync
的选项(例如--exclude='*.tmp'
)。 - 如果文件量很大,初次同步可能需要较长时间。
- 确保脚本中的路径和权限正确,避免同步失败。