200字
🚀 VPS 全自动备份攻略:Rclone + Openlist (WebDAV) + 分块上传完美解决 413 错误
2025-12-18
2025-12-18

前言

最近在折腾 VPS 备份,想把 /home 目录自动打包同步到我的 Openlist 网盘。但在实施过程中遇到了一个大坑:Openlist(以及很多 WebDAV 网盘)对单文件上传大小有限制(通常是 100MB 或 500MB)。

一旦备份包超过这个限制,Rclone 就会疯狂报错:

Failed to copy: unchunked simple update failed: 413 Request Entity Too Large

本文记录了从安装、配置 WebDAV 到利用 Rclone Chunker(分块叠加层) 完美绕过服务器限制的全过程。


第一步:安装最新版 Rclone

注意: Linux 系统自带源里的 Rclone 版本通常很老(如 v1.50),不支持高级特性。必须强制更新到最新版(v1.60+)。

在终端执行:

Bash

sudo -v ; curl https://rclone.org/install.sh | sudo bash

安装完成后,检查版本:

Bash

rclone version
# 确保显示 v1.6x 或 v1.7x

第二步:配置基础网盘 (WebDAV)

首先,我们需要把 Openlist 网盘挂载为 Rclone 的一个基础连接。

  1. 运行配置向导:

    Bash

    rclone config
    
  2. 操作步骤:

    • n (新建)

    • name> mybackup (起个名字,记住它)

    • Storage> 搜索 webdav,输入对应的数字(通常是 40+)。

    • url> 输入你的 Openlist WebDAV 地址(例如 https://xxxx.com/dav/)。

    • vendor>other (或者对应厂商)。

    • user> 你的账号。

    • pass> 你的密码(输入时看不见,输完回车)。

    • 一路回车默认,直到按 q 退出。

  3. 验证连接:

    Bash

    rclone lsd mybackup:
    # 如果能列出目录,说明连接成功
    

第三步:配置分块上传 (Chunker) —— 核心解法

这是解决 413 Request Entity Too Large 的关键。我们不直接往 mybackup 传文件,而是创建一个“中间层”,让 Rclone 自动把大文件切成小块再传。

执行以下命令,创建一个名为 mybackup_final 的分块连接:

Bash

# 创建一个名为 mybackup_final 的配置
# remote=mybackup: 指向刚才创建的基础连接
# chunk_size=50M  强制把文件切成 50MB 一块(绕过 100MB 限制)
rclone config create mybackup_final chunker remote=mybackup: chunk_size=50M

以后我们备份时,只要把目标指向 mybackup_final,Rclone 就会自动帮我们切块上传,并在下载时自动合并,对用户完全透明。


第四步:编写自动备份脚本

这个脚本会完成以下工作:

  1. 打包 /home 目录。

  2. 通过分块模式上传到网盘。

  3. 上传成功后删除本地临时文件。

  4. 自动删除网盘上超过 3 天的旧备份

创建脚本:

Bash

nano /root/autobackup.sh

写入以下内容:

Bash

#!/bin/bash

# ================= 配置区域 =================
# 1. 本地源目录
SOURCE_DIR="/home"
# 2. 目标网盘 (注意:这里要用刚才创建的分块连接 mybackup_final)
REMOTE_NAME="mybackup_final"
# 3. 网盘内的存储路径
REMOTE_DIR="/up/vps_snapshots"
# 4. 备份文件名
BACKUP_FILENAME="home_backup_$(date +%Y%m%d_%H%M%S).tar.gz"
TEMP_FILE="/tmp/$BACKUP_FILENAME"
LOG_FILE="/var/log/auto_backup.log"
# ===========================================

# 日志函数
log_msg() {
    echo "[$(date)] $1" | tee -a "$LOG_FILE"
}

echo "----------------------------------------------------------------" >> "$LOG_FILE"
log_msg "备份任务开始"

# --- 1. 打包 ---
log_msg "正在打包 $SOURCE_DIR ..."
# 排除缓存和垃圾桶
tar -zcf "$TEMP_FILE" \
    --exclude="*/.cache" \
    --exclude="*/.local/share/Trash" \
    --exclude="*.log" \
    "$SOURCE_DIR" >> "$LOG_FILE" 2>&1

if [ $? -eq 0 ]; then
    FILE_SIZE=$(du -h "$TEMP_FILE" | cut -f1)
    log_msg "打包成功,文件大小: $FILE_SIZE"

    # --- 2. 上传 (自动分块) ---
    log_msg "正在上传到 $REMOTE_NAME:$REMOTE_DIR ..."
    
    # --transfers 4 多线程并发上传
    rclone copy "$TEMP_FILE" "$REMOTE_NAME:$REMOTE_DIR" --transfers 4 -P

    if [ $? -eq 0 ]; then
        log_msg "上传成功!"
        
        # --- 3. 清理本地 ---
        rm -f "$TEMP_FILE"
        log_msg "本地临时文件已清理"
        
        # --- 4. 清理旧备份 (保留3天) ---
        log_msg "正在清理 3天前 的旧备份..."
        rclone delete "$REMOTE_NAME:$REMOTE_DIR" --min-age 3d >> "$LOG_FILE" 2>&1
    else
        log_msg "错误:上传失败!"
    fi
else
    log_msg "错误:打包失败!"
fi

log_msg "备份任务结束"
echo "----------------------------------------------------------------" >> "$LOG_FILE"

保存退出后,赋予执行权限:

Bash

chmod +x /root/autobackup.sh

第五步:设置定时任务 (Crontab)

最后一步,让它每天凌晨 3 点自动运行。

  1. 编辑定时任务:

    Bash

    crontab -e
    

    (如果提示 command not found,请先运行 apt install cron nano)

  2. 在文件末尾添加:

    Bash

    0 3 * * * /root/autobackup.sh
    

💡 如何恢复数据?

因为使用了 Chunker 分块技术,在网盘网页端你会看到很多 .rclone_chunk.001 这种切片文件,不能直接下载解压

恢复方法: 必须使用 Rclone 进行下载,它会自动合并。

Bash

# 列出备份文件
rclone ls mybackup_final:/up/vps_snapshots

# 恢复/下载到本地
rclone copy mybackup_final:/up/vps_snapshots/某天的备份.tar.gz /root/

结语

通过引入 Chunker 中间层,我们成功绕过了 WebDAV 网盘的文件大小限制,配合脚本实现了“打包-上传-清理”的全自动化闭环。现在可以安心睡觉了!😴

评论