在 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

最后修改:2026 年 01 月 16 日
如果觉得我的文章对你有用,请随意赞赏