在Centos7下使用s3fs挂载七牛对象存储 并通过 rsync 和 inotify-tools实时同步(手动安装)

一.软件介绍

  注意事项:上传时也会有一些请求,要注意费用飙升!
  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')。
  • 如果文件量很大,初次同步可能需要较长时间。
  • 确保脚本中的路径和权限正确,避免同步失败。