前言
最近在折腾 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 的一个基础连接。
运行配置向导:
Bash
rclone config操作步骤:
n (新建)
name>
mybackup(起个名字,记住它)Storage> 搜索
webdav,输入对应的数字(通常是 40+)。url> 输入你的 Openlist WebDAV 地址(例如
https://xxxx.com/dav/)。vendor> 选
other(或者对应厂商)。user> 你的账号。
pass> 你的密码(输入时看不见,输完回车)。
一路回车默认,直到按 q 退出。
验证连接:
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 就会自动帮我们切块上传,并在下载时自动合并,对用户完全透明。
第四步:编写自动备份脚本
这个脚本会完成以下工作:
打包
/home目录。通过分块模式上传到网盘。
上传成功后删除本地临时文件。
自动删除网盘上超过 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 点自动运行。
编辑定时任务:
Bash
crontab -e(如果提示 command not found,请先运行
apt install cron nano)在文件末尾添加:
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 网盘的文件大小限制,配合脚本实现了“打包-上传-清理”的全自动化闭环。现在可以安心睡觉了!😴