VPS数据备份至关重要,但手动备份不可靠——忙碌时容易忘记或跳过。本文将演示如何使用 rsync 配合 cron 创建 每日全自动备份,无需任何人工干预。
rsync(远程同步)是Linux内置的命令行工具,支持本地和通过SSH的文件同步。用于备份的主要优势:
# 检查rsync是否已安装
rsync --version
# 在Ubuntu/Debian上安装
sudo apt update && sudo apt install rsync -y
# 在CentOS/AlmaLinux上安装
sudo yum install rsync -y
rsync [选项] 源目录/ 目标目录/
| 选项 | 说明 |
|---|---|
-a | 归档模式 — 保留权限、所有权、符号链接、时间戳 |
-v | 详细模式 — 显示传输的文件列表 |
-z | 传输时压缩数据 |
--delete | 删除目标中源没有的文件 |
--exclude | 排除匹配的文件或目录 |
--dry-run | 试运行,不实际传输文件 |
-P | 显示进度条 |
# 备份/var/www到/backup/www
rsync -avz /var/www/ /backup/www/
# 排除临时文件和缓存
rsync -avz --exclude='*.tmp' --exclude='cache/' /var/www/ /backup/www/
/var/www/(有斜杠)= 复制目录内容;/var/www(无斜杠)= 复制整个目录。结果截然不同。
# 通过SSH rsync到远程服务器
rsync -avz -e ssh /var/www/ user@remote-server:/backup/www/
# 指定非标准SSH端口
rsync -avz -e "ssh -p 2222" /var/www/ user@remote-server:/backup/www/
# 使用指定的SSH密钥文件
rsync -avz -e "ssh -i /root/.ssh/backup_key" /var/www/ user@remote-server:/backup/www/
cron无法交互式输入密码,必须使用SSH密钥认证。
# 1. 生成SSH密钥对(不设置密码短语,供cron使用)
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
# 2. 将公钥复制到远程服务器
ssh-copy-id -i /root/.ssh/backup_key.pub user@remote-server
# 3. 测试无密码连接
ssh -i /root/.ssh/backup_key user@remote-server "echo 'SSH key OK'"
#!/bin/bash
# /root/scripts/backup.sh
BACKUP_SOURCE="/var/www /etc /home"
BACKUP_DEST="backup-user@backup-server:/backups/$(hostname)"
SSH_KEY="/root/.ssh/backup_key"
LOG_FILE="/var/log/backup.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== 备份开始 ==="
ERRORS=0
for SRC in $BACKUP_SOURCE; do
log "正在备份 $SRC..."
rsync -az \
--delete \
--exclude='*.tmp' \
--exclude='cache/' \
-e "ssh -i $SSH_KEY -o StrictHostKeyChecking=no" \
"$SRC/" \
"$BACKUP_DEST${SRC}/"
if [ $? -eq 0 ]; then
log "成功: $SRC"
else
log "错误: $SRC 备份失败"
ERRORS=$((ERRORS + 1))
fi
done
log "=== 备份完成(错误: $ERRORS)==="
exit $ERRORS
chmod +x /root/scripts/backup.sh
# 编辑crontab
crontab -e
# 每天凌晨2点运行备份
0 2 * * * /root/scripts/backup.sh >> /var/log/backup.log 2>&1
| 字段 | 值 | 含义 |
|---|---|---|
| 分钟 | 0 | 第0分钟 |
| 小时 | 2 | 凌晨2点 |
| 日期 | * | 每天 |
| 月份 | * | 每月 |
| 星期 | * | 每天 |
#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_BASE="/backup"
BACKUP_DIR="$BACKUP_BASE/$DATE"
mkdir -p "$BACKUP_DIR"
rsync -az /var/www/ "$BACKUP_DIR/www/"
rsync -az /etc/ "$BACKUP_DIR/etc/"
# 删除30天前的备份
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
# 查看今日日志
tail -50 /var/log/backup.log
# 查找错误
grep "ERROR\|错误" /var/log/backup.log | tail -20
# 测试恢复
rsync -avz backup-user@backup-server:/backups/hostname/var/www/index.html /tmp/test/
diff /var/www/index.html /tmp/test/index.html
使用 rsync + cron 自动化VPS备份简单可靠、成本低廉。步骤总结:
寻找可靠的VPS主机?AsiaGB VPS 提供泰国和新加坡数据中心,SSD存储,99%正常运行时间,专业技术支持随时待命。