在 OpenWrt 上实现自动备份配置、通过 Rsync 同步到 NAS 并执行旧备份清理。
准备工作
安装必要的软件,并且配置免密登录 NAS。默认 ssh 使用 dropbear,存在一些兼容性问题,安装 openssh-client 替代。
opkg update
opkg install rsync openssh-client openssh-client-utils使用 ssh-keygen 创建密钥,并将公钥添加到 NAS 上的 ~/.ssh/authorized_keys 中。
ssh-keygen -t rsa -b 2048 -f /root/.ssh/id_rsa -N ""OpenWrt 不支持 ssh-copy-id,因此必须手动将公钥复制添加到 NAS。
编写备份脚本
创建一个脚本文件,例如 /root/backup.sh,添加以下内容,根据事情情况修改部分配置内容。
执行此脚本会进行本地备份到一个临时文件,然后通过 Rsync 将备份文件发送到远程服务器,
并对远程服务器上的备份文件进行清理,删除超过一个月的备份文件。最后删除本地临时备份文件。
#!/bin/sh
SSH_USER="admin"
SSH_IP="192.168.1.100"
SSH_DIR="/volume1/backups/openwrt"
SSH_PORT="22"
SSH_KEY="/root/.ssh/id_rsa"
LOCAL_TMP="/tmp"
HOSTNAME=$(cat /proc/sys/kernel/hostname)
DATE=$(date +%Y-%m-%d)
BACKUP_FILE="backup-${HOSTNAME}-${DATE}.tar.gz"
echo "[$(date)] Starting backup task..."
echo "Creating local backup: ${LOCAL_TMP}/${BACKUP_FILE}"
sysupgrade -b "${LOCAL_TMP}/${BACKUP_FILE}"
if [ $? -eq 0 ]; then
echo "Backup Sucessful!"
else
echo "Backup Failure!"
exit 1
fi
echo "Sending to (${SSH_IP})..."
rsync -avz --timeout=60 -e "ssh -p ${SSH_PORT} -i ${SSH_KEY} -o StrictHostKeyChecking=no" \
"${LOCAL_TMP}/${BACKUP_FILE}" \
"${SSH_USER}@${SSH_IP}:${SSH_DIR}/"
if [ $? -eq 0 ]; then
echo "Rsync Sucessful!"
else
echo "Error:Rsync error!Please check your network/ssh configuration"
rm -f "${LOCAL_TMP}/${BACKUP_FILE}"
exit 1
fi
echo "Cleanup old backup files..."
ssh -p ${SSH_PORT} -i ${SSH_KEY} "${SSH_USER}@${SSH_IP}" \
"find ${SSH_DIR} -name 'backup-${HOSTNAME}-*.tar.gz' -mtime +30 -delete"
echo "Cleanup temp files..."
rm -f "${LOCAL_TMP}/${BACKUP_FILE}"
echo "[$(date)] Complete backup task"给脚本添加执行权限,测试运行。
chmod +x /root/backup.sh
/root/backup.sh配置定时任务
可以在 LuCI 菜单 系统 计划任务中添加,或者运行 crontab -e 在命令行编辑,添加以下内容,在每天 3:00 执行备份脚本。
0 3 * * * /root/backup.sh > /dev/null 2>&1如果没有生效的话,重启 Cron 服务 /etc/init.d/cron restart。