110 lines
2.7 KiB
Markdown
110 lines
2.7 KiB
Markdown
---
|
||
title: "Ubuntu服务器通过rsync实现日常增量备份"
|
||
type: source
|
||
tags: [rsync, backup, ubuntu, nas, nfs, cron]
|
||
date: 2025-11-11
|
||
source_file: raw/Technical/Home Office/🟠Ubuntu服务器通过rsync实现日常增量备份.md
|
||
---
|
||
|
||
## Summary
|
||
- 核心主题:使用rsync实现NAS到Ubuntu服务器的增量备份
|
||
- 问题域:数据保护、增量同步、自动化备份
|
||
- 方法/机制:rsync + cron定时任务 + NFS挂载
|
||
- 结论/价值:构建工作室级数据保护体系
|
||
|
||
## Key Claims
|
||
- rsync只传输变化的文件,适合增量备份
|
||
- NFS挂载需写入/etc/fstab实现永久挂载
|
||
- _netdev参数防止开机网络未就绪时卡死
|
||
- 备份脚本需检查挂载点防止数据写错位置
|
||
|
||
## Key Concepts
|
||
- [[增量备份]]:rsync只同步变化部分
|
||
- [[NFS挂载]]:网络文件系统永久挂载
|
||
- [[定时任务]]:cron自动化执行
|
||
- [[数据保护]]:备份策略
|
||
|
||
## 备份目标
|
||
- /var/lib/docker/volumes/(Docker卷数据)
|
||
- /etc/docker/(Docker配置)
|
||
- /home/shenwei/Docker/(自定义Docker配置)
|
||
|
||
## 备份脚本
|
||
```bash
|
||
#!/bin/bash
|
||
LOCKFILE="/tmp/rsync_backup.lock"
|
||
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
|
||
echo "备份任务已在运行中,跳过本次执行。"
|
||
exit
|
||
fi
|
||
echo $$ > ${LOCKFILE}
|
||
trap "rm -f ${LOCKFILE}" EXIT
|
||
|
||
MOUNT_POINT="/mnt/nas_backup"
|
||
DATE=$(date +%Y-%m-%d)
|
||
DEST="$MOUNT_POINT/docker_backups/$DATE"
|
||
LOG="/var/log/rsync_backup.log"
|
||
|
||
if ! mountpoint -q "$MOUNT_POINT"; then
|
||
echo "$(date): [错误] NAS 未挂载" >> "$LOG"
|
||
exit 1
|
||
fi
|
||
|
||
mkdir -p "$DEST"
|
||
|
||
rsync -azR --delete \
|
||
--exclude="venv/" \
|
||
--exclude=".venv/" \
|
||
--exclude="**/__pycache__/" \
|
||
--exclude=".git/" \
|
||
/var/lib/docker/volumes/ \
|
||
/etc/docker/ \
|
||
/home/shenwei/Docker/ \
|
||
"$DEST/" >> "$LOG" 2>&1
|
||
```
|
||
|
||
## NFS永久挂载
|
||
在/etc/fstab添加:
|
||
```
|
||
192.168.3.17:/volume2/backup /mnt/nas_backup nfs defaults,timeo=900,retrans=5,_netdev 0 0
|
||
```
|
||
|
||
参数说明:
|
||
- timeo=900:90秒超时
|
||
- retrans=5:重试5次
|
||
- _netdev:等待网络就绪
|
||
|
||
## 定时任务
|
||
```bash
|
||
sudo crontab -e
|
||
# 添加行:
|
||
0 3 * * * /usr/local/bin/rsync_backup.sh
|
||
```
|
||
|
||
每天凌晨3点执行备份。
|
||
|
||
## 停止rsync进程
|
||
```bash
|
||
# 优雅停止
|
||
sudo killall rsync
|
||
|
||
# 强制停止
|
||
sudo killall -9 rsync
|
||
|
||
# 停止备份脚本
|
||
sudo pkill -f rsync_backup.sh
|
||
```
|
||
|
||
## 恢复数据
|
||
```bash
|
||
# 单文件丢失:从NAS备份目录恢复
|
||
cp /mnt/nas_backup/.../file /
|
||
|
||
# 系统崩溃:反向rsync
|
||
sudo rsync -aAXz /mnt/nas_backup/daily_sync/ /
|
||
```
|
||
|
||
## 注意事项
|
||
- 数据库建议先mysqldump再rsync
|
||
- 返回码23/24表示部分文件权限问题,可接受
|
||
- 先测试手动运行:`sudo nohup /usr/local/bin/rsync_backup.sh > /dev/null 2>&1 &` |