收起左侧

整活 自动备份系统盘脚本

3
回复
209
查看
[ 复制链接 ]

2

主题

1

回帖

0

牛值

江湖小虾

2025-6-17 15:57:13 显示全部楼层 阅读模式

根据「折腾攻略一」系统盘备份与迁移 - 攻略分享 飞牛私有云论坛 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单位)

重要提示

  1. 确认 SOURCE_DISK是您的系统盘(使用 lsblk命令查看)
  2. 确保备份目录有足够空间(至少是系统盘大小的2倍)
  3. 首次运行建议手动执行测试

🔄 恢复指南

恢复步骤:

  1. 进入备份目录(示例):
cd "/vol4/1000/备份/系统盘备份/backup_2024-W25"
  1. 运行恢复脚本:
sudo ./restore_backup.sh /dev/sdc
  1. 输入 YES确认恢复:
ℹ️ 开始恢复备份...
目标磁盘: /dev/sdc
警告: 这将完全覆盖目标磁盘的所有数据!
确认恢复? (输入YES继续): YES
  1. 等待完成并重启系统

恢复注意事项:

  • 恢复会完全覆盖目标磁盘
  • 确保目标磁盘容量 ≥ 原始系统盘
  • 恢复过程不可中断
  • 建议在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

常见原因:

  • 磁盘空间不足
  • 备份目录权限问题
  • 系统盘被占用

💡 使用建议

  1. 最佳实践

    • 首次使用前手动运行测试
    • 定期验证备份可恢复性
    • 重要备份建议异地存储
  2. 空间估算(参考):

    系统盘大小 单备份大小 4备份所需空间
    128GB 50-70GB 200-280GB
    256GB 100-150GB 400-600GB
  3. 监控建议

    • 定期检查 /var/log/backup.log
    • 设置磁盘空间报警
    • 使用 df -h监控备份目录空间

欢迎讨论和优化建议!如果有其他需求或遇到问题,请在评论区留言。


## 📎 截图示例

### 备份目录结构
![备份目录结构](https://example.com/backup_dir.png)

### 恢复脚本运行
![恢复过程](https://example.com/restore.png)

---

**最后更新:2024年6月17日**  
**适用版本:飞牛OS 1.0+**

发帖建议

  1. 标题建议:​"飞牛OS系统盘自动备份方案(奇数周/分卷压缩/一键恢复)"

  2. 标签建议:​备份方案 系统维护 自动化脚本 数据安全

  3. 发帖提示

    • 脚本中的路径和设备名称请根据实际情况修改
    • 首次使用建议在测试环境验证
    • 重要数据备份建议采用"3-2-1"原则(3份备份,2种介质,1份异地)
    • 欢迎坛友反馈使用体验和改进建议

希望这个方案能帮助到更多飞牛OS用户!如果有任何问题,欢迎在帖下讨论交流。

收藏
送赞 1
分享

1

主题

4

回帖

0

牛值

江湖小虾

2025-6-20 14:02:44 显示全部楼层

值得收藏

1

主题

7

回帖

0

牛值

江湖小虾

2025-6-20 16:56:58 显示全部楼层

还是希望官方能开发系统备份还原功能,能够1比1复制,到时候主系统盘挂了,直接把备份盘放在系统盘盘位上,哪怕牺牲一个盘位我都愿意

13

主题

147

回帖

0

牛值

初出茅庐

2025-7-1 22:27:30 显示全部楼层

还是希望官方能开发系统备份还原功能,主要是系统挂了后,新安装系统后能快速恢复原先的设置和数据,包含相册AI识别、电影刮削等。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则