根据「折腾攻略一」系统盘备份与迁移 - 攻略分享 飞牛私有云论坛 fnOS然后找deepseek写的脚本
# 飞牛OS系统盘自动备份方案(奇数周分卷压缩版)
> 本方案提供一种高效可靠的系统盘备份方法,适用于飞牛OS系统盘(如`/dev/sdc`)。主要特点:
> - 🗓️ **奇数周自动备份**:仅在每年奇数周执行(1、3、5...周)
> - 📦 **分卷压缩**:将备份分割为500MB压缩包,便于存储和传输
> - 🔄 **智能保留**:自动保留最近4个备份,节省存储空间
> - 🔄 **一键恢复**:自动生成恢复脚本,简化恢复流程
> - 📝 **详细日志**:完整记录备份过程,便于排查问题
---
## 📋 方案特点
1. **备份策略**
- 每周一凌晨3点检查周数
- 仅在奇数周执行备份
- 每个备份独立存储在`backup_年份-W周数`目录
- 保留最近4个备份(约8周数据)
2. **分卷压缩**
- 每个分卷严格限制为500MB
- 文件名格式:`system_backup_2024-W25.part.gz.00`, `.01`, `.02`...
- 使用gzip快速压缩(平衡速度与压缩率)
3. **恢复便利**
- 每个备份目录自动生成`restore_backup.sh`恢复脚本
- 恢复命令:`sudo ./restore_backup.sh /dev/sdc`
- 内置安全确认防止误操作
4. **空间管理**
- 自动清理旧备份
- 每次备份后显示磁盘使用情况
- 日志记录在`/var/log/backup.log`
---
## 🛠️ 安装步骤
### 1. 创建备份脚本
```bash
sudo nano /usr/local/bin/fn_backup
粘贴以下内容:
#!/bin/bash
# 飞牛OS分卷备份脚本(奇数周备份)
# 每周一凌晨3点检查,奇数周执行备份
# 检查root权限
if [ "$EUID" -ne 0 ]; then
echo "❌ $(date +'%Y-%m-%d %T') - 请使用sudo运行此脚本" | tee -a /var/log/backup.log
exit 1
fi
# ===== 用户配置 =====
SOURCE_DISK="/dev/sdc" # 源系统盘
BACKUP_ROOT="/vol4/1000/备份/系统盘备份" # 备份存储目录
RETENTION_COUNT=4 # 保留最近4个备份
SPLIT_SIZE="500M" # 每个分卷大小500MB
# ===== 配置结束 =====
# 创建备份目录
mkdir -p "$BACKUP_ROOT" || {
echo "❌ $(date +'%Y-%m-%d %T') - 无法创建备份目录: $BACKUP_ROOT" | tee -a /var/log/backup.log
exit 1
}
# 获取当前年份和周数
current_year=$(date +%Y)
current_week=$(date +%V)
# 判断是否为奇数周(1、3、5...周)
if [ $((current_week % 2)) -eq 0 ]; then
echo "ℹ️ $(date +'%Y-%m-%d %T') - 跳过本周备份(偶数周),下次备份将在奇数周执行" | tee -a /var/log/backup.log
exit 0
fi
# 创建本周备份目录
backup_dir="${BACKUP_ROOT}/backup_${current_year}-W${current_week}"
mkdir -p "$backup_dir" || {
echo "❌ $(date +'%Y-%m-%d %T') - 无法创建备份子目录: $backup_dir" | tee -a /var/log/backup.log
exit 1
}
# 备份文件前缀
backup_prefix="${backup_dir}/system_backup_${current_year}-W${current_week}"
echo "ℹ️ $(date +'%Y-%m-%d %T') - 开始奇数周分卷备份(每卷${SPLIT_SIZE})..." | tee -a /var/log/backup.log
echo "源盘: $SOURCE_DISK" | tee -a /var/log/backup.log
echo "目标目录: $backup_dir" | tee -a /var/log/backup.log
echo "文件前缀: $backup_prefix" | tee -a /var/log/backup.log
echo "----------------------------------" | tee -a /var/log/backup.log
# 备份执行
start_time=$(date +%s)
# 使用dd+split创建分卷压缩备份
dd if="$SOURCE_DISK" bs=4M status=progress | \
gzip --fast | \
split -d -b "$SPLIT_SIZE" - "${backup_prefix}.part.gz."
# 检查备份结果
backup_result=$?
end_time=$(date +%s)
duration=$((end_time - start_time))
if [ $backup_result -ne 0 ]; then
echo "❌ $(date +'%Y-%m-%d %T') - 备份失败! 错误码: $backup_result" | tee -a /var/log/backup.log
rm -rf "$backup_dir" 2>/dev/null
exit 1
fi
# 创建恢复脚本
cat > "${backup_dir}/restore_backup.sh" <<EOF
#!/bin/bash
# 飞牛OS备份恢复脚本
# 用法: sudo ./restore_backup.sh /dev/sdX
if [ \$# -ne 1 ]; then
echo "❌ 用法: \$0 目标磁盘 (例如: /dev/sdc)"
exit 1
fi
if [ "\$EUID" -ne 0 ]; then
echo "❌ 请使用sudo运行此脚本"
exit 1
fi
echo "ℹ️ 开始恢复备份..."
echo "目标磁盘: \$1"
echo -e "\033[31m警告: 这将完全覆盖目标磁盘的所有数据!\033[0m"
read -p "确认恢复? (输入YES继续): " confirm
if [ "\$confirm" != "YES" ]; then
echo "恢复已取消"
exit 0
fi
# 合并并解压到目标磁盘
cat ${backup_prefix}.part.gz.* | gunzip | dd of=\$1 bs=4M status=progress
echo "✅ 恢复完成! 请重启系统"
EOF
chmod +x "${backup_dir}/restore_backup.sh"
# 计算备份信息
file_count=$(ls -1 "${backup_prefix}".part.gz.* | wc -l)
total_size=$(du -sh "$backup_dir" | cut -f1)
echo "✅ $(date +'%Y-%m-%d %T') - 备份完成! 耗时: ${duration}秒" | tee -a /var/log/backup.log
echo "📦 分卷数量: $file_count" | tee -a /var/log/backup.log
echo "📦 总大小: $total_size" | tee -a /var/log/backup.log
echo "💡 恢复脚本: ${backup_dir}/restore_backup.sh" | tee -a /var/log/backup.log
# 清理旧备份(保留最新4个)
echo "🧹 清理旧备份,保留最新的${RETENTION_COUNT}个备份..." | tee -a /var/log/backup.log
cd "$BACKUP_ROOT" || exit
ls -td backup_* | tail -n +$((RETENTION_COUNT + 1)) | xargs -d '\n' rm -rf -v | tee -a /var/log/backup.log
# 磁盘空间报告
echo "💾 当前备份列表:" | tee -a /var/log/backup.log
ls -lhd "$BACKUP_ROOT"/backup_* | tee -a /var/log/backup.log
echo "💾 磁盘使用情况:" | tee -a /var/log/backup.log
df -h "$BACKUP_ROOT" | tee -a /var/log/backup.log
echo "==================================" | tee -a /var/log/backup.log
2. 设置执行权限
sudo chmod +x /usr/local/bin/fn_backup
3. 添加定时任务
sudo crontab -e
添加以下行:
# 每周一凌晨3点运行备份脚本
0 3 * * 1 /usr/local/bin/fn_backup
⚙️ 配置说明
脚本顶部可修改参数:
SOURCE_DISK="/dev/sdc" # 系统盘设备(根据实际情况修改)
BACKUP_ROOT="/vol4/1000/备份/系统盘备份" # 备份存储路径
RETENTION_COUNT=4 # 保留备份数量(建议4-8个)
SPLIT_SIZE="500M" # 分卷大小(支持K/M/G单位)
重要提示:
- 确认
SOURCE_DISK
是您的系统盘(使用 lsblk
命令查看)
- 确保备份目录有足够空间(至少是系统盘大小的2倍)
- 首次运行建议手动执行测试
🔄 恢复指南
恢复步骤:
- 进入备份目录(示例):
cd "/vol4/1000/备份/系统盘备份/backup_2024-W25"
- 运行恢复脚本:
sudo ./restore_backup.sh /dev/sdc
- 输入
YES
确认恢复:
ℹ️ 开始恢复备份...
目标磁盘: /dev/sdc
警告: 这将完全覆盖目标磁盘的所有数据!
确认恢复? (输入YES继续): YES
- 等待完成并重启系统
恢复注意事项:
- 恢复会完全覆盖目标磁盘
- 确保目标磁盘容量 ≥ 原始系统盘
- 恢复过程不可中断
- 建议在PE环境或备用系统执行
❓ 常见问题
Q1: 如何确认当前是奇数周?
# 查看当前周数(奇数周为1、3、5...)
date +%V
Q2: 备份目录结构是怎样的?
/vol4/1000/备份/系统盘备份/
**── backup_2024-W25/ # 第25周备份
** **── restore_backup.sh # 恢复脚本
** **── system_backup_2024-W25.part.gz.00
** **── system_backup_2024-W25.part.gz.01
** **── ...
**── backup_2024-W27/ # 第27周备份
**── ... # 保留最近4个
Q3: 如何手动清理旧备份?
# 保留最新2个备份
cd /vol4/1000/备份/系统盘备份
ls -td backup_* | tail -n +3 | sudo xargs rm -rf
Q4: 备份失败怎么办?
检查日志:
tail -30 /var/log/backup.log
常见原因:
💡 使用建议
-
最佳实践:
- 首次使用前手动运行测试
- 定期验证备份可恢复性
- 重要备份建议异地存储
-
空间估算(参考):
系统盘大小 |
单备份大小 |
4备份所需空间 |
128GB |
50-70GB |
200-280GB |
256GB |
100-150GB |
400-600GB |
-
监控建议:
- 定期检查
/var/log/backup.log
- 设置磁盘空间报警
- 使用
df -h
监控备份目录空间
欢迎讨论和优化建议!如果有其他需求或遇到问题,请在评论区留言。
## 📎 截图示例
### 备份目录结构

### 恢复脚本运行

---
**最后更新:2024年6月17日**
**适用版本:飞牛OS 1.0+**
发帖建议
-
标题建议:"飞牛OS系统盘自动备份方案(奇数周/分卷压缩/一键恢复)"
-
标签建议:备份方案
系统维护
自动化脚本
数据安全
-
发帖提示:
- 脚本中的路径和设备名称请根据实际情况修改
- 首次使用建议在测试环境验证
- 重要数据备份建议采用"3-2-1"原则(3份备份,2种介质,1份异地)
- 欢迎坛友反馈使用体验和改进建议
希望这个方案能帮助到更多飞牛OS用户!如果有任何问题,欢迎在帖下讨论交流。