--- title: "Ubuntu服务器通过rsync实现日常增量备份" type: source tags: [ubuntu, rsync, backup, nas, nfs, fstab] date: 2026-04-15 --- ## Source File - [[raw/Home Office/Ubuntu服务器通过rsync实现日常增量备份.md]] ## Summary - 核心主题:Ubuntu 服务器通过 rsync 实现对 NAS 的每日增量备份自动化 - 问题域:已有机房镜像备份(Clonezilla),需补充实时增量数据保护方案 - 方法/机制:rsync -azR --delete 差异同步,lockfile 防重入,crontab 凌晨自动执行,/etc/fstab 实现 NFS 永久挂载 - 结论/价值:构建"时间点恢复"能力,NAS 掉线时自动中止备份防止本地硬盘爆满 ## Key Claims - rsync 在备份正在写入的二进制文件(如 MySQL)时可能导致恢复后无法启动,应先用 mysqldump 导出 SQL 再同步 - rsync 返回码 23/24 在备份运行中系统时属于正常(部分文件权限问题或源文件消失),重点检查数据是否大部分已同步 - /etc/fstab 中 _netdev 参数确保网络设备就绪后再执行挂载,防止开机因网络未就绪而挂载失败 - lockfile 机制防止 rsync_backup.sh 重入,脚本开头检查 lockfile 存在则跳过本次执行 ## Key Quotes > "rsync -azR --delete — -a 归档模式保留权限属性,-z 压缩传输,-R 相对路径,--delete 删除目标端多余文件" — rsync 核心参数解析 > "0 3 * * * /usr/local/bin/rsync_backup.sh — 每天凌晨 3 点业务低峰期执行备份" — Crontab 时间配置 > "192.168.3.17:/volume2/backup /mnt/nas_backup nfs defaults,timeo=900,retrans=5,_netdev 0 0" — NFS /etc/fstab 永久挂载条目 > "timeo=900(90秒超时),retrans=5(重连5次),_netdev(等待网络就绪)" — NFS 挂载参数详解 ## Key Concepts - [[rsync]]:远程增量同步工具,通过 Delta-transfer 算法只传输变化部分 - [[增量备份]]:仅备份自上次备份以来变化的文件,相比全量备份节省存储和带宽 - [[NFS永久挂载]]:通过 /etc/fstab 将 NFS 挂载配置为系统启动时自动执行 - [[lockfile]]:防止脚本重入的简单机制,PID 文件 + kill -0 检测进程存活 - [[Crontab]]:Linux 定时任务调度器,支持分钟级精确控制 - [[Clonezilla]]:磁盘镜像备份工具,与 rsync 形成"整机镜像 + 增量数据"二级保护 - [[mysqldump]]:MySQL/MariaDB 逻辑备份工具,在 rsync 之前先导出 SQL 文件保证数据库一致性 ## Key Entities - [[Synology NAS]]:备份目标端(192.168.3.17:/volume2/backup) - [[Ubuntu服务器]]:备份源端,运行 rsync_backup.sh - [[Docker]]:数据来源之一(/var/lib/docker/volumes/、/etc/docker/、/home/shenwei/Docker/) ## Connections - [[Ubuntu服务器通过rsync实现日常增量备份]] → backups_to → [[Synology NAS]] - [[Ubuntu服务器通过rsync实现日常增量备份]] ← runs_on ← [[Ubuntu服务器]] - [[Docker]] ← source_data ← [[Ubuntu服务器通过rsync实现日常增量备份]] ## 备份策略矩阵 | 备份类型 | 工具 | 频率 | 覆盖范围 | 恢复时间 | |---------|------|------|---------|---------| | 整机镜像 | Clonezilla | 按需/周 | 全盘扇区级 | 长(全盘还原) | | 增量数据 | rsync | 每日凌晨3点 | 变化文件 | 短(选择性还原) | ## 关键脚本:rsync_backup.sh 防重入逻辑 ```bash LOCKFILE="/tmp/rsync_backup.lock" if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then echo "备份任务已在运行中,跳过本次执行。" exit fi echo $$ > ${LOCKFILE} trap "rm -f ${LOCKFILE}" EXIT ``` ## NFS 永久挂载验证流程 ```bash # 1. 卸载当前挂载 sudo umount /mnt/nas_backup # 2. 模拟开机自动挂载 sudo mount -a # 3. 验证挂载成功 df -h | grep nas_backup ``` ## Contradictions ## 常见问题排查 | 问题 | 原因 | 解决方案 | |------|------|---------| | 重启后挂载失效 | nfs-common 启动慢于 mount -a | systemctl enable remote-fs.target | | rsync 返回码 20 | 进程被手动中断(SIGINT/SIGTERM) | 使用 nohup 或 screen 后台运行 | | 备份写满本地硬盘 | NAS 掉线时挂载点变成普通目录 | 脚本开头加 mountpoint -q 检查 |